컴포넌트 스캔
- 설정 정보 없이 자동으로 스프링 빈을 등록해주는 어노테이션
- @Component 어노테이션이 붙은 모든 클래스들을 Spring Bean으로 자동 등록
- basePackages 키워드를 통해 ComponentScan 대상 범위를 지정할 수 있지만, 디폴트는 @ComponentScan이 붙은 클래스의 패키지가 컴포넌트 스캔 시작 위치가 되므로 @ComponentScan 어노테이션이 붙은 클래스의 위치를 프로젝트 최상단에 두는 것을 추천
- excludeFilters 키워드를 통해 원하지 않는 설정 정보를 ComponentScan 대상에서 제외 가능
- @Bean 어노테이션을 통해 직접 의존관계를 명시하는 대신 @Autowired 어노테이션을 통해 의존관계 자동 주입
- @Autowired를 지정할 경우 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입
package com.tistory.jaimemin.core.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
// basePackages 지정하지 않더라도 com.tistory.jaimemin.core.* 를 탐색하며 스프링 빈 등록
@Configuration
@ComponentScan(basePackages = "com.tistory.jaimemin.core")
public class AppConfig {
}
컴포넌트 스캔 기본 대상
컴포넌트 스캔은 @Component 뿐만 아니라 아래와 같은 어노테이션들도 대상에 포함 (아래 리스트된 어노테이션들이 모두 @Component를 포함하기 때문에 포함된다)
- @Controller: Spring MVC 컨트롤러에서 사용
- @Configuration: 스프링 설정 정보에서 사용
- @Repository: 스프링 데이터 접근 계층에서 사용
- @Service: 스프링 비즈니스 로직에서 사용
컴포넌트 스캔에서 동일한 이름의 빈이 중복 등록된다면?
아래와 같이 두 가지 케이스가 존재합니다.
- 자동 빈 등록 vs 자동 빈 등록
- ConflictingBeanDefinitionException 예외가 발생
- 자동 빈 등록 vs 수동 빈 등록
- 수동 빈 등록이 우선권을 가짐 즉, 수동 빈이 자동 빈을 오버라이딩
- 의도되지 않았다면 잡기 어려운 버그이므로 최근 스프링 부트에서는 이러한 경우 충돌 에러가 발생하도록 변경
- 의도되었다면 application.yml 혹은 application.properties에 spring.main.allow-bean-definition-overriding=true 를 추가해주면 수동 빈이 자동 빈을 오버라이딩함
참고
인프런 스프링 핵심 원리 - 기본편 (김영한 강사님)
반응형
'Spring' 카테고리의 다른 글
클라이언트에서 서버로 HTTP 요청 메시지 보내는 방법 (0) | 2021.06.02 |
---|---|
빈 스코프 (Bean Scope) (0) | 2021.05.26 |
스프링 빈 생명주기 (Spring Bean Life Cycle) (0) | 2021.05.25 |
@Autowired - 의존관계 주입 (2) | 2021.05.18 |
Spring Boot Intellij IDEA MySQL 연동 에러 발생할 경우 (2) | 2019.10.03 |