모든 자바 클래스를 다 컴포넌트 스캔하면 시간이 오래 걸린다. 그래서 꼭 필요한 위치부터 탐색하도록 시작위치를 지정할 수 있다.
- basePackages: 탐색할 패키지의 시작 위치를 정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
- ex. basePackages = "hello.core"
- basePackagesClasses : 지정한 클래스의 패키지를 시작 위치로 지정한다.
- 디폴트는 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
* 권장 하는 방법
- 설정 정보의 클래스 위치를 프로젝트 최상단에 두고, 패키치 위치를 지정하지 않는 것을 추천한다.
ex. 아래와 같은 프로젝트 구조인 경우,
- com.hello
- com.hello.service
- com.hello.repository
-> com.hello : 프로젝트의 시작 루트이므로, 여기에 AppConfig와 같은메인 설정정보를 두고, @ComponenetScan 에노테이션을 붙이고 basePackages 지정은 생략한다. 이렇게 하면, com.hello를 포함한 하위는 모두 자동으로 컴포넌트 스캔의 대상이 된다.
- 참고로 스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication를 프로젝트 시작 루트 위치에 두는 것이 관례이다. 이 설정 안에 @ComponentScan 이 들어있다.
* 컴포넌트의 스캔 기본 대상
컴포넌트 스캔은 @Component 뿐만 아니라 아래와 같은 내용에도 추가로 대상에 포함한다.
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정정보에서 사용
-> 위 에노테이션에서도 Component가 기본으로 들어가있다는 뜻.
컴포넌트 스캔의 용도 뿐만 아니라 다음 애노테이션이 있으면 스프링은 부가 기능을 수행한다.
@Controller : 스프링 MVC 컨트롤러로 인식
@Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.
@Configuration : 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가처리를 한다@Service : 사실 @Service 는 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 여기에있겠구나 라고 비즈니스 계층을 인식하는데 도움이 된다.
- useDefaultFilters 옵션은 기본으로 켜져있는데, 이 옵션을 끄면 기본 스캔 대상들이 제외된다. 그냥 이런 옵션이 있구나 정도 알고 넘어가자.
사실 애노테이션에는 상속관계라는 것이 없다. 그래서 이렇게 애노테이션이 특정 애노테이션을 들고 있는 것을 인식할 수 있는 것은 자바 언어가 지원하는 기능은 아니고, 스프링이 지원하는 기능이다.
'Spring > 스프링 핵심원리 - 기본편' 카테고리의 다른 글
의존관계 자동주입 (2) 등록한 빈이 2개 이상일때 @Qualifier @Primary (0) | 2022.04.07 |
---|---|
의존관계 자동주입 (1) 다양한 의존관계 주입 방법 (0) | 2022.04.07 |
@ComponentScan @Component @Autowired (0) | 2022.03.26 |
@Configuration 과 싱글톤 (0) | 2022.03.26 |
싱글톤 패턴? 싱글톤 컨테이너 / 스프링 컨테이너 (0) | 2022.03.24 |