Springboot는 어떻게 빈을 등록하는가

스프링부트의 빈 등록 과정

오늘은 스프링 부트의 빈이 어떻게 등록되어지는지에 대해 알아보자.

이를 알아보기에 앞서 일반 자바 인스턴스와 빈의 차이에 대해서 알아야한다.


@Autowired
lateinit var applicationContext: ApplicationContext

fun test() {
  val kotlinObject = TestClass() // 1

  val bean = applicationContext.getBean(TestClass::class.java) //2
}

여기서 2가 의미하는 것이 우리가 스프링에서 말하는 빈이다.

왜냐하면 1번의 경우 일반적인 자바 인스턴스이지만, 2번의 경우 applicationContext가 관리하고있는 빈을 가져왔으므로 2번을 빈이라고 부를 수 있다.

그럼 어떻게 스프링 컨테이너 안에다가 빈을 만들어줄 수 있을까?

스프링 IoC 컨테이너에 빈을 등록해보자

가장 대표적인 방법은 두 가지이다.

하나는 Component Scanning이며 두 번째는 XML이나 자바 설정파일에 등록하는 것이다.

두 번째 방법은 현재는 거의 쓰이지 않는 방식이기 때문에 일반적으로는 Component Scan이 사용된다고 보면 되겠다.

Component Scan?

@Component라는 애노테이션을 수집한다.

익히 알고 있는 @Controller, @Service등과 같은 애노테이션들도 @Compoent를 메타에노테이션으로 사용한 애노테이션들이다.

애노테이션 프로세서 중에 스프링 IoC 컨테이너가 사용하는 여러가지 인터페이스들이 존재한다.

이러한 인터페이스들을 Lifecycle Callback이라고 부른다.

여러가지 Lifecycle Callback 중에는 @Component라는 애노테이션을 찾아서 이 애노테이션이 붙은 모든 클래스들을 찾은 후 인스턴스를 만들어서 빈으로 등록하는 애노테이션 프로세서가 등록되어있다.

그럼 이 애노테이션 프로세스는 어디에 있을까?

@SpringbootApplicaiton 애노테이션을 들어가보면 다음과 같이 @ComponentScan이라는 애노테이션이 존재하는 것을 확인할 수 있다.

@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 애노테이션이 명시된 이하의 모든 패키지에서 빈들을 찾아서 등록해둔다.

@Component 애노테이션을 메타에노테이션으로 갖는 대표적인 애노테이션은 다음과 같다.

  • @Repository
  • @Service
  • @Configuration
  • @Controller

등등이 존재한다.

자 그렇다면 의문이 생길 것이다.

애노테이션이라는 것은 결국 Marker, 주석에 불과하다.

@ComponentSacn 애노테이션의 처리는 어떻게 이루어질까?

실제 스캐닝은 ConfigurationClassPostProcessor라는 BeanFactoryPostProcessor에 의해 처리된다.

이러한 BeanFactoryPostProcessor는 다른 빈들을 등록하기 전에 모든 빈들을 스캔해서 빈으로 등록하는 프로세서이다.

BeanFactoryPostProcessor가 결국 @ComponentSacn 애노테이션에 정의된 값들을 보고 빈을 등록하게 되는 것이다.

Reference

백기선님의 유튜브



© 2022. by minkuk

Powered by minkuk