본문 바로가기

SERVER/Spring

[Spring] Component와 @ComponentScan

@ComponentScan

  • 스프링의 빈 등록 방법에 대해서 얘기할 때 언급되었던 Component와 @ComponentScan에 대해 알아보자. 스프링부트에서는 @SpringBootApplication 애노테이션을 이용해서 빈을 등록하고 관리한다. 따라서 이전 방식이었던 xml 파일이나 java config 파일을 만들어 사용할 필요가 없었다! (사실 이전 방식에 대해 언급하지 않고 넘어갔어서 이 글을 참고하시길...) 그 이유는 @SpringBootApplication에 이미 @ComponentScan과 @Configuration이 있기때문에 이 자체가 Bean 설정 파일이기 때문이다. 이를 자세히 보면, 다음과 같다.

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

 

@ComponentScan이 있기때문에 @SpringBootApplication이 붙은 파일과 같은 패키지, 또는 하위 패키지들 중에서 빈으로 등록될 수 있는 것들을 찾아서 빈으로 등록해주게 된다. (❗주의❗ 다른 패키지라면 빈으로 등록되지 않는다!)

그렇다면, @ComponentScan이 무엇을 보고 빈을 찾아 등록해줄 수 있는걸까❓

 


@Component

@ComponentScan이 scan하는 대상이 바로 @component다. 

@component

  • @Repository
  • @Sevice
  • @Controller
  • @Configuration
  • @RestController

위와 같은 애노테이션들이 붙은 것들을 찾아 빈으로 등록하게 된다. (🔎참고: 애노테이션들에 대한 정리글

@ComponentScan은 실제 BeanFactoryPostProcessor를 구현한 ConfigurationClassPostProcessor에 의해 동작한다고 한다.