본문 바로가기

IT/SPRING BOOT

Spring Component Scan에 대해 알아보자

오늘은 Spring Component Scan에 대해 알아보겠습니다.

ComponentScan은 간단히 말하면 Spring프로젝트를 할때 클래스를 Spring Bean으로 만들때 특정 애노테이션이 달린 클래스를 검색할 위치를 Spring에 알리는 것입니다.

- Spring Application에서 @ComponentScan 사용

@SpringBootApplication 애노테이션을 등록하고 정의를 따라가보면 @ComponentScan 애노테이션을 확인 하실 수 있습니다.

ComponentScan 대상

  • @Component 애노테이션이 붙어 있으면 스캔 대상이 됩니다.
  • @Controller, @Service, @Repository 모두 @Component가 설정되어 있으므로 스캔에 대상이 됩니다.
  • @Configuration 애노테이션에도 @Component가 설정되어 있으므로 스캔에 대상이 되고, 싱글톤을 유지합니다.

인수가 없는 @ComponentScan

  • 인수가 없는 @ComponentScan은 Spring에 현재 패키지와 모든 하위 패키지를 스캔하도록 지시합니다.

인수가 있는 @ComponentScan

@ComponentScan(basePackages = "co.kr.pet.gommi")
@Configuration
public class SpringComponentScanApp {
   // ...
}

basePackages 속성으로 위와 같이 패키지를 지정하면 지정된 패키지 하위만 ComponentScan의 대상이 됩니다.

위의 사용자 정의 ComponentScan은 Spring Boot @SpringBootApplication과 동일한 결과를 보여줍니다.

@SpringBootApplication
@ComponentScan(basePackages = "co.kr.pet.gommi")

1. 여러 패키지의 @ComponentScan

여러패키지를 사용하려면 문자열 배열을 사용하면 됩니다.

스프링 4.1.1부터 쉽표, 세미콜롤 또는 공백을 사용하여 패키지 목록을 구분할 수 있습니다.

@ComponentScan(basePackages = "co.kr.pet.gommi","co.kr.favorite.movie")

2. @ComponentScan with Exclusions

필터를 사용하여 제외할 클래스의 패턴을 지정할 수 있습니다.

@ComponentScan(excludeFilters = 
  @ComponentScan.Filter(type=FilterType.REGEX,
    pattern="co\\.kr\\.pet\\.gommi\\..*"))

필터링하기 위한 몇 가지 옵션을 지원 하므로 다른 필터 유형을 선택하실 수 있습니다.

@ComponentScan(excludeFilters = 
  @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Gommi.class))

정리

오늘은 ComponentScan에 대해 알아봤습니다. 간단하게 나마 ComponentScan이 무엇인지 @ComponentScan 애노테이션을 사용하여 컴포넌트를 검색하는 법을 알게 되셨으면 좋겠습니다.