문제&해결

문제&해결

[Test] @Mock, @InjectMocks 동작 원리 및 주의 사항

@Mock과 @InjectMocks @Mock Mock 객체(가짜 객체)를 생성한다. @InjectMocks Mock 객체를 해당 필드에 주입한다. @Mock 어노테이션이 붙은 필드와 일치하는 생성자를 찾아 객체를 자동으로 생성해준다. @InjectMocks 동작 원리 @Mock private MusicRepository musicRepository; @InjectMocks private MusicService musicService; @InjectMocks는 테스트 대상 클래스의 인스턴스를 생성하고, @Mock 필드를 생성자나 setter 메서드를 통해 주입한다. musicRepository라는 mock 객체를 musicService 생성자에 주입한다. 추가 매개변수가 있는 생성자 하지만 만약 @Inj..

문제&해결

브라우저 보안 메커니즘 : CORS 정책의 한계

CORS(Cross-Origin Resource Sharing) 교차 출처 리소스 공유라는 뜻이다. 한 출처에 있는 자원에서 다른 출처에 있는 자원에 접근하도록 한다. 출처(Origin) 동일 출처란 프로토콜 + host + port가 같은 것이다. path가 다른 것은 상관이 없다. 동일 출처 http://m1.com:80 http://m1.com/login http://m1.com 모두 같은 출처이다. 다른 출처 기준 : http://m1.com 프로토콜이 다르다 : https://m1.com host가 다르다 : http://www.m1.com 포트가 다르다 : http://m1.com:8080 다른 출처 요청의 위험성 , , 등이 웹에 등장하면서, 페이지 로딩 이후에 다른 출처로부터의 요청을 가져..

문제&해결

[Test] 비즈니스 로직 정확도 향상 전략 및 공통 테스트 유틸리티 클래스 활용

문제 문제 상황 @BeforeEach로 테스트 환경을 설정하는 메서드가 비즈니스 로직을 제대로 반영하지 못하는 문제가 발생한다. 예를 들어 회의 생성 로직에서는 단순히 회의 엔티티를 생성하는 것뿐만 아니라, 회의를 생성한 사람도 회의 참가자 리스트에 포함해야 한다. 하지만 이러한 로직이 테스트 환경 설정 메서드에 반영되지 않을 경우 실제 애플리케이션과 다른 상태에서 테스트가 진행되어 에러를 발생시킬 수 있다. 문제 분석 문제 발생 코드 - createTestMeeting @BeforeEach에서 호출되어 테스트 환경을 생성하는 메서드이다. public Long createTestMeeting(Member hostMember) { Meeting meeting = Meeting.builder() .hostM..

문제&해결

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)를 사용하려고 해서 발생한다. 한 포트는 하나의 서비스만 사용할 수 있다. 당연하..

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