중복 등록과 충돌

컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까?

  • 자동 빈 등록 vs 자동 빈 등록
  • 수동 빈 등록 vs 자동 빈 등록

 

  • 자동 빈 등록 vs 자동 빈 등록
    • 컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데 , 그 이름이 같은 경우 스프링은 오류를 발생 시킨다.
      • ConflictingBeanDefinitionException 예외 발생
  • 수동 빈 등록 vs 자동 빈 등록
    • 만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌 되면 어떻게 될까?
    • 이 경우 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다)
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; factoryBeanName=null; factoryMethodName=null; 
initMethodName=null; destroyMethodName=null; 
defined in file [C:\Users\pc\Desktop\study\core\out\production\classes\hello\core\member\MemoryMemberRepository.class]]
with [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; 
dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=autoAppConfig; 
factoryMethodName=memberRepository; initMethodName=null; destroyMethodName=(inferred); 
defined in hello.core.AutoAppConfig]
  • 물론 개발자가 의도적으로 이런 결과를 기대했다면 , 자동 보다는 수동이 우선권을 가지는 것이 좋다.
  • 하지만 현실은 개발자가 의도적으로 설정해서 이런 결과가 만들어지기 보다는 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다.
  • "그러면 정말 잡기가 어려운 버그가 만들어진다. 항상 잡기 어려운 버그는 애매한 버그다"
  • 그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌 나면 오류가 발생하도록 기본 값을 바꾸었다.

수동 빈 등록 , 자동 빈 등록 오류 시 스프링 부트 에러

Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true
스프링 부트인 CoreApplication을 실행해보면 오류를 볼 수 있다.
application.properties -> spring.main.allow-bean-definition-overriding=true 추가하면 오버라이딩을 한다.

 

 

 

 

 

스프링 핵심 원리 - 기본편 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온

www.inflearn.com