늘
[JPA]EnableJpaAuditing을 Application 위에 쓰면 안되는 이유 본문
@WebMvcTest를 붙이고 테스트를 돌리니 JPA metamodel must not be empty! 와 같은 에러가 발생했다.
이유를 찾아보니 테스트를 돌릴때는 기본적으로 XApplication이 돌면서 작동한다. 따라서 @EnableJpaAuditing을 Application위에 올리면 Jpa관련된 빈들이 올라오기를 요구한다. 이때, mockMvc를 사용한 테스트는 mvc와 관련한 빈들만 찾아서 올리므로 JPA관련 빈을 찾지 못해서 JPA metamodel must not be empty 에러가 발생한다.
해결방법
1. @Configuration 분리
JpaAuditingConfig.java
@EnableJpaAuditing
@Configuration
public class JpaAuditingConfig {
}
2. @MockBean 추가
WebMvcTest.java
@RunWith(SpringRunner.class)
@WebMvcTest(TargetController.java)
@MockBean(JpaMetamodelMappingContext.class)
테스트 클래스에 JpaMetamodelMappingContext를 MockBean으로 추가한다.
2번처럼 매번 WebMvcTest마다 @MockBean을 추가해주는 방법보다는 1번 처럼 Configuration을 분리해주는 방식이 더 편한 것 같다.
새로운 문제점
1번 해결방법을 사용하면 모든게 해결이 될 줄알았다. 그런데 @DataJpaTest를 사용할 때 문제가 발생했다.
상황은 createdAt을 가지고 있는 Article 클래스가 있다.
save 후에도 null이 들어왔다.
@DataJpaTest는 JpaTest에 필요한 최소한의 빈을 불러오는데, 거기에는 @Configuration 빈이 포함되어있지 않다.
따라서 @Configuration을 사용하여 따로 설정 파일을 만들었을 경우 아래 사진처럼 Import(JpaAuditingConfig.class)를 넣어줘야 한다.
https://xlffm3.github.io/spring%20&%20spring%20boot/JPAError/
'우아한테크코스 4기' 카테고리의 다른 글
AOP에 대한 사실과 오해 그런데 트랜잭션을 사알짝 곁들인.. (0) | 2022.09.11 |
---|---|
[JPA] hibernate.ddl-auto 설정 (0) | 2022.07.14 |
[h2]DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE; (0) | 2022.07.10 |
[Transactional]Spring 프레임워크는 트랜잭션을 어떻게 구현하였는가? (0) | 2022.07.10 |
UX 워크샵 (0) | 2022.07.01 |