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 이라는 인터페이스를 구현해서 처리
출처 : 인프런 - 스프링 기본원리 핵심편. 김영한 강사