spring - 컴포넌트 스캔(Component Scan)

컴업·2021년 12월 21일
0

스프링 빈을 등록하는 전통적인 방식은 XML의 을 통해 등록하거나 아래처럼 자바 코드의 @Bean을 이용해 config파일에서 나열하는 것 입니다.

@Configuration
public class AppConfig {

    @Bean
    public aRepository aRepository() {
        return new ARepository();
    }

    @Bean
    public bClass bClass(){
        return new BClass();
    }
}

등록할 빈이 몇개 안된다면 큰 문제 없고 오히려 한눈에 보기 편할 수 있겠지만, 빈이 수십 수백개가 된다면 일일이 등록하는 것도 일이고, 누락되는 경우도 발생하게됩니다.

그래서 스프링은 config클래스 없이 자동으로 빈을 등록하는 컴포넌트 스캔을 제공하고있습니다.

@ComponentScan

컴포넌트 스캔을 설정할 수 있습니다.

@Configuration
@ComponentScan
public class AutoAppConfig {
}

AutoAppConfig 클래스를 만들고 @Configuration, @ComponentScan 어노테이션을 붙여줍니다.

  • excludeFilters: 특정 어노테이션, 클래스들을 컴포넌트 스캔 대상에서 제외할 수 있습니다.

    ex)
    @CompoenetScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))

  • basePackages: 스캔 대상 탐색 시작위치를 지정합니다. 이 패키지를 포함해 하위 패키지를 모두 스캔합니다. 만약 지정하지 않으면 @ComponentScan이 붙은 클래스 패키지가 시작위치가 됩니다.

    ex)
    @ComponentScan(basePackages = "hello.core")

스프링 부트를 사용한다면 대표 시작정보인 @SpringBootApplication을 프로젝트 루트에 두는 것이 관례인데, @ComponentScan이 이 안에 포함되어있습니다. 따라서 따로 설정하지 않아도 됩니다.

@Component

컴포넌트 스캔은 @Component 어노테이션이 붙은 클래스들을 클래스 명에서 첫번째 알파벳을 소문자로 바꾼 이름을 가진 빈으로 등록합니다.

ex) MemberRepository -> memberRepository

만약 빈 이름을 지정하고 싶다면 @Component("빈이름")으로 직접 부여할 수 있습니다. 단 이미 존재하는 빈 이름일 경우 나중에 등록한 빈으로 오버라이딩 해버립니다.

다음 어노테이션들은 @Component 어노테이션을 가지고있어 스캔 대상에 포함됩니다.

profile
좋은 사람, 좋은 개발자 (되는중.. :D)

0개의 댓글