컴포넌트 스캔의 스프링 빈 중복 등록과 충돌
2023. 5. 3. 15:41ㆍJAVA/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
스프링 핵심 원리 - 기본편
'JAVA > Spring' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2023.05.10 |
---|---|
@Qualifier, @Primary를 사용하여 스프링 빈 조회 (0) | 2023.05.06 |
컴포넌트 스캔의 필터(Filter) 생성 (0) | 2023.05.03 |
컴포넌트 스캔(ComponentScan) (0) | 2023.05.03 |
SRP(Single Responsility Principle, 단일 책임 원칙) (0) | 2023.05.03 |