JPA metamodel must not be empty!
JPA에러
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에 관련된 것들은 로드하지 않는다.
방법
방법은 크게 두가지가 있다.
나중에 또 발견하게 되면 업데이트를 해야겠다.
Configuration 별도 분리
스터디원중에 예전에 한번 지나가면서 얘기했던 것이 있었는데 그것이 바로 방법 첫번째이다.
따로 config라는 별도의 패키지에 Auditing
관련 Configuration Class를 만들어 주는 것이다.
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
}
이렇게 따로 빼주었다.
JpaMetaModelMappingContext 클래스 MockBean 추가
이 방법은 할때마다 연관되지 않은 Controller를 추가해줄때마다 즉,@WebMvcTest
를 하는 곳이면 그러면서 Auditing엔 관련없는 그런 Controller에는 다 해야 될것이다.
상당히 귀찮은 작업이므로 1방법이 더 좋다.
이 포스팅을 함으로써 느꼈다.
Application
클래스에 별도의 어노테이션을 삽입하지 말고 따로 분리해서 Configuration
을 관리해야겠다.