@ComponentScan
이전에 우리는 빈 등록을 수동으로 등록했다.
AppConfig에서 의존관계 주입을 하고, 거기에 @Bean을 입력하여 스프링 컨테이너에 빈 등록을 했다.
그러나 빈이 수 백개가 있다면 하나하나 빈을 등록해야 하기 때문에 번거로움이 있다.
그래서 등장한 것이 ComponentScan이다. ComponentScan은 설정 정보에 붙여주고, Component가 붙은 클래스를 찾아 빈으로 등록한다.
클래스를 찾을 때, 우리는 basePackages를 이용하여 탐색할 경로를 지정해줄 수 있다.
default값은 ComponentScan이 있는 설정 정보 클래스의 패키지가 시작 위치가 된다.
그렇다면 빈은 등록이 됐지만, 의존관계 주입은 어떻게 해줄까?
Component가 붙은 클래스에서 생성자에 @Autowired를 붙여주면 자동 의존관계 주입이 된다.
빈 등록과 의존관계 주입
1. 처음에 ComponentScan이 Component가 붙은 클래스들을 찾아다니며 스프링 빈에 등록한다.
스프링 빈이 등록될 때 이름은 클래스 이름으로 등록된다. 단, 앞글자가 소문자로 바뀌어 등록이 된다.
2. 생성자에 @Autowired를 붙여 의존관계 주입을 한다.
@Autowired를 주입하면 스프링 컨테이너에서 타입이 같은 빈을 찾아 주입해준다.
하지만 만약 여기서 타입이 같은 빈이 여러 개라면?? -> 충돌이 발생하게 된다. 이 부분은 뒤에서 배운다고 하셨다.
필터
강의에서는 MyIncludeComponent, MyExcludeComponent 어노테이션을 따로 만들어서 적용을 했다.
물론, 해당 어노테이션들의 코드는 같았다. 그렇다면 왜 둘을 따로 만들었을까라는 생각이 들었다.
아마 내 생각에는 각각의 어노테이션이 붙은 것들을 컴포넌트 스캔 대상을 추가할지, 제외할 지 구별하기 쉽게 하기 위해서가 아닐까라는 생각이 들었다. ComponentScan에서 필터 옵션을 넣을 때, includeFilters와 excludeFilters를 사용하는데 여기서 쉽게 구별하기 위해서인 것 같다.
아래는 필터 공부를 하다가 헷갈리는 부분이 있어 QnA 질문에 올렸다.
Q.
BeanA와 BeanB는 따로 @Component가 붙어있지 않습니다. 그래서 저는 혹시 만드신 MyExcludeComponent와 MyIncludeComponent에 붙어 있는 어노테이션 중에 @Component가 있을까해서 찾아보았는데 없었습니다.
ComponentScan에서 사용하는 includeFilters에도 있나 했는데 없었습니다.
그렇다면 클래스에 따로 Component가 붙어있지 않을 때도(물론 붙어있으면 빈으로 등록되는 것은 알고 있습니다!),
includeFilter를 사용하게 되면 스프링 빈으로 등록이 되는건가요?
A.
includeFilters의 기능은 classes에 있는 클래스를 @Component 붙여진 것과 같은 역할을 한다.
같은 타입이 둘 이상인 빈을 조회할 때, 수동 등록 vs 자동 등록
우리는 @ComponentScan을 이용한 자동 등록과 @Bean을 사용하여 수동 등록을 할 수 있다.
1. 자동 등록에서의 충돌
OrderServiceImpl과 MemberServiceImpl의 Component에 같은 이름을 붙여보았다.
그리고 Test에서 실행했더니 BeanDefinitionStoreException가 발생하였다.
2. 자동 등록 vs 수동 등록
AutoAppConfig에 빈 하나를 수동 등록(Component로 등록된 빈과 같은 이름으로)하고 테스트를 실행보았다.
Test가 통과는 되지만, Overriding bean definition 이라는 문구가 출력된다.
오버라이딩은 수동 빈이 자동 빈을 오버라이딩 해버린다.
여기서 이제 CoreApplication을 실행하면 실패하게 된다.
빈이 이미 등록되있다고 하면서 error를 발생시킨다.
출처 : 인프런 스프링 핵심 원리 - 기본편 (김영한 강사님)
'Spring 강의 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
스프링 핵심 원리 - 빈 생명주기 콜백(2022.03.12 수정) (0) | 2021.08.09 |
---|---|
스프링 핵심 원리 - 의존관계 자동 주입(2022.03.12 수정) (0) | 2021.08.06 |
스프링 핵심 원리 - 싱글톤 컨테이너 (0) | 2021.08.04 |
스프링 핵심 원리 - 스프링 컨테이너와 스프링 빈 (0) | 2021.08.02 |
스프링 핵심 원리 이해2 - 객체 지향 원리 적용 (0) | 2021.07.30 |