본문 바로가기
Spring

[Spring] @ComponentScan 과 @Autowired

by happyhelen 2021. 11. 29.

 

 

** 공유가 아닌 개인 공부에 목적을 둔 글입니다

** 설명이 불충분할 수 있으며 잘 정리된 글이 아닐 수도 있습니다

 

 

 

 

@Bean 이나 XML 의 <bean> 을 통해 빈을 등록하는 방법도 있지만, 등록해야 할 빈이 많아지면 실수하기 마련이다

 

스프링은 이를 위해 자동으로 스프링 빈을 등록하는 @ComponentScan 과 의존관계를 자동으로 주입하는 @Autowired 

 

어노테이션을 제공한다

 


 

1. 설정정보 클래스(Config.class) 에 @Configuration 과 더불어 @ComponentScan 을 붙인다

 

(@ComponentScan 을 사용하면 @Configuration 이 붙은 다른 설정정보들도 자동으로 등록되기 때문에

 

이를 제외하고 싶다면 excludeFilters 를 이용해 제외하면 된다

 

반대로 다른 클래스를 포함하고 싶다면 includeFilters 를 사용하면 된다)

 

 

 

 

2. @Component 가 붙은 클래스들을 스캔해 스프링 빈으로 등록한다

 

 

 

 

 

3. 클래스 내 생성자에 @Autowired 로 의존관계를 주입한다

 

 

 

 

 


 

 

@Component 을 통해 자동 등록된 빈의 기본 이름은 클래스명을 사용하되 소문자로 시작한다

 

예를들어 OrderServiceImpl -> orderServiceImpl 이 된다

 

@Component("xx") 이렇게 직접 이름을 지정할 수도 있지만 디폴트이름이 가장 좋다

 

 

@Autowired 를 통해 스프링 컨테이너가 스프링 빈을 찾아내서 주입해주는데,

 

이때 빈은 타입으로 조회해서 찾아낸다

 

 

@ComponentScan 은 설정정보 클래스의 위치를 기준으로 그 하단의 클래스들을 탐색하기 때문에

 

주로 설정정보 클래스를 최상단에 두는데, (예전에 설정정보를 아무데나 두어서 오류 원인을 찾는데 애먹었던 기억..)

 

@ComponentScan ( basePackages = "패키지 주소") 를 통해 탐색 시작 위치를 지정하는 방법도 있다

 

 

한편, 컴포넌트 스캔 대상은 @Component 뿐만 아니라

 

@Controller, @Service, @Repository, @Configuration 이 있는데 이는 스프링이 지원하는 기능이다

 

 

 

** 스프링 부트를 사용할 때는 스프링 부트의 시작 정보인 @SpringBootApplication 를

 

프로젝트 시작 루트 위치에 두는 것이 관례인데,

 

이 설정안에 바로 @ComponentScan 이 들어있기 때문이다