[7/7 TIL] SPRING MVC(Auto-configuration)

yumyeonghan·2023년 7월 7일
0
post-custom-banner

🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃

Auto-configuration

  • 개발자가 설정들을 수동으로 작성하지 않아도 스프링 애플리케이션에 필요한 기본적인 설정을 자동으로 제공하는 기능
  • 스프링부트 애플리케이션의 핵심 기능

동작 과정

  1. 스프링 부트 애플리케이션을 실행
  2. 스프링 부트는 클래스 패스에 있는 spring-boot-autoconfigure 모듈을 스캔
  3. Auto-configuration 클래스들이 정의 되어있는 META-INF 폴더 아래의 spring.factories 파일을 찾음
  4. spring.factories 파일에 등록된 각 Auto-configuration 클래스들이 스프링 부트 애플리케이션의 구성 요소로서 동작할 수 있는 빈들(DataSource, JdbcTemplate, Jackson 등)을 자동으로 구성함
  5. Auto-configuration 클래스는 @Configuration 어노테이션이 붙은 클래스로, @Bean 어노테이션을 사용하여 구성 요소를 정의
  6. 자동 구성이 필요한 빈이 이미 수동으로 정의되어 있다면, 수동 설정이 자동 설정을 우선시함
  7. 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 빈이 수동으로 정의되어 있지 않은 경우에만 이 메서드 가 실행되어 빈이 생성
profile
웹 개발에 관심 있습니다.
post-custom-banner

0개의 댓글