

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을 우선적으로 실행시키는 것이 정신적으로나 시간적으로도 이롭습니다.