JPA Auditing 에러를 해결하며 공부해본 @WebMvcTest

문제

Controller에 대한 Test를 진행하기 위해 @WebMvcTest를 진행했다. @SpringBootTest는 모든 구성 요소를 로드해서 실제 실행과 같은 환경에서 테스트를 진행하기 때문에 매우 무겁다는 단점이 있어 Controller에 대한 테스트는 @WebMvcTest를 사용하는 것으로 알고있어서 선택한 것이었다.

하지만 @WebMvcTest가 어떻게 동작하는지에 대해 모르는 상태였고, 그에 따라 "jpa metamodel must not be empty!" 라는 에러 메세지를 만나게 되었고, 문제를 해결하면서 @WebMvcTest에 대해 공부해보았다.

 

원인

jpa metamodel must not be empty는 Auditing 관련 빈을 생성하지 않고 @EnableJpaAuditing을 사용했을 때 발생하는 에러다.

이 에러가 발생한 이유는 JPA Auditing을 사용하면서 application 파일에 @EnableJpaAuditing을 붙여주었고, WebMvcTest가 실행되면서 Auditing 관련 빈들이 스캔 대상에서 제외된 상태로 Application의 @EnableJpaAuditing을 스캔했기 때문이다.

 

 

@WebMvcTest란?

Spring Slice Test로 웹 계층에 중점을 둔 테스트이다. 

슬라이스 테스트란?

@SpringBootTest를 통해 모든 빈을 등록해서 테스트 할 수 있지만, 모든 빈을 등록하면 불필요한 빈까지 등록해서 리소스가 낭비된다는 문제가 있다. 이러한 문제를 해결하기 위해 각 계층에 맞는 테스트를 진행하는 것이 슬라이스 테스트이다.

대표적인 슬라이스 테스트 어노테이션으로 @WebMvcTest, @WebFluxTest, @DataJpaTest, @JsonTest, @RestClientTest가 있다.

 

@WebMvcTest는 웹 계층 테스트에 필요한 @Controller, @ControllerAdvice, @JsonComponent Filter, WebMvcConfigurer, HandlerMethodArgumentResolver와 같은 빈들만 적용이 되고, @Component, @Service, @Repository와 같은 빈들은 적용되지 않는다.

 

또한 @AutoConfigureMockMvc를 통해 @Configuration Bean을 @Import로 추가해서 해당 설정을 적용시킬 수 있고, @MockBean으로 Controller에서 호출하는 @Service Bean을 등록해서 사용하는 등 컨트롤러 테스트에 필요한 빈을 등록할 수 있다.

 

 

 

 

 

Reference

https://docs.spring.io/spring-boot/docs/2.0.0.M1/api/index.html?org/springframework/boot/test/autoconfigure/web/servlet/WebMvcTest.html

 

Spring Boot Docs 2.0.0.M1 API

 

docs.spring.io

https://tecoble.techcourse.co.kr/post/2021-05-18-slice-test/

 

Spring Boot 슬라이스 테스트

Spring Boot…

tecoble.techcourse.co.kr

 

'개발 > Spring' 카테고리의 다른 글

JPA란 무엇인가?  (1) 2024.01.26
data.sql 파일로 테스트 데이터 적용하기  (0) 2024.01.22
[Spring] @DataJpaTest 사용 시 주의사항  (1) 2023.12.31
[Spring] JPA Auditing  (0) 2023.12.30
[Java] Generic과 wild card  (0) 2023.10.14