ETC

[10분 테코톡] 지토의 Auto Configuration

버스는그만 2023. 7. 20. 21:03

Auto Configuration이란

perperties 파일이나 yml파일에 설정을 하면 그것을 바탕으로 필요한 Bean을 자동으로 구성하는 기능

@SpringBootApplication부터 따라가보기

순서

  1. @SpringBootApplication
  2. @EnableAutoConfiguration
  3. @Impor & Import Selector
  4. AutoConfigurationImportSelector
  5. 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