개발스토리

java.lang.illegalargumentexception at least one jpa metamodel must be present 본문

삽질 기록

java.lang.illegalargumentexception at least one jpa metamodel must be present

무루뭉 2021. 9. 9. 14:06

JPA를 사용하고 테스트 코드 작성하는 것을 연습하고 있는데 이런 에러가 떴다..!

 

에러 로그를 살펴보면 적어도 하나의 jpa metamodel이 필요한 데 없어서 그런것 같다.

 

이게 무슨 뜻인지 천천히 생각해봤다.

 

우선 JPA에서는 엔티티들의 생성 및 수정 시간을 자동으로 관리해주는 Auditing 기능이 있다. 나도 이기능을 사용하기 위해 아래와 같은 코드를 작성해둔 상태였다.

 

 

이렇게 @EnableJpaAuditing 어노테이션을 테스트들의 가장 기본이 되는 Application 클래스에 등록을 해두면 모든 테스트들이 항상 JPA 관련 Bean들을 필요로 하는 상태가 된다. 

즉, @EnableJpaAuditing을 사용하기 위해서는 최소 하나의 @Entity 클래스가 필요하다는 뜻이다. 

하지만, 테스트 코드에서는 엔티티를 따로 생성하지 않았기 때문에 발생한 에러였다.

 


 

그럼 본 코드에서는 Auditing을 사용하고 테스트 코드에서는 이 설정을 제거하려면 어떻게 하면 될까?

 

생각하면 간단했다. 나는 테스트 코드에서 @WebMvcTest를 하고 있었고, 이것이 @SpringbootApplication을 스캔하는 데 @EnableJpaAuditing이 함께 있다 보니 같이 스캔되기 때문에 발생하는 것이니 둘을 분리하면 된다고 생각했다.

@WebMvcTest는 일반적인 @Configuration은 스캔하지 않기 때문이다.

 

 


 

테스트 코드를 작성하면서 에러들을 많이 만났다.

하지만 이 에러들을 해결하면서 스프링부트가 편리하지만 어떻게 동작하는 지에 대해 

( 예를 들어, 무엇을 자동으로 스캔하고 어떠한 어노테이션을 쓰면 무엇을 필수 구현 해야 하는지..? )

더 생각하게 되고 이해하는 과정을 거치는 것 같다.

 

++++

 

더 찾아보니까 위에 방법으로 해도 되지만 @MockBean으로 테스트 클래스에 JpaMetaModelMappingContext를 추가 하는 방법도 있다.

 

 

위에 예시 코드처럼 말이다.

 

하지만, 테스트를 추가할 때 마다 저런 설정을 해주는 것은 좋지 않은 방법이다. 그래서 나는 위에서 말한 첫 번째 방법으로 적용했다.

Comments