↩뒤로가기

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

  1. 자동 빈 등록 vs 자동 빈 등록
  2. 수동 빈 등록 vs 자동 빈 등록

자동 빈 등록 vs 자동 빈 등록

컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 ConflictingBeanDefinitionException예외가 발생한다.

수동 빈 등록 vs 자동 빈 등록

@Component
public class MemoryMemberRepository implements MemberRepository{
//자동 등록
@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(
						type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {

    @Bean(name = "memoryMemberRepository")
    public MemberRepository memberRepository(){
        return new MemoryMemberRepository();
    }
//수동 등록
}

테스트 시 오버라이딩

Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing 메시지를 확인할 수 있다. 수동 등록 빈이 우선권을 가져 오버라이딩 되는 것이다.

Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing 메시지를 확인할 수 있다. 수동 등록 빈이 우선권을 가져 오버라이딩 되는 것이다.

<aside> 💡 물론 개발자가 의도적으로 이런 결과를 기대했다면, 자동 보다는 수동이 우선권을 가지는 게 좋지만 개발자가 의도적으로 이런 결과가 나오는 것보다는 어쩌다가 꼬여서 이렇게 되는 경우가 대부분이다. 정말 잡기 어려운 버그(애매하면서 작동은 되는 버그)가 만들어진다.

</aside>

하지만 코어앱 실행 시 오류 발생!

he 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:\intelliJ\core\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] and overriding is disabled.

he 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:\intelliJ\core\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] and overriding is disabled.

<aside> 💡 기본적으로 코어 앱의 디폴트 설정은 이런 상황을 허용하지 않는다. 하지만 에러메시지의 Action을 확인해보면 이 설정을 바꿀 수 있도록 가이드를 제시한다.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

가이드를 따라 resources.application.properties에 spring.main.allow-bean-definition-overriding=true를 추가 시 정상 실행된다.

</aside>

중요!

명확하지 않은 건 그냥 하지를 말아라!

코드가 줄어들고 간결하지만 명확하지 않은 코드보다는, 코드가 길어지더라도 명확하게 만들거나 차라리 빨리 오류를 발생시키는 코드가 더 나은 경우가 많