java.lang.ClassNotFoundException: org.hibernate.boot.model.naming .CamelCaseToUnderscoresNamingStrategy 원인

Slow·2022년 1월 18일
0
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에 추가했던 구문을 다시 제외하고 돌려도 정상적으로 작동했다.

버전 호환성 문제는 굉장히 골치아프고, 해결하더라도 허무함 뿐이다.
이런 문제가 다시 발생하지 않도록 신경써야겠다.

profile
터벅터벅 전진

0개의 댓글