0. 개요
@WebMvcTest를 활용해서 컨트롤러에 대한 테스트 코드를 작성하고 실행 중, 아래와 같은 오류가 발생했다.
이번 포스팅에서는 이 오류의 원인과 해결 방법을 공유하려고 한다.
Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument
1. 문제
해당 오류는 jpaAuditingHandler 빈을 생성하는 동안 jpaMappingContext 빈을 찾을 수 없다는 BeanCreationException이다. 이 문제는 Spring Data JPA에서 발생하며, 보통 @EnableJpaAuditing을 활성화하지 않거나 JPA 관련 설정이 잘못되었을 때 발생한다.
@EnableJpaAuditing이란?
Spring Data JPA에서 JPA Auditing 기능을 활성화하는 어노테이션이다.
이 기능을 활성화하면 엔티티(Entity)에 대해 @CreatedDate, @LastModifiedDate, @CreatedBy 등의 애너테이션을 사용할 수 있다.
나의 경우 회원 엔티티에서 @CreatedDate를 사용하려고 메인 클래스에 @EnableJpaAuditing를 추가했다.
@EnableJpaAuditing
@EnableDiscoveryClient
@SpringBootApplication
public class ChokchokApiApplication {
2. 해결 방법
방법 1) 테스트 클래스에 빈 의존성 주입하기
@MockBean(JpaMetamodelMappingContext.class)
이 오류는 @EnableJpaAuditing이 활성화되어 있을 때, Spring이 내부적으로 jpaMappingContext 빈을 요구하는데, @WebMvcTest는 기본적으로 JPA 관련 빈들을 로딩하지 않기 때문에 발생한다. 따라서 JPA Auditing이 요구하는 빈을 테스트에 가짜로 등록해줘서, 실제 DB나 엔티티 없이도 테스트가 가능하게 해주는 우회 방법이다.
방법 2) @Configuration으로 분리
설정 관련 코드를 메인 클래스에서 따로 빼서 독립적인 설정 클래스로 만드는 것이다.
메인 클래스에 @EnableJpaAuditing이 있으면 테스트 코드 실행 시에도 같이 로딩되기 때문에 지금과 같은 문제가 발생한다.
따라서 기존의 메인 클래스에 있던 @EnableJpaAuditing을 @Configuration을 활용해 독립적인 설정 파일로 분리한다.
@EnableJpaAuditing
@Configuration
public class JpaAuditingConfig {
}
3. 결론
위 두 가지 방법 중, 나는 @Configuration으로 설정 파일을 분리하는 방법을 사용했다.
사실 예전에 팀 프로젝트에서 똑같은 문제가 발생한 적이 있었다. 그때 한 팀원이 @EnableJpaAuditing을 메인 클래스에 추가하고 머지했는데, 갑자기 모든 테스트 코드가 실행되지 않아서 모두가 꽤나 애를 먹었던 기억이 있다. 정말 곤란했었다.
메인 클래스에 @EnableJpaAuditing과 같은 어노테이션을 사용하면, 테스트 코드 실행 시에도 해당 설정이 적용된다는 점을 반드시 기억해야 한다.
'Spring' 카테고리의 다른 글
[Spring Boot] DB 연결하기 - MySQL, H2, Redis (0) | 2024.11.30 |
---|---|
[Spring Boot] 01. Spring Boot Core (4) - Test와 Logging (0) | 2024.11.24 |
[Spring Boot] JDK Proxy vs CGLIB Proxy (0) | 2024.11.24 |
[Spring Boot] 서비스 추상화 (Portable Service Abstraction) (1) | 2024.11.09 |
[Spring Boot] 01. Spring Boot Core (3) - AOP(관점 지향 프로그래밍) * (0) | 2024.11.08 |