Spring/Dependency Injection

[Spring] @ComponentScan 사용해 특정 패키지 하위의 의존성을 스캔하는 방법 알아보기

Dev.Cho 2024. 11. 18. 07:51
반응형

@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는 다음 페이지에서 확인할 수 있습니다.
반응형