컴포넌트 스캔

Sangkyeong Lee·2021년 5월 19일

인프런 강의 < 스프링 핵심 원리 - 기본편 > 정리


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

  • 스프링 빈이 수십, 수백개가 되면 일일이 @Bean을 이용해 등록하기 힘들어진다.
  • 자동으로 스프링 빈을 등록하는 컴포넌트 스캔을 이용한다.
  • 의존관계는 @Autowired를 이용해서 자동으로 주입 시켜준다.
  • @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) /// @Configuration 애노테이션 제외
)
public class AutoAppConfig {
}

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

1. @ComponentScan

  • @Component가 붙은 모든 클래스를 스프링 빈으로 등록핳ㄴ다
  • 스프링 빈의 이름은 클래스명에서 맨 앞글자를 소문자로 바꾼 뒤 사용한다.

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

  • @Autowirde를 지정하면, 스프링 컨테이너가 알아서 해당 스프링 빈을 주입한다.
  • 조회 방식은 getBean(MemberRepository.class)와 동일하다.
  • 위 그림처럼 파라미터가 많아도 다 찾아서 주입해준다.

컴포넌트 탐색 위치 및 스캔 대상

탐색위치

@ComponentScan(
        basePackages = "hello.core.member"
)
  • basePackages 키워드를 통해서 탐색할 패키지의 시작 위치를 정할 수 있다
  • 보통 따로 지정하지 않고 AppConfig 같은 설정을 최상위 패키지에 만들어서 하위 패키지를 모두 탐색할 수 있도록 한다.

스캔 대상

  • @Component 뿐만 아니라 추가적으로 스캔한다.
    • @Controller: 스프링 MVC 컨트롤러에서 사용
    • @Service: 스프링 비즈니스 로직에서 사용
    • @Repository: 스프링 데이터 접근 계층에서 사용
    • @Configuration: 스프링 설정 정보에서 사용

컴포넌트 스캔에서 중복 등록과 충돌

  1. 자동 빈 등록 vs 자동 빈 등록
  2. 수동 빈 등록 vs 자동 빈 등록

자동 vs 자동

  • 스프링이 오류 발생시킴
    • ConflictingBeanDefinitionException 예외 발생

수동 vs 자동

@Component
public class MemoryMemberRepository implements MemberRepository {}
@Configuration
@ComponentScan(
        excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
                    Configuration.class)
)
public class AutoAppConfig {
    @Bean(name = "memoryMemberRepository")
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • 수동으로 등록한 빈이 우선권을 가진다
  • 수동 빈이 자동 빈을 오버라이딩 한다.
  • 스프링 부트에서는 디폴트값으로 오버라이딩 되지 않게 설정되어 있어 오류 발생

< 자료 출처: 스프링 핵심 원리 - 기본편 >

profile
💻Backend Developer

0개의 댓글