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

2022. 10. 26. 15:35Spring

해당 내용은 김영한님의 인프런_[스프링 핵심 원리]를 기본으로 합니다.

@ComponentScan

스프링은 @Configuration과 @Bean으로 빈등록을 하는 방법도 있지만 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔 기능을 제공한다. 이름 그대로

@ComponentScan을 붙여주면 패키지를 탐색하여 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록해준다.

@ComponentScan(
   basePackages = "hello.core",
   basePackageClasses = "AutoAppConfig.class"
)
  • @ComponentScan  @Component 가 붙은 모든 클래스를 스프링 빈으로 등록한다.
  • @Component는 컴포넌트 스캔에서 사용되는 애노테이션이다.
  • basePackages : 탐색할 패키지의 시작 위치를 정한다. 해당 패키지를 포함하여 하위 패키지 모두 탐색한다.
  • basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
  • 단순히 @ComponentScan만 쓴다면 @ComponentScan이 붙은 설정정보 클래스의 패키지가 탐색 시작 위치가 된다.
  • 이 때 스프링 빈의 기본 이름은 맨 앞글자만 소문자로 된 클래스 명을 사용한다.
  • 빈 이름을 직접 지정할 수도 있다. @Component("otherNme")

패키지를 지정하지 않고 @ComponentScan만 쓰는것이 기본적이기 때문에, 설정 정보 클래스의 위치는 프로젝트 최상단에 두는 것이 좋다.


해당 AutoAppConfig 코드를 보면 @Bean을 사용한 빈 등록도 없고 의존 관계 주입해주는 코드도 없지만


싱글톤 빈이 생성된것을 확인할 수 있다.


@ComponentScan을 붙인 클래스의 패키지가 hello.core이고 그 밑으로 들어가있는 클래스들중에 @Component가 붙은 클래스를 스프링 빈으로 등록했기 때문이다.

클래스에
@Controlller, @Service, @Repository, @Configuration
를 붙여주면 스프링 빈 등록이 됐는데 그 이유는 저 애노테이션 안으로 들어가보면 @Component애노테이션이 들어있기 때문이다.


@Autowired_의존관계 자동 주입

@ComponentScan을 통해 빈등록을 해주고나면 의존관계를 명시해줄 코드가 없다. 이를 위해
자동으로 의존 관계를 주입해주기 위해서 @Autowired를 사용한다. 


생성자에 @AutoWired를 붙여주면 스프링 컨테이너에 등록된 빈들중에 타입이 같은 빈을 찾아서 주입해준다.

자동 의존관계 주입에 대한 내용은 다음에 정리하고 첨부하겠다.