ETC
[10분 테코톡] 지토의 Auto Configuration
버스는그만
2023. 7. 20. 21:03
Auto Configuration이란
perperties 파일이나 yml파일에 설정을 하면 그것을 바탕으로 필요한 Bean을 자동으로 구성하는 기능
@SpringBootApplication부터 따라가보기
순서
- @SpringBootApplication
- @EnableAutoConfiguration
- @Impor & Import Selector
- AutoConfigurationImportSelector
- AutoConfiguration.imports
SpringBootApplication
- @Configuration, @EnableAutoConfiguration, @ComponentScan이 결합된 Annotaion
- ApplicationContext를 구성하는데 필요한 메타데이터 제공
@EnableAutoConfiguration
- @AutoConfiguration Annotation이 명시된 모든 클래스 스캔
@Import
- Import할 하나 이상의 대상을 지정
@ImportSelector
- 등록할 대상의 조건에 따라 동적으로 구성 가능
AutoConfigurationImport Selector
- 특정 조건에 따라 @AutoConfiguration Class를 동적으로 import 하기 위한 클래스
- AutoConfiguration.imports 파일을 조회해 조건에 맞는 빈들만을 필터링해서 가져온다.
@Annotaion 살펴보기
@AutoConfiguration
- 스프링 부트에서 Auto Configuration으로 처리될 수 있는 후보를 명시하는 역할
- before, after 속성을 통해 Auto Configuration 시 처리 순서를 제어할 수 있음
Condition & @Conditional
- Condition: 함수형 인터페이스, 빈으로 등록될 대상의 조건을 설정
- @Conditional: 클래스, 메소드에 등록할 수 있으며 여러 Condition을 등록할 수 있음
@ConditionalOn*
스프링부트에서 자주 쓰는 조건들을 구현해 놓은 어노테이션들
- @ConditionalOnBean: 특정 빈이 있을 경우
- @ConditionalOnMissingBean: 특정 빈이 없을 경우
- @ConditionalOnClass: 특정 클래스가 있을 경우
- @ConditionalOnMissingClass: 특정 클래스가 없을 경우
- @ConditionalOnPerperty: 특정 속성이 있을 경우
- @ConditionalOnSingleCandidate: 특정 빈이 단 하나만 존재할 경우
@ConfigurationProperties
- 외부 설정(외부 파일)을 Java 객체에 Binding하기 위한 Annotaion
DataSourceAutoConfiguration
@AutoConfiguration(
before = {SqlInitializationAutoConfiguration.class}
)
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean(
type = {"io.r2dbc.spi.ConnectionFactory"}
)
@EnableConfigurationProperties({DataSourceProperties.class})
@Import({DataSourcePoolMetadataProvidersConfiguration.class})
이 영상에서는
- @AutoConfiguration
- @ConditionalOnClass
- @EnableConfigurationProperties
에 있는 것들만 다룬다.
@AutoConfiguration
- AutoConfiguration Class 명시 & 순서 제어
- SqlInitializationAutoConfiguration보다 앞에 오는데 이것은 data.sql이나 schema.sql로 DB를 초기화하는 담당으로 초기화하기 전에 DataSource를 이용해 커넥션이 필요하기 때문에 먼저 동작해야 한다.
@ConditionalOn
- DataSource는 커넥션을 위해 당연히 필요하기 때문에 조건으로 지정되었다.
- EmbeddedDatabaseType.class는 내장 DB를 지정하는 것이다. 들어가 보면 H2를 포함한 내장 DB 종류를 확인할 수 있다.
@EnableConfigurationProperties
- Binding한 자바 객체를 주입받는다.
- DataSourcePerperties를 보면 @ConfigurationProperties(prefix = "spring.datasource")를 확인할 수 있는데 우리가 자주 사용하는 DB 접두사인 것을 볼 수 있다.
왜 공부해야 하나(영상 뇌피셜)
- 효율적인 Bean Customizing
- Bean Customizing 시 발생할 수 있는 문제 대응
후기
DataSourceConfiguration을 다루는 부분이 아주 좋았다. Spring Boot의 무엇이 DB를 초기화 해주는지 알 수 있는 부분이 였다. 개인적으로 AutoConfiguration을 정말 좋아하지만 가끔씩 잘모르고 사용한다는 점에서 부작용도 크다고 생각해 공부해야 하는 부분이라는 점에서 동의한다.
참고영상
[10분 테코톡]: 지토의 Auto Configuration