🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃
Auto-configuration
- 개발자가 설정들을 수동으로 작성하지 않아도 스프링 애플리케이션에 필요한 기본적인 설정을 자동으로 제공하는 기능
- 스프링부트 애플리케이션의 핵심 기능
동작 과정
- 스프링 부트 애플리케이션을 실행
- 스프링 부트는 클래스 패스에 있는 spring-boot-autoconfigure 모듈을 스캔
- Auto-configuration 클래스들이 정의 되어있는 META-INF 폴더 아래의 spring.factories 파일을 찾음
- spring.factories 파일에 등록된 각 Auto-configuration 클래스들이 스프링 부트 애플리케이션의 구성 요소로서 동작할 수 있는 빈들(
DataSource, JdbcTemplate, Jackson 등
)을 자동으로 구성함
- Auto-configuration 클래스는 @Configuration 어노테이션이 붙은 클래스로, @Bean 어노테이션을 사용하여 구성 요소를 정의
- 자동 구성이 필요한 빈이 이미 수동으로 정의되어 있다면, 수동 설정이 자동 설정을 우선시함
- Auto-configuration은 @Conditional 어노테이션을 사용하여 특정 조건에 따라 빈을 생성하거나 제외함
DataSourceAutoConfiguration(Auto-configuration 클래스 예시)
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import(DataSourcePoolMetadataProvidersConfiguration.class)
public class DataSourceAutoConfiguration {
@Autowired
private DataSourceProperties properties;
@Autowired(required = false)
private DataSourceBuilderCustomizer[] dataSourceBuilderCustomizers;
@Bean
@ConditionalOnMissingBean
public DataSource dataSource() {
DataSourceBuilder<?> builder = DataSourceBuilder.create()
.driverClassName(this.properties.determineDriverClassName())
.url(this.properties.determineUrl())
.username(this.properties.determineUsername())
.password(this.properties.determinePassword());
if (StringUtils.hasText(this.properties.getType())) {
builder.type(this.properties.getType());
}
for (DataSourceBuilderCustomizer customizer : this.dataSourceBuilderCustomizers) {
customizer.customize(builder);
}
return builder.build();
}
}
@Configuration
: 이 클래스는 스프링 빈 등록 대상
@ConditionalOnClass(DataSource.class)
: DataSource 클래스가 클래스패스에 존재할 때만 이 Auto-configuration이 활성화
@EnableConfigurationProperties(DataSourceProperties.class)
: DataSourceProperties 클래스를 사용하여 구성 속성을 활성화
@Import(DataSourcePoolMetadataProvidersConfiguration.class)
: DataSourcePoolMetadataProvidersConfiguration 클래스를 가져와서 구성에 포함
@Bean
: dataSource() 메서드는 DataSource 빈을 생성
@ConditionalOnMissingBean
: DataSource 빈이 수동으로 정의되어 있지 않은 경우에만 이 메서드 가 실행되어 빈이 생성