Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/boot/model/naming/CamelCaseToUnderscoresNamingStrategy
Caused by: java.lang.NoClassDefFoundError: org/hibernate/boot/model/naming/CamelCaseToUnderscoresNamingStrategy
Caused by: java.lang.ClassNotFoundException: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
백엔드 프로젝트를 진행중에 팀원이 푸쉬한 코드를 풀하여 돌려봤더니
이러한 오류가 발생했다.
디버거와 구글신에 몸을 맡기고 한참을 떠돌던 중
hibernate 아래에 CamelCaseToUnderscoresNamingStrategy라는 클래스가 없어서 이러는 거라면, 저 클래스 대신 다른 클래스를 넣어서 일단 막아보자.
라는 생각이 들어 springboot jpa naming strategy를 변경하는 법을 찾아보았다.
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
spring.jpa.hibernate.naming.implicit-strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
application.properties에 해당 구문을 넣고 돌리자 다행히 문제가 사라졌다.
진행중이던 백엔드 프로젝트에 팀원이 로그인과 인증을 구현하기 위해
spring security를 gradle에 추가했었다.
사용중이던 Hibernate 버전 : 5.4.33
사용중이던 Springboot 버전 : 2.5.8
팀원이 새로 추가한 Springboot 버전 : 2.6.2
Springboot 2.6에서 사용하는 Hibernate 버전 : 5.6
허접한 실력이라 직접 확인은 하지 못했지만
hibernate 5.5.4 버전에서 CamelCaseToUnderscoresNamingStrategy 클래스가 새로 등장했다는 글을 보니 버전차이로 인해 벌어진 문제인 것 같았다.
https://in.relation.to/2021/07/19/hibernate-orm-554-release/
실제로 gradle에 추가된 spring-boot-starter-security 버전을 2.5.8로 낮추었더니 application.properties에 추가했던 구문을 다시 제외하고 돌려도 정상적으로 작동했다.
버전 호환성 문제는 굉장히 골치아프고, 해결하더라도 허무함 뿐이다.
이런 문제가 다시 발생하지 않도록 신경써야겠다.