문제&해결

문제&해결

Builder 패턴 객체 생성시 필드 초기값 무시되는 문제

문제 상황 Lombok의 @Builder 패턴을 사용하여 Member 클래스의 인스턴스를 생성할때, 특정 필드에 대해 명시적으로 값이 설정되지 않으면 null 값으로 초기화된다. @NoArgsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity @Table(name = "member") @Where(clause = "is_deleted=false") @AttributeOverride(name = "id", column = @Column(name = "member_id")) public class Member extends BaseEntity { @Enumerated(EnumType.STRING) @Column(length = 50, nullable =..

문제&해결

[Test] 데이터 의존성을 줄인 통합테스트 코드 작성 (MockUser, Spring Security)

문제 문제 상황 데이터 의존성 테스트 시 데이터베이스의 데이터 상태에 따라 테스트 통과 여부가 달라진다. 즉, 테스트 결과가 데이터베이스의 테스트 데이터에 의존적이다. Spring Security 보안 컨텍스트 애플리케이션에서 Spring Security를 사용할 경우 테스트시 보안 컨텍스트를 설정하고 jwt 토큰에 넣을 테스트 사용자가 데이터베이스에 존재해야한다. CustomMockUser @Retention(RetentionPolicy.RUNTIME) @WithSecurityContext(factory = WithMockCustomUserSecurityContextFactory.class) public @interface WithMockCustomUser { String username() defau..

문제&해결

@Value가 단위 테스트에서 동작하지 않는 문제 (생성자 주입, @WebMvcTest)

문제 문제 상황 @Value 어노테이션을 사용하여 yml 파일의 프로퍼티 값을 secretKey 필드에 주입하려고 한다. 서버 실행시 잘 작동했지만, 테스트 수행시 secretKey 필드가 초기화되지 않았다는 에러가 발생한다. Request processing failed; nested exception is kotlin.UninitializedPropertyAccessException: lateinit property secretKey has not been initialized 문제 분석 @Value는 Spring이 해당 클래스의 인스턴스를 생성하고 관리할때, 프로퍼티 파일(yml)에 정의된 값을 자동으로 주입한다. 하지만 @WebMvcTest와 같은 단위 테스트는 특정 Controller만 로드하기..

문제&해결

도커 컨테이너의 ip 주소는 왜 127.0.0.1(localhost)가 아닐까?

포트 충돌 문제를 해결하면서 나를 혼란스럽게 만든 문제였다. https://shout-to-my-mae.tistory.com/401 로컬, docker 컨테이너 포트 충돌 : 포트 관리 중요성 (mysql) 문제 상황 로컬에서 mysql이 실행중이고, 동일한 포트(3306)을 사용하여 Docker의 mysql 컨테이너를 시작시켰다. mysql 컨테이너와의 연결이 실패하며 에러가 발생했다. 에러 메세지 [28000][1045] Access denie shout-to-my-mae.tistory.com 도커 컨테이너는 로컬 환경에서 띄웠으나 도커의 ip주소는 127.0.0.1이 아니어서 연결 에러가 발생했을때 헷갈렸다. 도커의 ip주소는 왜 127.0.0.1 (localhost)이 아닐까? - 개인 pc에서 ..

문제&해결

로컬, docker 컨테이너 포트 충돌 : 포트 관리 중요성 (mysql)

문제 상황 로컬에서 mysql이 실행중이고, 동일한 포트(3306)을 사용하여 Docker의 mysql 컨테이너를 시작시켰다. mysql 컨테이너와의 연결이 실패하며 에러가 발생했다. 에러 메세지 [28000][1045] Access denied for user '유저명'@'localhost' (using password: YES) 문제 분석 에러 메세지는 올바른 사용자 인증 정보를 주지 못한다고 나와있다. 하지만 컨테이너에 입력한 유저와 비밀번호 모두 정상적으로 입력했다. 연결에서 문제가 발생한 것으로 유추해볼 수 있다. 문제 원인 포트 충돌 : 로컬 Mysql 서버와 컨테이너 내의 Mysql 서버가 동일한 포트(3306)를 사용하려고 해서 발생한다. 한 포트는 하나의 서비스만 사용할 수 있다. 당연하..

문제&해결

웹소켓 취약점 해결 : 인증 도입 (STOMP, Jwt, Spring Security)

최근에 보완해서 글을 올렸어요~ 최근 글을 보시면 문제 해결이 더 빠를거에요!https://shout-to-my-mae.tistory.com/430 WebSocket에 JWT 인증 적용하기: 실시간 채팅 서비스 개발 경험담 🚀💬서론프로젝트에서 실시간 채팅 기능을 구현하면서 WebSocket을 사용시 JWT를 인증을 처리하는 방법을 작성해보았습니다.혹시 글을 읽고 해결이 안되시는 분들은 댓글로 남겨주시면 도와드릴게요 !shout-to-my-mae.tistory.com  웹소켓을 사용할 때 요청을 보내는 사람의 인증을 처리하는 방법은 여러 가지가 있다.웹소켓은 HTTP 프로토콜을 업그레이드하여 연결을 시작하기 때문에, 연결 초기 단계에서 인증을 수행할 수 있는 방법을 활용할 수 있다. 1. 초기 HTTP..

문제&해결

도커 volume 설정 + 환경 변수를 사용하여 H2 DB Url을 동적으로 설정하기 (로컬 / Docker 환경)

문제를 해결하면서 차근차근 도커 볼륨 설정을 해보자. docker volume이란? 데이터가 컨테이너 수명 주기 이후에도 지속될 수 있도록 보장해주는 솔루션이다. 컨테이너가 재시작해도 h2 데이터베이스의 데이터가 유지될 수 있도록 컨테이너 내부에서 외부에 존재하는 db 데이터를 참조할 수 있다. # url: jdbc:h2:mem:mydb # 인메모리 url: jdbc:h2:file:./data/mydb # 파일 기반 현재 h2 db 설정은 인메모리(in-memory)에서 file 기반으로 바꾸어서 데이터가 file에 계속 유지될 수 있도록 해뒀다. (도커에서 띄워도 데이터가 파일에 계속 기록되도록 하기 위함이다) 문제 상황 설정 파일인 application-local.yml을 로컬 환경과 도커 환경에서 ..

문제&해결

[스프링 시큐리티] Spring Security의 Filter에서 의존성 전달받기 (빈 주입)

배경 - 인증을 위해 JWT를 사용하고 있다. JWT의 Claim을 통해 사용자 정보를 가져온다. - User 엔티티는 AbstractJpaEntity로부터 상속받는다. id를 이용해 바로 객체를 생성할 수 없다. - Java 17, Spring 3.0으로 최신 개발환경이다. 기존 코드(Spring Security Filter 일부분) Long id = decodedJWT.getClaim("id").asLong(); String role = decodedJWT.getClaim("role").asString(); MemberRole roleEnum = MemberRole.valueOf(role); Member member = Member.builder().id(id).role(roleEnum).build(..

mint*
'문제&해결' 카테고리의 글 목록 (2 Page)