MSA 공부를 하던중, user-service에서 다음과 같은 에러가 났다.
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException:
맨 위에 위치한 entityMangerFactory
를 생성하지 못했다는 에러에 꽃혀서 1시간 동안 삽질을 하였다. 그러다 맨 아래에 있는 더 자세한 에러를 보고, 구글링을 해보니 바로 해결 방안을 찾을 수 있었다.
Caused by: java.lang.NoClassDefFoundError: javax/validation/ClockProvider
at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:135) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
at org.hibernate.validator.internal.engine.ConfigurationImpl.<init>(ConfigurationImpl.java:108) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-6.0.17.Final.jar:6.0.17.Final]
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110) ~[validation-api-1.1.0.Final.jar:na]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.getValidatorFactory(TypeSafeActivator.java:501) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at org.hibernate.cfg.beanvalidation.TypeSafeActivator.activate(TypeSafeActivator.java:83) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
at org.hibernate.cfg.beanvalidation.BeanValidationIntegrator.integrate(BeanValidationIntegrator.java:137) ~[hibernate-core-5.6.4.Final.jar:5.6.4.Final]
... 31 common frames omitted
👉stack overflow를 찾아보니, 문제의 원인은 javax.validation
과 hibernate-validator
의 버전이 맞지 않았던 것이였다.(아래 사진은 현재 추가한 dependency)
하이버네이트 공식 문서에 가보니, 6.0.17.Final
버전은 Jakarta Bean validation 2.0
에 포함되어 있다고 한다.
💡Bean Validation이란?
Bean Validation은 JavaBean 유효성 검증을 위한 메타데이터 모델과 API에 대한 정의이며 여기서 언급하고 있는 JavaBean은 직렬화 가능하고 매개변수가 없는 생성자를 가지며, Getter 와 Setter Method를 사용하여 프로퍼티에 접근이 가능한 객체를 의미한다.
그렇다면 둘의 관계가 어떻게 되는 것일까?
validation을 위해 Java에서는 Jakarta Bean Validation라는 Specification을 이용할 수 있다. Annotation
을 이용해서 Validation을 처리할 수 있는 방법인데, 이 Specification을 구현한 모듈이 Hibernate Validator이다.
공식 문서에 따르면 Jakarta Bean Validation
과 Bean Validation
의 차이는 별로 없다 한다. 따라서 아래처럼 버전을 2.0 이상으로 올리니, 에러가 해결되었다.
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>