@ComponentScan
- @ComponentScan은 @Component가 붙은 모든 클래스를 빈으로 등록해준다. 이 때 스프링 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자는 소문자를 사용한다. @ComponentScan("service1") 이런식으로 빈의 이름을 설정해줄 수도 있다.
- 수동으로 빈을 등록할 때에는 빈 설정파일을 만들어서 @Configuration을 붙여주고 그 안에 @Bean을 만들어서 빈을 생성해었다. @ComponentScan은 설정파일을 굳이 만들지 않아도 자동으로 @Component 애노테이션이 붙은 클래스를 찾아서 빈으로 등록해주는 역할을 한다.
- @ComponentScan은 스캔의 용도 뿐만 아니라 다음 애노테이션들이 있으면 부가적인 기능도 수행한다.
1. @Contorller : 스프링 MVC의 컨트롤러로 인식
2. @Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 스프링 예외로 변환해준다.
3. @Configuration : 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가처리를 한다.
(SpringCGLB이용하여 싱글톤 로직)
4. @Service : 사실 @Service는 특별한 기능이 있지 않지만, 개발자들이 이 애노테이션을 보면
핵심 비즈니스 로직이 여기에 있겠구나 라고 비즈니스 계층을 인식하는데 도움을 준다.
@Autowired (의존관계 자동주입)
- 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입해준다.
- @Autowired는 타입기반으로 주입을 해주며 생성자에 파라메터가 많아도 다 알아서 찾아서 자동으로 주입해준다.
@ComponentScan 설명 다음에 @Autowired 설명을 한 이유가 있다.
스프링 컨테이너가 동작하는 순서대로 적은 것이다. 스프링 컨테이너는 처음에 생성이 되면 빈을 등록한다. @ComponentScan이 있으면 @Componen 애노테이션이 있는 클래스를 모두 찾아서 빈으로 등록하고, 그 빈들의 의존관계를 주입한다. 의존관계를 @Autowired로 자동주입하게 설정했으면 스프링은 @Autowired를 보고 빈들의 의존관계를 자동으로 설정해준다.
@ComponentScan의 Filter
- @ComponentScan은 includeFilters와 excludeFilters를 이용해서 스캔대상을 포함하거나 제외할 수 있다.
- basePackages : 탐색할 패키지의 시작 위치를 설정한다. 이 패키지를 포함한 하위 패키지를 모두 탐색한다.
- baseClasses: 탐색할 클래스의 시작 위치를 설정한다.
- 만약 아무 설정이 없으면 @ComponentScan이 붙은 클래스가 포함된 패키지가 시작위치가 된다.
- excludeFilters : ComponentScan에서 제외할 대상을 지정한다.
- includeFilters : excludeFilters와 사용코드는 똑같다. ComponentScan의 대상을 추가로 지정한다.
권장하는 방법?
패키지 위치를 지정하지 않고, 설정 정보클래스의 위치를 프로젝트 최상단에 두는 것이다. 최근 스프링부트도 이 방법을 기본으로 제공한다.
'JAVA > Spring' 카테고리의 다른 글
빈 생명주기 콜백 (0) | 2021.12.18 |
---|---|
의존관계 자동주입 (0) | 2021.12.17 |
싱글톤 패턴과 스프링 컨테이너 (0) | 2021.12.15 |
Spring Socket에 대해 알아보자! - 2. WebSocket 만들어보자 (0) | 2020.06.23 |
Spring Socket에 대해 알아보자! - 1. WebSocket (0) | 2020.06.18 |