Spring

[Spring] Component Scan

배씌 2024. 5. 28. 00:14

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이 들어있음.