중복 등록과 충돌
컴포넌트 스캔에서 같은 빈 이름을 등록하면 어떻게 될까?
다음 두가지 상황이 있다.
- 자동 빈 등록 vs 자동 빈 등록
- 수동 빈 등록 vs 자동 빈 등록
경우1. 자동 빈 등록 vs 자동 빈 등록
컴포넌트 스캔에 의해 자동으로 스프링 빈이 등록되는데, 그 이름이 같은 경우 스프링은 오류를 발생시킨다.
- ConflictingBeanDefinitionException 예외 발생
경우 2. 수동 빈 등록 vs 자동 빈 등록
만약 수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌되면 어떻게 될까?
이 경우 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다.)
@Component
public class MemoryMemberRepository implements MemberRepository {}
@Configuration
@ComponentScan(
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
Configuration.class))
public class AutoAppConfig {
@Bean(name = "memoryMemberRepository")
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberMemberRepository |
MemberServiceImpl 클래스의 생성자에서 MemberRepository 타입의 빈을 주입하려고 했지만, 동일한 타입의 빈이 두 개 이상 존재하고 Spring이 어떤 빈을 선택해야 하는지 알 수 없어서 발생.
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberMemberRepository |
오류1. UnsatisfiedDependencyException (의존성 미충족 예외)
: 주로 빈을 생성하거나 주입할 때 필요한 의존성이 존재하지 않을 때 발생.
즉, 필요한 빈을 찾을 수 없거나 생성할 수 없는 경우에 발생.
오류2. NoUniqueBeanDefinitionException (중복 빈 정의 예외)
: 동일한 타입의 빈이 둘 이상 존재하고, Spring이 명확한 빈을 선택할 수 없을 때 발생.
수동 빈 등록시 남는 로그
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
'공부 > Spring' 카테고리의 다른 글
[Spring] 옵션 처리(주입할 Spring Bean이 없어도 동작해야 할 때) (0) | 2023.12.20 |
---|---|
[Spring] 의존관계 자동 주입 (0) | 2023.12.20 |
[Spring] 필터(ComponentScan하는 Annotation만들기) (0) | 2023.12.19 |
[Spring] 탐색 위치와 기본 스캔 대상 (0) | 2023.12.19 |
[Spring] 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (1) | 2023.12.18 |