클라우드 낚시꾼

[Spring] 컴포넌트 스캔: 탐색 위치와 기본 스캔 대상 & 필터 본문

BE Framework/SpringBasic

[Spring] 컴포넌트 스캔: 탐색 위치와 기본 스캔 대상 & 필터

KanuBang 2024. 3. 16. 16:38
728x90

1. ComponentScan 탐색 위치

@ComponentScan 애노테이션이 붙은 설정 클래스로 스프링 컨테이너를 생성할 때, @Component 애노테이션이 붙은 클래스들은 Bean으로 등록된다. 그런데 @Component 애노테이션이 붙은 클래스들을 탐색할 때 시작점은 어딜까?

탐색 위치

  • basePackages: 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색한다.
  • basePackageClasses: 지정한 클래스의 패키지를 탐색 위치로 지정한다.
  • 미지정: @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

권장하는 방법

프로젝트 구조 (예시)

 

위와 같은 프로젝트 구조가 있다고 해보자. 설정 정보 클래스를 어디에다 둬야 될까? 권장되는 방법은 따로 탐색 위치를 지정하지 않고, 설정 정보 클래스를 프로젝트의 최상단에 두는 것이다. 즉, com.hello에 설정 정보 클래스를 두고 @ComponentScan 애노테이션을 붙인다. 또한, 프로젝트 설정을 대표하는 정보는 프로젝트 시작 루트에 위치시키는 것이 관례이기도 하다. 


2. ComponentScan의 기본 스캔 대상

ComponentScan의 기본 스캔 대상

 

컴포넌트 스캔은 @Component 뿐만 아니라 위의 내용도 추가로 스캔 대상에 포함한다. 해당 클래스의 소스 코드를 보면 @Component를 포함하고 있는 것을 볼 수 있다.

 

@Controller

 

ComponentScan의 대상인 @Controller가 @Component를 포함하고 있는 것을 확인할 수 있다.


3. 필터

필터

- includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.

- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.

 

위 코드의 ComponentScan은 includeFilters로 MyIncludeComponent 애노테이션이 붙은 클래스를 추가로 컴포넌트 스캔하고, excludeFilters로 MyExcludeComponent 애노테이션이 붙은 클래스를 컴포넌트 스캔 대상에서 제외하고 있다. 

 

FilterType 옵션

FilterType

 

includeFilters는 잘 사용되지 않는다

 

이 글의 문단 1에 적었듯이, 프로젝트 최상단에 설정 정보를 두는 것이 권장된다. 그렇기에 사실상 프로젝트 전체를 ComponentScan 하는 상황에서 includeFilters를 사용할 상황은 거의 발생하지 않는다.


4. 세줄 요약 (+ 출처) 

  1. 컴포넌트 스캔의 탐색 위치는 basePackages, basePackageClasses로 설정할 수 있다. 또는, 탐색 위치를 미지정하여 @ComponentScan이 위치한 패키지를 컴포넌트 스캔 탐색 위치로 설정할 수 있다.
  2. @ComponentScan 설정 클래스를 프로젝트 최상단에 두는 방법이 권장된다.
  3. includeFilters, excludeFilters로 컴포넌트 스캔 대상에 추가할 / 배제할 대상을 지정할 수 있다.
 

스프링 핵심 원리 - 기본편 강의 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 

728x90