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
에 정의된 자동 설정할 클래스들을 불러온다.
'스프링 부트' 카테고리의 다른 글
📋 4. 의존 자동 주입 (0) | 2021.08.06 |
---|---|
📋 3. 스프링 DI (0) | 2021.08.06 |
📋 Spring MVC - 5. 스프링 MVC (0) | 2021.08.06 |
📋 Spring MVC - 4. MVC 프레임워크 만들기 (0) | 2021.08.06 |
📋 Spring MVC - 3. 서블릿, JSP, MVC 패턴 (0) | 2021.08.06 |