본문 바로가기

스프링 부트

SpringBoot Auto Configuration

2021-05-27글

테코톡을 보고 추가로 학습한 내용들

스프링 부트는 component-scan을 통해 component를 찾고 bean을 생성한다.
이 과정에서 우리가 설정한 bean들이 생성된다.
그리고 이 과정에서 spring boot의 auto configuration에 의해 추가적인 bean들도 함께 생성된다.

Spring Boot AutoConfiguration이란?

  • 클래스 패스에 존재하는 dependecy를 기반으로 spring 애플리케이션을 자동으로 구성하는 방법
  • 스프링 부트는 web, h2, jdbc등 여러 자동 설정을 제공 (starter)
  • 특정 Bean을 정의할 필요 없기 때문에 개발이 더 빠르고 쉬워짐
  • 스프링부트에선 @SpringBootApplication에 있는 EnableAutoConfiguration 로 가능

@SpringBootAutoConfiguration

  • @SpringBootConfiguration : 스프링의 @Configuration을 대체하는 스프링 부트 전용 설정 어노테이션
  • @EnableAutoConfiguration : auto configuration 기능을 사용하겠다는 설정. 클래스 패스에 지정된 내용을 기반으로 설정을 자동화. 일반적으로 @ComponentScan 와 함께 쓰임

그런데 우리가 정의한 Bean과 Spring Boot가 정의한 Bean이 충돌하면? 또한 불필요한 Bean들도 같이 생성된다면?

@Condition@ConditionalOnXxx을 이용해서 이와 같은 문제를 해결한다.

spring.factories

위의 두 어노테이션을 살펴보기 전에 auto configuration에 필요한 파일들을 살펴보자.

Auto Configure

spring-boot-autoconfigure/META-INF/spring.factories 에는 스프링 부트가 미리 정의해둔 auto configuration 정보가 들어있다.
여기에는 자동 설정의 target 클래스 목록들이 나열되어 있고, 여기에 선언된 클래스들이 @EnableConfiguration 사용 시 target이 된다.

@Conditional? @ConditionalOnXxx?

  • Sprig 4.0부터 추가된 어노테이션

spring.factories 에 있는 클래스들 중 익숙한 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ 를 예시로 보자.

  • @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) 설정을 통해 해당 클래스 파일이 존재해야 설정을 활성화 함을 명시
  • @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") 설정을 통해 해당 Bean이 존재하지 않을 경우 설정을 활성화 함을 명시

이러한 설정들 덕분에 우리가 정의한 Bean과 Spring Boot가 정의한 Bean이 충돌하는 문제, 불필요한 Bean들이 생성되는 문제 등을 해결할 수 있다.

AutoConfigurationImportFilter

그런데 사실 auto configuration에서 이 @Condition 을 무조건 타는 것이 아니다.
spring.factories 에는 AutoConfigurationImportFilter 설정이 존재한다.
아래와 같은 필터들은 각 AutoConfiguration이 가진 @Conditional 을 가지고 조건을 만족하는지 필터링을 수행한다.
조건이 맞지 않을 경우, AutoConfiguration이 동작하지 않도록 제외시키는 역할을 한다.

  • OnBeanCondition : 특정 bean들의 존재유무에 대해서 다루는 필터
    • @ConditionalOnBean, @ConditionalOnMissingBean, @ConditionalOnSingleCandidate
  • OnClassCondition : 특정 class들의 존재유무에 대해서 다루는 필터
    • @ConditionalOnClass, @ConditionalOnMissingClass
  • OnWebApplicationCondition : WebApplicationContext의 존재유무에 대해서 다루는 필터
    • @ConditionalOnWebApplication, @ConditionalOnNotWebApplication

그렇다면 이 자동 설정들은 어떻게 불러와질까?

@Import(AutoConfigurationImportSelector.class)

@SpringbootApplication 어노테이션 내부에 있던 @Import(AutoConfigurationImportSelector.class) 는 자동 설정을 지원해주며, import하고 있는 AutoConfigurationImportSelector.class가 META-INF/spring.factories 에 정의된 자동 설정할 클래스들을 불러온다.