[Spring] Component Scan
Component Scan 이란?
설정 정보(AppConfig.class) 없이 자동으로 스프링 빈을 등록해준다.
※ 스프링 빈 등록 방법
1. AppConfig 에 @Bean을 등록하여 의존 관계 주입
2. 각 Impl 생성자에 @Autowired 를 이용하여 자동으로 의존 관계 주입
@ComponentScan은 탐색 위치에 @Component 어노테이션이 붙은 모든 클래스를 스프링 빈으로 등록해줌.
AutoAppConfig.java
@Configuration
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
따라서 위와 같이, 별도의 의존 관계 설정 없이도, 자동으로 @Component 가 붙은 모든 클래스를 스프링 빈으로 자동 등록할 수 있다.
(위 코드에서는 기존의 AppConfig.java 에서 등록한 스프링 빈을 제외하기 위해 Filter를 사용하였다.)
필터(Filter)
: 컴포넌트 스캔의 범위를 지정하는데 사용한다.
- includeFilters : 컴포넌트 스캔 대상을 추가
- excludeFilters : 컴포넌트 스캔 대상에서 제외
※ 옵션
1. ANNOTATION : 기본값으로 어노테이션으로 인식해서 동작
2. ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해서 동작
3. ASPECTJ : Aspectj 패턴 사용
4. REGEX : 정규표현식
5. CUSTOM : TypeFilter 라는 인터페이스를 구현해서 처리
탐색 위치 지정
"basePackes"
@ComponentScan(
basePackages = "hello.core.member",
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
basePackes : 탐색할 패키지의 시작 위치를 지정한다. 이 패키지를 포함해서 하위 패키지를 모두 탐색.
if) 지정하지 않으면?
: @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 됨.
(-> 내 프로젝트에서는 AutoAppConfig.java의 패키지인 hello.core 패키지가 시작 위치.)
※ 추천 방법
설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것.
ex)
com.hello
com.hello.service
com.hello.repository
-> com.hello : 프로젝트 시작 루트, 여기에 AppConfig 같은 설정 정보를 두고, @ComponentScan을 붙이고 basePackes 생략.
cf) @SpringBootApplication 이 프로젝트 시작 루트에 자동으로 생성되는 것도 이 원리 ! -> 이 안에 @ComponentScan이 들어있음.