코딩하는 오징어

Spring & JPA의 Hibernate 설정시 주의 사항 & CandidateComponentsIndexLoader 클래스 본문

Framework/Spring

Spring & JPA의 Hibernate 설정시 주의 사항 & CandidateComponentsIndexLoader 클래스

코딩하는 오징어 2018. 7. 28. 20:52
반응형

spring-data-jpa와 hibernate를 이용하여 프로젝트를 설정하던 중 발생한 이슈를 해결하면서 Spring 5.xx에서 새로 나온 CandidateComponentsIndexLoader클래스에 대해 알아보았습니다. 이를 공유하고자 글을 쓰게 되었습니다.


먼저 제가 설정한 pom.xml을 들여다 봅시다.


<properties>
	<spring.version>4.3.14.RELEASE</spring.version>
	...
</properties>
...
<!-- spring webmvc -->
<dependencies>
	<dependency>
	  <groupId>org.springframework</groupId>
	  <artifactId>spring-webmvc</artifactId>
	  <version>${spring.version}</version>
	  <exclusions>
	    <exclusion>
	      <groupId>javax.servlet</groupId>
	      <artifactId>javax.servlet-api</artifactId>
	    </exclusion>
	    <exclusion>
	      <groupId>com.fasterxml.jackson.core</groupId>
	      <artifactId>jackson-databind</artifactId>
	    </exclusion>
	  </exclusions>
	</dependency>
	<!-- spring data jpa -->
	<dependency>
		<groupId>org.springframework.data</groupId>
		<artifactId>spring-data-jpa</artifactId>
		<version>2.0.5.RELEASE</version>
	</dependency>
	<!-- hibernate -->
	<dependency>
	  <groupId>org.hibernate</groupId>
	  <artifactId>hibernate-entitymanager</artifactId>
	  <version>5.2.17.Final</version>
	</dependency>
	...
</dependencies>

저는 Spring 4.xx 버전으로 프로젝트를 세팅 중이었고 Mybatis를 연동하려다 JPA를 적용해야해서 세팅을 바꾸었습니다. spring-data-jpa 2.0.5 버전을 사용하려고 했습니다.(Spring boot pom을 이용했다면 이런 버전간의 문제가 발생하지 않았겠지만 개인 토이 프로젝트 만큼은 deadline이 없기때문에 설정을 직접 해보고 싶었습니다 ㅎ) 이렇게 프로젝트에서 사용할 외부 lib을 설정하고 Spring context를 띄우니 다음과 같은 에러가 발생하였습니다.


org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in org.mashup.takoyaki.configs.HibernateConfig: Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/context/index/CandidateComponentsIndexLoader
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:564)
	...
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/index/CandidateComponentsIndexLoader
	at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.setResourceLoader(DefaultPersistenceUnitManager.java:431)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.setResourceLoader(LocalContainerEntityManagerFactoryBean.java:320)
	at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:112)
	at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:97)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
	... 56 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.springframework.context.index.CandidateComponentsIndexLoader
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1309)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1137)
	... 63 common frames omitted

자세히 로그를 들여다보니 java.lang.NoClassDefFoundError: org/springframework/context/index/CandidateComponentsIndexLoader클래스가 없어서 빈을생성할 수 없다고 합니다.



위에서 말했던과 같이 저는 spring 4.xx버전으로 프로젝트를 구성하고 있었는데 spring-orm을 보니 혼자 5.xx버전입니다. 이게 뭐지 하고 spring-data-jpa 2.0.5.RELEASE pom을 타고 들어가봤습니다. 확인해본결과 spring-data-jpa 2.0.5.RELEASE 버전은 다음과 같은 종속성을 가지고 있었습니다.


spring-data-parent-2.0.5.RELEASE.pom

...
<spring>5.0.4.RELEASE</spring>
...

흠 뭔가 잘못된걸 깨닫고 spring-context:4.3.14.RELEASE 폴더 밑에 org.springframework.context패키지를 확인해보았습니다.



org.springframework.context.index.CandidateComponentsIndexLoader가 없습니다...

pom.xml에 spring version을 5.0.4로 맞추어주니 해결되었습니다. 다음과 같이 spring 5.xx버전에는 저 클래스가 존재하는군요.


문제는 해결되어 spring context가 잘 띄워지는 것을 확인했습니다. 하지만 저 클래스가 무슨 클래스인지 궁금하여 한번 검색해보았습니다.


https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/index/CandidateComponentsIndexLoader.html


위 링크는 해당 클래스의 javadoc입니다.


Candidate components index loading mechanism for internal use within the framework. 라고 설명되어 있네요. 프레임워크 내부에서 사용하기위해 후보 컴포넌트들을 색인해서 로딩하는 메커니즘이라는데 이 말이 JPA 구현체를 설정하는데 어떤 관계가 있는지는 아직 잘 모르겠습니다. 흠.. 일단 버전차이 때문에 클래스패스내에 있어야할 클래스가 존재하지않아 에러가 난걸로 결론을 짓고 글을 마무리 하겠습니다. 저 클래스가 뭔지 한 번 찾아서 글을 수정하겠습니다.. ㅎㅎ



반응형
Comments