일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 미션
- 자바
- 코드리뷰
- MSA
- Level2
- HTTP
- 우테코
- 우아한테크코스
- JPA
- Paging
- AOP
- 스프링부트
- CircuitBreaker
- 레벨2
- Docker
- JUnit5
- 백준
- 프리코스
- 의존성
- 프로그래머스
- 서블릿
- REDIS
- 스프링 부트
- yml
- 트랜잭션
- 세션
- Spring Batch
- 우아한세미나
- mock
- AWS
- Today
- Total
늘
[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 |