1 분 소요

본 포스트는 Inflearn의 김영한님 강의를 바탕으로 작성했습니다.

컴포넌트 스캔

  • 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다.
  • 컴포넌트 스캔을 사용하면 @Component가 붙은 클래스를 찾아서 다 빈으로 등록한다.
  • @Repository, @Service, @Configuration, @Controller를 까보면 안에 @Component를 가지고 있다. -> 다 빈으로 등록된다.(Spring이 제공하는 기능)
  • 컴포넌트 스캔을 사용하려면 @ComponentScan을 설정 정보에 붙여줘야 한다. (@SpringBootApplication 안에 @ComponentScan이 있어서 default로 쓰면 최상위 패키지부터 훑는다.)

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

img1

@ComponentScan 과정

  1. @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
  2. 스프링 빈의 기본 이름은 클래스명을 사용하는데 맨 앞글자는 소문자로 바뀐다.
  3. 이름을 직접 지정할 수도 있는데 @Component(“지정할 이름”) <- 이런 식으로 부여하면 된다.

img2

@Autowired 의존관계 주입 과정

  1. 생성자에 @Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 의존관계를 주입한다.
  2. 기본 전략은 같은 타입의 빈을 찾는 것이다. -> getBean(MemberRepository.class) 와 동일하다고 생각하면 된다.
  3. 생성자에 파라미터가 많아도 알아서 다 찾아서 의존관계를 주입한다.

컴포넌트 스캔 위치

@ComponentScan(
          basePackages = "hello.core",
)
  • basePackages 값을 설정해서 시작 위치를 지정할 수 있다.
  • 그냥 프로젝트 시작 루트 위치에 두고 쓰는게 좋다. (default값)

컴포넌트 스캔 대상

  • @Component가 붙은 모든 것이다.
  • 위에 설명한 것처럼 @Repository, @Configuration, @Service, @Controller 도 스캔 대상이다.(아래 코드 참고, @Component를 가지고 있다.)

@Component
  public @interface Controller {
  }
  @Component
  public @interface Service {
  }
  @Component
  public @interface Configuration {
  }


필터

  • includeFilters : 컴포넌트 스캔 대상 추가 지정
  • excludeFilters : 컴포넌트 스캔에서 제외할 대상 지정
  • 최근 Spring은 컴포넌트 스캔을 기본으로 제공한다. 그리고 옵션을 변경하면서 쓰기보다는 기본 설정대로 사용하는 게 좋다.

중복 등록과 충돌

  • 컴포넌트 스캔에 같은 빈 이름을 등록하면 충돌이 발생한다.
    1. 자동 빈 등록 vs 자동 빈 등록
      • ConflictingBeanDefinitionException 에러 발생
    2. 수동 빈 등록 vs 자동 빈 등록
      • 일반적으로 수동으로 등록한게 우선권을 가진다.
      • 스프링은 최근 수동 빈 등록과 자동 빈 등록이 충돌하면 오류가 발생하도록 설정이 변경되었다.

출처

  • https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

태그:

카테고리:

업데이트: