컴포넌트 스캔의 스프링 빈 중복 등록과 충돌

2023. 5. 3. 15:41JAVA/Spring

스프링 빈 중복 등록

컴포넌트 스캔시 @Component, @Service와 같은 애노테이션이 적용된 클래스를 대상으로 자동으로 스프링 빈으로 등록할수도 있지만 @Configuration과 @Bean을 통해서 수동적으로 빈을 등록할 수 있습니다. 스프링 빈이 중복 등록되는 경우 어떻게 되는지 알아봅니다.

 

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

  • NoUniqueBeanDefinitionException 예외 발생

동일한 인터페이스를 구현한 구현체가 2개 있고 두 구현체 모두 @Component를 적용하였다고 가정합니다.

@Component
public class MemoryMemberRepository implements MemberRepository {
    // ...
}

@Component
public class JdbcMemberRepository implements MemberRepository{
    // ...
}

위와 같으 상태에서 실행시 NoUniqueBeanDefinitionException 예외가 발생합니다.

 

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

수동빈 등록이 우선되어 등록됩니다. 즉, 자동 빈 등록은 되지 않고 수동 빈 등록된 객체가 스프링 빈으로 등록됩니다.

 

자동 빈 등록은 다음과 같을 수 있습니다.

@Component
public class MemoryMemberRepository implements MemberRepository {

수동 빈 등록은 다음과 같을 수 있습니다.

@Configuration
@ComponentScan
public class AutoAppConfig {

    @Bean(name = "memoryMemberRepository")
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

Overriding bean definition for bean 'memoryMemberRepository' with a different definition: ...

실행 결과중에서 MemoryMemberRepository 빈에 대해서 빈을 재정의 하는 것을 확인할 수 있습니다.

 

단, 스프링 부트 애플리케이션으로 실행시 수동 빈 등록과 자동 빈 등록시 재정의되지 않고 스프링 빈 중복 등록 예외가 발생합니다. 수동 빈 등록을 하기 위해서는 옵션을 따로 설정해야 합니다.
spring.main.allow-bean-definition-overriding=true

 

References

스프링 핵심 원리 - 기본편