JpaBasicConfig 클래스 파일의 이름을 변경한 이후, 패키지 위치를 옮겨주었다.
이후 해당 클래스를 실행하려고 하니 다음과 같은 에러가 발생했다.
package com.codestates.basic;
import com.codestates.entity.Member;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
@Configuration
public class JpaBasicConfig {
private EntityManager em;
private EntityTransaction tx;
//(2)
@Bean
public CommandLineRunner testJpaBasicRunner(EntityManagerFactory emFactory) {
this.em = emFactory.createEntityManager(); // (2)
this.tx = em.getTransaction();
return args -> {
example05();
};
}
private void example05() {
tx.begin();
em.persist(new Member("hgd1@gmail.com"));
tx.commit();
tx.begin();
Member member = em.find(Member.class, 1L);
em.remove(member);
tx.commit();
}
}
- org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.codestates.Section3Week2TemplateJpaApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'jpaBasicConfig' for bean class[com.codestates.basic.JpaBasicConfig] conflicts with existing, non-compatible bean definition of same name and class [com.codestates.JpaBasicConfig]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:189) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-2.7.0.jar:2.7.0]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-2.7.0.jar:2.7.0]
at com.codestates.Section3Week2TemplateJpaApplication.main(Section3Week2TemplateJpaApplication.java:10) ~[main/:na]
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'jpaBasicConfig' for bean class [com.codestates.basic.JpaBasicConfig] conflicts with existing, non-compatible bean definition of same name and class [com.codestates.JpaBasicConfig]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:349) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:287) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:296) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:250) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:207) ~[spring-context-5.3.20.jar:5.3.20]
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:175) ~[spring-context-5.3.20.jar:5.3.20]
... 13 common frames omitted
원래 com.codestates.JpaBasicConfig
에 존재했던 JpaBasicConfig.java
클래스를 com.codestates.basic.JpaBasicConfig
로 마이그레이션 하는 과정에서 해당 프로젝트의 설정 파일이 마치 JpaBasicConfig
가 2개 존재한다고 인식하는 것으로 판단된다.
JpaBasicConfig.java
는 복사한 것이 아니라 패키지를 옮겨주었을 뿐이므로 어느 파일 하나를 삭제함으로써 중복된 Configuration 클래스를 제거할 수 없을 것이다.
마침 같은 에러를 포스팅한 블로그를 발견했다.
gradle warpper
를 이용해서 gradle
을 clean
시켜주는 것이다../gradlew clean
- Gradle Warpper 란, Gradle 을 build 하기 위한 Gradle 에서 공식적으로 제안하는 script 파일입니다.
Gradle 을 별다른 설치 작업 없이 버전을 내포해서 다운로드 및 실행시키기위해 필요한 스크립트입니다.
IntelliJ 에서는 Gradle 을 기본적으로 build tool 로 사용한다면 제공됩니다.
자세한 내용은 아래 공식 홈페이지를 참고 부탁드립니다.
https://docs.gradle.org/current/userguide/gradle_wrapper.html
만약, 단순 파일이동이나 작업 후 ConflictingBeanDefinitionException 오류가 발생하였는데 중복된 Bean 이 존재하지 않는다면./gradlew clean
을 우선적으로 실행시키는 것이 정신적으로나 시간적으로도 이롭습니다.