Spring

@ComponentScan - 컴포넌트 스캔

꾸준함. 2021. 5. 17. 21:39

컴포넌트 스캔

  • 설정 정보 없이 자동으로 스프링 빈을 등록해주는 어노테이션
  • @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: 스프링 비즈니스 로직에서 사용

 

컴포넌트 스캔에서 동일한 이름의 빈이 중복 등록된다면?

아래와 같이 두 가지 케이스가 존재합니다.

  1. 자동 빈 등록 vs 자동 빈 등록
    • ConflictingBeanDefinitionException 예외가 발생
  2. 자동 빈 등록 vs 수동 빈 등록
    • 수동 빈 등록이 우선권을 가짐 즉, 수동 빈이 자동 빈을 오버라이딩
    • 의도되지 않았다면 잡기 어려운 버그이므로 최근 스프링 부트에서는 이러한 경우 충돌 에러가 발생하도록 변경
    • 의도되었다면 application.yml 혹은 application.properties에 spring.main.allow-bean-definition-overriding=true 를 추가해주면 수동 빈이 자동 빈을 오버라이딩함

 

참고

인프런 스프링 핵심 원리 - 기본편 (김영한 강사님)

 

 

반응형