♪ 학습 내용
컴포넌트 스캔 필터 및 중복 등록
* 컴포넌트 스캔 필터
컴포넌트 스캔의 필터( Filter ) 를 이용해 내가 원하는 대상을 컴포넌트 스캔 대상에 추가하거나 제외시킬 수 있다.
임의로 만든 MyIncludeComponent 와 MyExcludeComponent 애노테이션을 각각 BeanA 와 BeanB클래스에 적용
FilterType.ANNOTATION 은 애노테이션과 관련된 필터를 의미한다.
- includeFilters 에 @MyIncludeComponent 추가했다
- excludeFilters 에 @MyExcludeComponent 추가했다
assertThat(beanA).isNotNull();
//실행 결과 : 통과
//beanA는 @MyIncludeComponent 애노테이션이 붙었기 때문에
//컴포넌트 스캔 대상에 추가, Bean 등록 O
반대로
ac.getBean("beanB", BeanB.class);
//BeanB는 @MyExcludeComponent 애노테이션 적용
//컴포넌트 스캔 대상에서 제외. Bean 등록 x
그렇기 때문에 람다식으로 작성된 해당 로직 실행하면
조회하려는 스프링 빈이 존재하지 않기 때문에 NoSuchBeanDefinition예외가 터진다
실행 결과 : 역시 통과이다
+ 전에 컴포넌트 스캔 시에 클래스 명을 Bean 이름(앞글자 소문자)으로 한다는 것을 학습했기 때문에
getBean 시에 이름을 클래스명 (앞글자 소문자)으로 조회했다
결국 includeFilter 에 추가 시에 스캔 대상이 되고 , excludeFilter 에 추가 시에는 스캔 대상에서 제외된다.
+ 앞에서는 ANNOTATION을 필터 타입으로 했지만 외에도 4가지 옵션이 더 있음
실제로 개발할 때에는 @Component를 이용하면 충분하기 때문에 includeFilters 는 잘 사용하지 않는다고 한다
* 컴포넌트 스캔 중복 등록
컴포넌트 스캔 중복 케이스
1. 자동 등록 과 자동 등록
자동으로 등록되는 스프링 빈 이름이 같을 경우
ConflictingBeanDefinitionExcption 예외 발생
2. 수동 등록 - 자동 등록
수동으로 등록된 스프링 빈과 자동으로 등록되는 빈의 이름이 같은 경우
수동으로 등록된 스프링 빈이 우선으로 등록된다 ! ! ( 자동 등록 빈을 오버라이딩 해버려서 )
(어찌 보면 당연한..)
의도했다면 좋은 일이지만 보통은 의도치 않게 발생한 상황일텐데 그냥 수동으로 우선 등록되어버리면
정말 찾기 어려운 버그가 되어버린다.
내가 스프링의 달인도 아닐 뿐더러 실무에서 개발은 혼자하는 것이 아니기 때문에
이렇게 애매할 바에는 차라리 오류를 보는 것이 낫다!!
그래서 최근 스프링 부트에서는 오류를 발생시킨다고 함 (설정 가능하다)
실제로 CoreApplication 통해서 실행 해보았더니 다음과 같이 오류를 확인할 수 가 있었다.
김영한 선생님 말대로 참 친절한 Spring인듯 ^^
♪ 다음 학습 내용
여러 의존관계 자동 주입 방식
'Dev > Spring' 카테고리의 다른 글
[Spring 기본] 의존관계 자동 주입 (2) (0) | 2022.11.18 |
---|---|
[Spring 기본] 의존관계 자동 주입 (1) (0) | 2022.11.13 |
[Spring 기본] 컴포넌트 스캔 (1) (0) | 2022.11.10 |
[Spring 기본] 싱글톤 컨테이너 (2) (0) | 2022.11.09 |
[Spring 기본] 싱글톤 컨테이너 (1) (0) | 2022.11.09 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!