발생
컨트롤러 테스트를 위해 `@WebMvcTest` 선언 후 테스트 코드를 실행했을 때 발생하였다.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaAuditingHandler': Cannot resolve reference to bean 'jpaMappingContext' while setting constructor argument
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:377)
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:135)
at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:693)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1332)
원인
`@EnableJpaAuditing`을 선언했을 때 `@WebMvcTest`를 사용하여 테스트를 실행할 경우 발생하는 문제는 Spring의 설정 및 테스트 컨텍스트 구성과 관련이 있습니다. `@WebMvcTest`는 컨트롤러 계층만 로드하도록 설계되어 있으며, `JPA 관련 빈(@Entity, JpaRepository 등)`이나 `@EnableJpaAuditing`에서 사용하는 빈을 로드하지 않습니다. 이로 인해 `jpaAuditingHandler `관련 에러가 발생할 수 있습니다.
`@EnableJpaAuditing`은 JPA와 관련된 빈을 생성하고, 데이터베이스와 상호작용하기 위해 `JpaRepository`와 같은 컴포넌트가 필요합니다. 하지만 `@WebMvcTes`t는 JPA 관련 설정을 로드하지 않기 때문에 `JpaAuditingHandler` 빈을 생성하지 못합니다.
해결방안
1. @MockBean을 사용하여 의존성 추가
@WebMvcTest에서 필요한 JPA 빈을 명시적으로 추가합니다.
@WebMvcTest(controllers = ReviewController.class)
class ReviewControllerTest {
@MockBean
private JpaAuditingHandler jpaAuditingHandler;
// 테스트 코드 작성
}
2. @SpringBootTest로 변경
@SpringBootTest는 애플리케이션의 전체 컨텍스트를 로드하므로, JPA 및 JpaAuditingHandler 빈도 자동으로 로드됩니다.
@SpringBootTest
class ReviewControllerTest {
// 테스트 코드 작성
}
3. @Import를 사용하여 필요한 설정 추가
테스트에서 필요한 특정 설정만 추가적으로 로드합니다.
@WebMvcTest(controllers = ReviewController.class)
@Import(JpaConfig.class) // JpaConfig 클래스에서 @EnableJpaAuditing 설정
class ReviewControllerTest {
// 테스트 코드 작성
}
4. @EnableJpaAuditing 위치 변경
@EnableJpaAuditing을 별도의 설정 클래스에서만 선언하여 테스트에 영향을 주지 않도록 분리합니다.
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}
위와 같이 JpaConfig 클래스를 생성한 뒤, 애플리케이션 메인 클래스나 테스트 환경에 따라 필요한 설정을 불러옵니다.
권장방법
컨트롤러 테스트는 의존성을 최소화하여 컨트롤러 계층만 검증하려는 목적이 크므로, 모든 스프링 빈을 로드하는 `@SpringBootTest`는 부적합합니다. 또한, 프로젝트 내 여러 컨트롤러를 고려할 때, 특정 빈을 `@MockBean`으로 추가하거나 `@Import`를 사용하는 방법도 적합하지 않습니다. 따라서, `@EnableJpaAuditing`을 별도의 설정 파일로 분리하는 방법이 가장 적합합니다.
'Trouble Shooting' 카테고리의 다른 글
[트러블슈팅] Data too long for column '칼럼명' at row 1(with 암호화) (1) | 2024.12.29 |
---|---|
[Trouble Shooting] Spring Security - io.jsonwebtoken.security.WeakKeyException 해결방법 (1) | 2024.12.27 |
[Git] .gitignore가 적용되지 않았을때 (0) | 2024.12.11 |
[Java] Scanner 입력 예외처리 시 무한로프 - 입력 버퍼를 비워라 (0) | 2024.01.04 |
[WSL/Ubuntu] 도커 세팅위한 Ubuntu 배포버전을 설치하다 발생한 이슈(0x80370102) + LG 노트북 (0) | 2023.11.16 |