컴포넌트 스캔에서 같은 빈 이름을 동록하면 2가지 상황이 발생한다.
1. 자동 빈 등록 vs 자동 빈 등록
컴포넌트 스캔으로 자동으로 스프링 빈 등록시, 이름 같은 경우 스프링은 오류 발생 시킴
-> ConflictingBeanDefinitionException 예외 발생
2. 수동 빈 등록 vs 자동 빈 등록
- src/main/java/hello/core/member/MemoryMemberRepository.java
@Component // memoryMemberRepository
public class MemoryMemberRepository implements MemberRepository {
...
}
- src/main/java/hello/core/AutoAppConfig.java
...
@Bean(name = "memoryMemberRepository")
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
...
- 콘솔
23:12:45.056 [Test worker] DEBUG o.s.b.f.s.DefaultListableBeanFactory --Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing [Generic bean: class=hello.core.member.MemoryMemberRepository; scope=singleton; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null; defined in file [C:\Users\admin\IdeaProjects\core\build\classes\java\main\hello\core\member\MemoryMemberRepository.class]] with [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=autoAppConfig; factoryMethodName=memberRepository; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in hello.core.AutoAppConfig]
수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩)
- 수동 빈 등록시 남는 로그
Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing
주로 여러 설정들이 꼬여서 이런 결과가 발생하는데, 처리하기 어려운 버그가 만들어진다. (항상 잡기 어려운 버그는 애매한 버그)
그래서 스프링 부트는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본값을 바꾸었다.
- 수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
CoreApplication 을 실행하면 오류를 볼 수 있다.
- 콘솔
23:19:44.430 [main] DEBUG o.s.b.d.LoggingFailureAnalysisReporter --Application failed to start due to an exception
org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'memoryMemberRepository' defined in class path resource [hello/core/AutoAppConfig.class]: Cannot register bean definition [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=autoAppConfig; factoryMethodName=memberRepository; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [hello/core/AutoAppConfig.class]] for bean 'memoryMemberRepository' since there is already [Generic bean: class=hello.core.member.MemoryMemberRepository; scope=singleton; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=null; factoryMethodName=null; initMethodNames=null; destroyMethodNames=null; defined in file [C:\Users\admin\IdeaProjects\core\build\classes\java\main\hello\core\member\MemoryMemberRepository.class]] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:1264)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:309)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:148)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:124)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:464)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:316)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:795)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:603)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1365)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354)
at hello.core.CoreApplication.main(CoreApplication.java:10)
23:19:44.432 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter --
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'memoryMemberRepository', defined in class path resource [hello/core/AutoAppConfig.class], could not be registered. A bean with that name has already been defined in file [C:\Users\admin\IdeaProjects\core\build\classes\java\main\hello\core\member\MemoryMemberRepository.class] and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
종료 코드 1(으)로 완료된 프로세스
위 에러 메시지처럼 application.properties 에 "spring.main.allow-bean-definition-overriding=true" 내용을 등록하면 스프링 부트 실행시 에러가 사라진다.
- src/main/resources/application.properties
spring.application.name=core
spring.main.allow-bean-definition-overriding=true
스프링 부트는 spring.main.allow-bean-definition-overriding 기본값을 "false" 로 한다. (하도 문제가 많으니 기본값을 "false" 로 한 것이다)
개발은 명확하지 않으면 하면 안된다. 애매한 상황 만들지 않기.
어설픈 추상화, 어설픈 우선순위 설정 금지.
코드 좀 더 쓰더라도 명확하게 하거나 빨리 오류내서 튕기기.
참고링크 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8?cid=325969
스프링 핵심 원리 - 기본편| 김영한 - 인프런 강의
현재 평점 5.0점 수강생 49,558명인 강의를 만나보세요. 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 스프링 기본 기능, 스프
www.inflearn.com
'강의 실습 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| 옵션 처리 (0) | 2026.04.25 |
|---|---|
| 다양한 의존관계 주입 방법 (0) | 2026.04.24 |
| 필터 (0) | 2026.04.22 |
| 탐색 위치와 기본 스캔 대상 (0) | 2026.04.21 |
| 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2026.04.20 |
댓글