본문 바로가기
강의 실습/스프링 핵심 원리 - 기본편

중복 등록과 충돌

by jint 2026. 4. 23.

컴포넌트 스캔에서 같은 빈 이름을 동록하면 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

댓글