@ComponentScan의 기본 동작
클래스에 @Configuration 어노테이션과 함께 @ComponentScan 어노테이션이 붙어 있으면, 해당 Configuration 은 해당 패키지 하위의 모든 클래스를 스캔해 @Component 어노테이션이 붙은 객체들을 모두 Bean으로 만든다.
예를 들어 다음과 같은 패키지 구조와 파일들이 있다고 해보자.
section8 패키지는 다음 경로에 있다: com.kotlinworld.spring.di.section8
이곳에서 ScanConfiguration파일은 @Configuration 어노테이션과 @ComponentScan 어노테이션이 붙은 클래스이고
@ComponentScan
@Configuration
class ScanConfiguration
ScanRequiredUseCases는 com.kotlinworld.spring.di.section8.scan 패키지에 있는 스캔이 있는 유즈 케이스이고
@Component
class ScanRequiredUseCase
ShouldNotScanUseCase는 com.kotlinworld.spring.di.section8 패키지에 있는 스캔이 되면 안되는 유즈 케이스이다.
@Component
class ShouldNotScanUseCase
여기서 ScanConfiguration을 사용해 IOC Container을 만든 다음 모든 bean을 출력해보자.
fun main(args: Array<String>) {
val context = AnnotationConfigApplicationContext(ScanConfiguration::class.java)
context.beanDefinitionNames.forEach {
println(it)
}
}
그러면 결과는 다음과 같이 나온다. ScanRequiedUseCase와 ShouldNotScanUseCase가 모두 Bean으로 만들어져 등록된 것을 볼 수 있다.
이는 @ComponentScan의 기본 동작이 해당 클래스가 있는 패키지와 하위의 모든 패키지를 스캔해 @Component 가 붙은 클래스들을 초기화해 Bean으로 등록하는 방식으로 동작하기 때문이다.
하지만 우리가 이곳에서 원한 것은 특정 패키지 하위만 스캔하는 것이었다. @ComponentScan은 이를 위한 기능을 제공한다.
@ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기
@ComponentScan 어노테이션은 인자로 String 타입의 value를 받는데, 이 value에 특정 패키지를 넣으면 특정 패키지 하위의 @Component 어노테이션만 스캔한다.
따라서 com.kotlinworld.spring.di.section8.scan 패키지 하위의 @Component 만 스캔하고 싶다면 다음과 같이 변경하면 된다.
@ComponentScan("com.kotlinworld.spring.di.section8.scan")
@Configuration
class ScanConfiguration
이제 다시 모든 Bean을 출력하는 코드를 실행해보자.
fun main(args: Array<String>) {
val context = AnnotationConfigApplicationContext(ScanConfiguration::class.java)
context.beanDefinitionNames.forEach {
println(it)
}
}
그러면 다음과 같은 결과가 나오는 것을 볼 수 있다. ScanRequiredUseCase만 등록된 것을 볼 수 있다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.