컴포넌트 스캔

udonehn·2023년 11월 1일
0

컴포넌트 스캔과 의존관계 자동 주입 시작하기

  • 스프링은 @Bean과 같은 설정 정보 없이도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.
  • 의존관계를 자동으로 주입하는 @Autowired 기능도 제공한다.

AutoAppConfig

main 폴더의 core 패키지 아래 AutoAppConfig 클래스를 생성한다.

<코드>

  • 컴포넌트 스캔을 사용하려면 @ComponentScan을 설정 정보에 붙여주면 된다.
  • 기존의 AppConfig와는 다르게 @Bean 없이도 스프링 빈으로 등록할 수 있다.
  • 컴포넌트 스캔은 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
    • @Configuration 소스코드 안에도 @Component 애노테이션이 붙어있기 때문에 컴포넌트 스캔의 대상이다.

코드 수정

  • MemoryMemberRepository, MemberServiceImpl, RateDiscountPolicy 등의 구체 클래스 앞에 @Component 애노테이션을 추가한다.
  • 생성자 위에 @Autowired 애노테이션을 추가하여 자동 의존관계 주입을 한다.

AutoAppConfigTest

Test 폴더에 scan 패키지를 생성하고, AutoAppConfigTest 클래스를 생성한다.

<코드>

기존과 같이 잘 동작하는 것을 알 수 있다.

작동 원리

  1. @ComponentScan@Component 애노테이션이 붙은 모든 클래스를 스프링 빈으로 등록한다. 이때, 스프링 빈의 이름은 클래스 명을 사용하되 맨 첫글자는 소문자로 사용한다.
  2. 생성자에 @AutoWired 애노테이션을 붙이면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입한다. 이때, 기본적으로 타입이 같은 빈을 찾아 주입한다. getBean(MemberRepository.class)와 비슷한 방식이다.

탐색 위치와 기본 스캔 대상

@ComponentScan에서 탐색할 패키지의 시작 위치를 지정할 수 있다. 모든 자바 클래스를 스캔하지 않기 때문에 시간을 절약할 수 있다.
만약 지정하지 않는다면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.

  • @ComponentScan(basePackages = "hello.core.member")

관례 및 권장: basePackages를 사용하지 않고, 설정 정보 클래스를 프로젝트 패키지 루트에 둔다. 실제로도 스프링 부트의 @SpringBootApplication 애노테에션도 @ComponentScan를 포함하고 있기 때문에, 모든 컴포넌트를 자동으로 등록할 수 있는 것이다.

컴포넌트 스캔 기본 대상

컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다. 해당 클래스의 소스 코드에 @Component를 포함하고 있기 때문이다.

  • @Component: 컴포넌트 스캔에서 사용
  • @Controlller: 스프링 MVC 컨트롤러에서 사용
  • @Service: 스프링 비즈니스 로직에서 사용
  • @Repository: 스프링 데이터 접근 계층에서 사용
  • @Configuration: 스프링 설정 정보에서 사용

필터

  1. Test 폴더의 scan 패키지 아래 filter 패키지를 생성하고, 그 아래 MyIncludeComponent 애노테이션과 MyExcludeComponent 애노테이션을 생성한다.
  2. filter 패키지 아래 @MyIncludeComponent를 사용하는 BeanA 클래스와 @MyExcludeComponent를 사용하는 BeanB 클래스를 생성한다.
  3. filter 패키지 아래 ComponentFilterAppConfigTest 클래스를 생성한다.

<코드>들...

  • includeFilters에 MyIncludeComponent 애노테이션을 추가해서 BeanA가 스프링 빈에 등록된다.
  • excludeFilters에 MyExcludeComponent 애노테이션을 추가해서 BeanB는 스프링 빈에 등록되지 않는다.

일반적으로 @Component면 충분하기 때문에 필터 옵션은 자주 사용하지 않는다.

애노테이션에 대한 공부가 더 필요할 듯 하다 . . .

중복 등록과 충돌

수동 빈 등록과 자동 빈 등록에서 빈 이름이 충돌하면 수동 빈이 자동 빈을 오버라딩하여 우선권을 가진다. 하지만 이러한 설정은 코드를 복잡하게 만들기 때문에 최신 스프링 부트에서는 오류를 발생기키도록 설정되어 있다.

본 포스팅은 김영한 강사의 스프링 핵심 원리 강의를 수강하고 요약한 것으로, 해당 강의의 영상 및 강의자료를 참고하였습니다.

profile
안녕하세요. 만나서 반갑습니다.

0개의 댓글

관련 채용 정보