@ComponentScan

지노·2021년 4월 26일
0

Bean

  • 스프링은 Java 객체를 자신만의 형태로 바꾸는데, 그것을 Bean이라고 한다.
  • 즉 스프링 안에서는 "Bean = 객체"라고 생각하면 된다.

BeanFactory

  • 해당 인터페이스로 Bean의 각종 설정을 하거나 Bean을 가져올 수 있다.

Spring Container에 Bean을 등록하는 방법?

1. XML 방식

  • Bean 설정파일은 XML과 Java 설정 파일로 작성할 수 있는데 최근 추세는 자바 설정파일을 좀 더 많이 사용한다.
/* Bean 객체 */
<bean id="teamA" class="Team"/>

<bean id="user" class="User">
   <constructor-arg>
      <value="1"/>
      <value="개발자"/>
      <ref="teamA"/>
</bean>

2. Component Scanning

@ComponentScan

  • 스프링 3.1부터 도입된 Annotation이다.
  • Component 스캔 위치를 설정할 수 있다.
  • 어떤 Annotation을 스캔할지 또는 하지 않을지 결정하는 Filter 기능을 포함한다.

@Component

  • @Component가 스캔 기준이 되는 어노테이션이다
  • @Component를 포함하고 있는 클래스들이 스캐닝되고 Bean으로 등록된다.

대표적인 @Component

  • @Contoller
  • @Repositor
  • @Service
  • @Configuration

@ComponentScan 동작 원리

  • BeanFactoryPostProcessor를 구현한 ConfigurationClassPostProcessor에 의해 동작
  • BeanFactoryPostProcessor는 다른 모든 Bean들을 만들기 전에 BeanFactoryPostProcessor의 구현체들을 모두 적용
  • 다른 Bean들을 등록하기 전에 Component 스캔을 해서 Bean으로 등록
  • @ComponentScan은 다른 Bean들을 찾아 BeanFactoryPostProcessor의 구현체를 적용하여 Bean으로 등록해주는 과정

@ComponentScan 범위

1. BasePackages

  • 스캔 위치를 설정하는 방법 중 하나
  • String으로 입력된 패키지의 경로를 스캔하는 방법
  • TypeSafe하지 않기 때문에 BasePackagesClasses 사용이 더 안전

2. BasePackageClasses

  • 스캔 위치를 설정하는 방법
  • 전달된 클래스의 위치를 기준으로 스캔

BasePackageClasses 적용 예시

  • SpringBoot 프로젝트에서는 @SpringBootApplication에 이미 @Configuration과 @ComponentScan이 붙어있음
  • @SpringBootApplication 기준으로 Component 스캔이 진행

  • 위와 같은 패키지 구조일 때 Application이 속해 있는 패키지는 스캔이 적용
  • 이 패키 밖에 있는 out 패키지 내부 클래스는 스캔이 적용되지 않음

@ComponentScan과 @Autowired의 차이점

  • @ComponentScan은 다른 Bean들을 찾아 BeanFactoryPostProcessor의 구현체를 적용하여 Bean으로 등록해주는 과정이다.
  • @Autowired는 등록된 다른 Bean을 찾아 BeanPostProcessor의 구현체를 적용하여 의존성 주입을 적용하는 역할

참조

https://jjingho.tistory.com/9
https://baek.dev/post/21/#field-based-dependency-injection
https://velog.io/@seculoper235/Spring-Core-Bean%EC%9D%B4%EB%9E%80

profile
Spring Framework를 이용한 웹 개발과 AWS 서비스, Container를 사용한 CI/CD 인프라에 관심이 있습니다.

0개의 댓글