본문 바로가기

코딩/JAVA 공부

[Spring] 컴포넌트 스캔

 

직전 게시글에선 Bean 등록이 필요한 설정 정보를 직접 나열해 진행하는 방법을 알아봤다.

예시는 2개의 Bean 만 등록했지만, 실제론 수백 개의 빈을 등록해야 하기 때문에 어마어마한 작업이다.

그래서 스프링은 자동으로 빈을 등록하는 컴포넌트 스캔이라는 기능이 있다!

 

 

@ComponentScan

주석이 붙어있는 클래스는 해당 클래스가 있는 패키지부터 하위 패키지까지 모든 클래스들 스캔해서

@Component 주석이 달린 클래스를 스프링 빈에 등록한다.

 * 따라서 기존 클래스 (MemberRepository, MemberService) 에 @Component 주석을 붙어야 한다.

이 클래스를  AutoAppConfig 로 구현하면 아래와 같다.

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}

@ComponentScan 주석 안에 Filter를 통해 특정 클래스는 스캔하지 않거나, 추가로 스캔하는 걸 필터링할 수 있다.

위 코드는 @Configuration 주석이 붙어있는 것은 스캔하지 않는 것이다.

만약 여기에 매뉴얼로 추가 빈을 등록한 경우, 그런데 해당 빈에 @Component 주석이 있어 이중으로 스캔한 경우 오류가 발생한다.

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
    @Bean(name = "memoryMemberRepository")
    MemberRepository memberRepository() {
    	return new MemoryMemberRepository();
    }
}

MemoryMemberRepository 클래스에 이미 @Component 주석이 있고, 추가로 수동 등록한 경우 Spring에서 오류를 발생해 준다!

사용 방법은 기존과 동일하게 컨테이너 생성 후 getBean을 통해 꺼내면 된다.

ApplicationContext ac = new AnnotationCOnfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);