(인프런) 김영한님의 스프링 핵심 원리-기본편을 공부하고 리뷰한 글입니다.
4. 자동 등록과 충돌
1. 자동 빈 등록 vs 자동 빈 등록
컴포넌트 스캔에 의해 자동으로 스피링 빈이 등록되었는데, 이름이 같은 경우 스프링은 ConflictingBeanDefinitionException 예외 발생시킨다.(자동 빈 등록끼리 충돌할 일은 거의 없음)
1) MemberServiceImpl & OrderServiceImpl의 빈이름을 Service로 수정
예외가 발생하는 것을 확인하고자 빈 이름을 같게 수정한다. (테스트 후에는 원상 복귀해야함)
package hello.core.member;
@Component("service")
public class MemberServiceImpl implements MemberService{
...
}
package hello.core.order;
@Component("service")
public class OrderServiceImpl implements OrderService{
...
}
2) AutoAppConfigTest 실행 결과
2. 수동 빈 등록 vs 자동 빈 등록
수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌하는 경우,
1) AutoAppConfig 수동 빈 등록
AutoAppConfig에 빈 이름이 moemoryMemberRepository 인 빈을 수동으로 등록한다.
package hello.core;
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
// 빈 이름이 memoryMemberRepository 인 수동 빈 등록
@Bean(name = "memoryMemberRepository")
MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
2) 수동 빈 등록시 남는 로그 (AutoAppConfigTest 실행 결과)
수동 빈 등록과 자동 빈 등록에서 빈 이름이 같을 경우, 수동 빈 등록이 우선권을 가진다. (수동 빈이 자동 빈을 오버라이딩 해버린다.)
물론 개발자가 의도적으로 이런 결과를 기대했다면, 자동 보다는 수동이 우선권을 가지는 것이 좋다. 하지만 현실은 개발자가 의도적으로 설정해서 이런 결과가 만들어지기 보다는 여러 설정들이 꼬여서 이런 결과가 만들어지는 경우가 대부분이다! 그러면 정말 잡기 어려운 버그가 만들어진다. 항상 잡기 어려운 버그는 애매한 버그다. 그래서 최근 스프링 부트에서는 수동 빈 등록과 자동 빈 등록이 충돌나면 오류가 발생하도록 기본 값을 바꾸었다.
3) 수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러 (CoreApplicaiton 실행 결과)
<정리>
1) 자동 빈 등록 vs 자동 빈 등록일 때, 기본으로 ConflictingBeanDefinitionException 예외 발생
2) 수동 빈 등록 vs 자동 빈 등록일 때, 스프링은 기본으로 overriding
3) 수동 빈 등록 vs 자동 빈 등록일 때, 스프링 부트는 기본으로 overriding X, 오류 발생
- applicaion.properties 에 spring.main.allow-bean-definition-overriding=true 을 추가함으로써 overriding 이 가능하게 함
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[스프링 핵심 원리] 07. 의존관계 자동 주입 - 옵션 처리 & 생성자 주입을 선택해라! (0) | 2022.05.18 |
---|---|
[스프링 핵심 원리] 07. 의존관계 자동 주입 - 다양한 의존관계 주입 방법 (0) | 2022.05.18 |
[스프링 핵심 원리] 06. 컴포넌트 스캔 - 탐색 위치와 기본 스캔 대상 & 필터 (0) | 2022.05.18 |
[스프링 핵심 원리] 06. 컴포넌트 스캔 - 컴포넌트 스캔과 의존관계 자동 주입 시작하기 (0) | 2022.05.18 |
[스프링 핵심 원리] 05. 싱글톤 컨테이너 - @Configuration과 싱글톤 & @Configuration과 바이트코드 조작의 마법 (0) | 2022.05.17 |