💡 Component Scan
- 지금까지 스프링 빈을 등록할때 @Bean이나 XML의 <bean>을 통해서 등록을 했다
- 예제는 몇개 안되지만 실무에선 수백개가 넘기 떄문에 귀찮고 누락 문제도 발생
- 그래서 설정정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 사용한다
- 또, 의존관계도 자동으로 주입하는 @Autowired 기능도 제공한다
- 바로 코드로 알아보자, 기존의 AppConfig는 학습용으로 냅두고 새로운 AutoAppConfig 클래스를 생성한다
탐색 위치와 기본 스캔 대상
- 일반적으로 프로젝트 최상단에 @ComponentScan을 잡으면 된다
- @ComponentScan(basePackages = "hello.core) = 탐색위치 지정
- @ComponentScan(basePackages = {"hello.core", "hello.service"} 여러개 지정도 가능
- 스캔 대상
- @Component
- @Controller
- @Service
- @Repsitory
- @Configuration
Filter
- includeFilters = 컴포넌트 스캔 대상을 추가로 지정
- excludeFilters = 컴포넌트 스캔에서 제외할 대상 지정
- 바로 실습으로 알아보자
Filter Type Option
- ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
- ex) org.example.SomeAnnotation
- ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
- ex) org.example.SomeClass
- ASPECTJ: AspectJ 패턴 사용
- ex) org.example..*Service+
- REGEX: 정규 표현식
- ex) org\.example\.Default.*
- CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리
- ex) org.example.MyTypeFilter
중복등록과 충돌 (빈 이름 충돌)
자동 vs 자동
수동 vs 자동
2가지 상황을 예시로 들어본다
자동 vs 자동
- 기존 구현체에 붙인 @Component에 ("service") 이름을 똑같이 맟춰주고 테스트를 돌리면,
ConflictingBeanDefinitionException이 뜸
수동 vs 자동
- 기존 구현체에 붙은 @Component와 수동으로 추가한 빈 이름을 똑같이 테스트를 돌리면 테스트 성공은 하지만,
수동 등록 빈이 우선순위가 높으므로 자동 빈을 오버라이딩 해버리지만,
스프링 부트는 기본값으로 어플리케이션 실행 시 오류를 내면서 중지시킴
'Inflearn 강의 > Spring 핵심원리 기본' 카테고리의 다른 글
9 - Bean 초기화, 소멸 메소드 (0) | 2022.10.22 |
---|---|
8 - 의존관계 자동 주입 & 옵션 처리 (0) | 2022.10.18 |
6 - @Confituration과 Singleton / 바이트코드 조작 (0) | 2022.10.17 |
5 - Singleton Container with Stateless (0) | 2022.10.17 |
4 - Singleton Pattern (0) | 2022.10.17 |