JPA

JPA metamodel must not be empty!

리승자이 2022. 8. 6. 00:06
728x90

JPA에러

JPA실습을 위해 준비한 그리고 동시에 api를 만들어보기 위해서 실습하던 JPA 미니 프로젝트에서 에러가 발생했다.

스크린샷 2021-08-15 오후 5 48 49
{: .text-center}

스크린샷 2021-08-15 오후 5 48 27
{: .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을 관리해야겠다.

728x90