Spring

[Spring] 컴포넌트 스캔(Component Scan)

큐범 2022. 8. 24. 01:39

Component

구성요소, 독립적인 단위 모듈이다.

유저가 사용하는 시스템에 대한 조작장치를 뜻한다.

 

 

컴포넌트 스캔과 자동 의존 관계 주입 동작

 

1.     @ComponentScan

@ComponentScan@Component가 붙은 모듈 클래스를 스프링 빈으로 등록한다.

-       빈 이름 기본 전략: CustomerServiceImpl -> customerServiceImpl

-       빈 이름 직접 지정: @Component("customerService")

 

2.     @Autowired 의존관계 자동 주입

생성자에 @Autowired 를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다. 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다.

따라서, 생성자에 파라미터가 많아도 찾아서 자동으로 주입한다.

 

컴포넌트 스캔 기본 대상

@Compoent: 컴포넌트 스캔에서 사용

@Controlller : 스프링 MVC 컨트롤러에서 사용

@Service : 스프링 비즈니스 로직에서 사용

@Repository : 스프링 데이터 접근 계층에서 사용

@Configuration : 스프링 설정 정보에서 사용

 

다음은 스프링에서 부가 기능을 수행한다.

@Controller : 스프링 MVC 컨트롤러로 인식

@Repository : 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.

@Configuration : 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가 처리를 한다.

@Service : 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 해당 클래스에 있는 것을 인지한다.

 

필터

-       includeFilters: 컴포넌트 스캔 대상을 추가로 지정한다.

-       excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정한다.

@Configuration
@ComponentScan(
        includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
        excludeFilters = @ComponentScan.Filter(classes = MyExcludeComponent.class)

)
static class ComponentFilterAppConfig{
}

FilterType 옵션

ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다

ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.

ASPECTJ: AspectJ 패턴 사용

REGEX: 정규 표현식

CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리

 

출처 : 인프런 - 스프링 기본원리 핵심편. 김영한 강사