JPA실습을 위해 준비한 그리고 동시에 api를 만들어보기 위해서 실습하던 JPA 미니 프로젝트에서 에러가 발생했다.
{: .text-center}
{: .text-center}
오류는 바로 JPA metamodel must not be empty!
이다.
분명 나는
@EnableJpaAuditing
@SpringBootApplication
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
스프링부트 실행 application 클래스에 JPAAuditing을 추가해주었다.
그리고 MockBean을 전부 넣어줘서 문제가 없다고 생각했는데 어디가 문제인지 알지 못했었다.
JPA는 엔티티 클래스의 LocalDateTime
을 자동으로 관리해주는 Auditing 기능이 있다.
이 자동 삽입되는 기능을 쓰려고 Application 클래스에 @EnableJpaAuditing
을 삽입했다.
모든 테스트는 이 Application 클래스가 항상 로드되면서 실행이 되는데,
여기에 Auditing 어노테이션이 등록되어 있어서 모든 테스트가 항상 이 JPA관련된 빈을 필요하고 있는 상태가 되는 것이다.
전체 컨텍스트를 로드하면서 빈을 전체 주입받으면 에러가 발생하지 않았지만,
나의 경우는 Controller
테스트를 하기위해 @WebMvcTest
를 사용했는데 이 어노테이션은 JPA에 관련된 것들은 로드하지 않는다.
방법은 크게 두가지가 있다.
나중에 또 발견하게 되면 업데이트를 해야겠다.
스터디원중에 예전에 한번 지나가면서 얘기했던 것이 있었는데 그것이 바로 방법 첫번째이다.
따로 config라는 별도의 패키지에 Auditing
관련 Configuration Class를 만들어 주는 것이다.
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}
이렇게 따로 빼주었다.
이 방법은 할때마다 연관되지 않은 Controller를 추가해줄때마다 즉,
@WebMvcTest
를 하는 곳이면 그러면서 Auditing엔 관련없는 그런 Controller에는 다 해야 될것이다.
상당히 귀찮은 작업이므로 1방법이 더 좋다.
이 포스팅을 함으로써 느꼈다.
Application
클래스에 별도의 어노테이션을 삽입하지 말고 따로 분리해서 Configuration
을 관리해야겠다.