Spring/Spring Boot

[Spring Boot] 2-10. Core Features: Auto-Configuration

noahkim_ 2023. 10. 11. 23:47
  • Spring Boot에서 제공하는 Starter 모듈을 의존성으로 사용하면, 번들링된 Auto-Configuration 라이브러리가 함께 제공됩니다.
  • Spring Boot는 번들링된 Auto-Configuration 라이브러리를 픽업하여 적용합니다.

 

1. Understanding Auto-configured Beans

  • @AutoCofigure* 어노테이션은 관련 자동설정을 활성화하는 기능을 담당합니다.
  • 자동설정 클래스는 *AutoConfiguration 패턴으로 @AutoConfiguration가 붙어 있습니다.
  • 자동설정 클래스의 메서드를 실행하여 자동 설정을 활성화합니다.
    • 각 메서드는 자신의 자동 설정과 관련된 컴포넌트를 빈으로 등록합니다. 
    • @Conditional, @ConditionalOnClass, @ConditionalOnMissingBean 어노테이션을 사용하여 자동 설정을 제어합니다.

 

2. Locating Auto-configuration Candidates

  • 관련된 자동설정 클래스들은 .imports 파일로부터 제공됩니다.
    • @AutoCofigure*이 가지고 있는 @ImportAutoConfiguration의
      @Import(ImportAutoConfigurationImportSelector.class)를 통해 .imports을 읽어 자동설정 합니다.
    • .imports 파일은 spring-boot-autoconfigure의 META-INF/spring 경로에 org.springframework.boot.autoconfigure.AutoConfigure*.imports 패턴으로 제공됩니다.
  • 자동설정 클래스의 추가적인 설정은 @Import 어노테이션만 허용됩니다.
    • 컴포넌트 스캔 관련 어노테이션이 허용되지 않습니다.
  • @AutoConfiguration attribute를 통해 자동설정 적용 순서를 지정할 수 있습니다.
    • @AutoConfigureBefore, @AutoConfigureAfter 어노테이션을 alias 하는 attribute 입니다
    • before, beforeName, after, afterName
  • @AutoConfigureOrder를 사용하여 자동설정 적용순서를 명시적으로 지정할 수 있습니다.
  • 빈의 적용 순서는 빈 정의 생성 순서를 결정하지만 실제 빈 생성 순서는 의존관계에 달려있습니다.
    • @DependsOn 어노테이션으로 Spring Boot에게 빈 의존성 관계의 힌트를 제공할 수 있습니다.

 

3. Condition Annotations

  • Spring Boot는 빈 등록 혹은 설정클래스의 활성화의 조건을 명시하기 위해 여러 @Conditional 어노테이션을 제공합니다.
  • @Configuration (설정 클래스)에 적용되는 어노테이션입니다.

 

Class Conditions
  • 클래스의 부재 혹은 존재여부로 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
  • @ConditionalOnClass, @ConditionalOnMissingClass 이 있습니다.
    • value attribute : 클래스 배열을 전달하여 설정합니다. (클래스가 클래스패스에 존재하지 않으면 실패)
    • name attribute : 클래스 이름 배열을 전달하여 설정합니다. 
  • 어노테이션 메타데이터의 특정 attribute는 런타임에서 바이트 코드 조작을 일으킬 수 있습니다.
    • Spring Boot는 ASM 을 사용하여 바이트코드를 조작합니다.

 

Bean Conditions
  • 빈의 부재 혹은 존재여부로 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
  • @ConditionalOnBean, @ConditionalOnMissingBean 이 있습니다.
    • value attribute : 클래스 배열을 전달하여 설정합니다. (클래스가 클래스패스에 존재하지 않으면 실패)
    • name attribute : 클래스 이름 배열을 전달하여 설정합니다.
    • search attribute : 검색할 빈의 ApplicationContext의 계층을 제한하는데 사용합니다. 
  • @Bean의 구체적인 구현체의 타입으로 리턴되어야 조건을 평가하는데 모호하지 않습니다.

 

Property Conditions
  • Spring Environment property 기반으로 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
  • @ConditionalOnProperty 가 있습니다.
    • prefix attribute : property의 prefix를 지정합니다
    • name attribute : property이 매칭되는지 일치하는 값을 전달합니다
    • havingValue attribute : property이 매칭되는지 포함하는 값을 전달합니다
    • matchIfMissing attribute : property가 없을 때 빈 등록을 할지 말지 결정합니다.

 

Resource Conditions
  • Resource 기반으로 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
  • @ConditionalOnResource 가 있습니다.
    • resource attribute : resource 경로를 지정합니다

 

Web Application Conditions
  • 웹 애플리케이션 기반으로 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
  • @ConditionalOnWebApplication, @ConditionalOnNotWebApplication 가 있습니다.
    • type attribute : WebApplication 의 타입을 지정합니다.
  • @ConditionalOnWarDeployment, @ConditionalOnNotWarDeployment 가 있습니다.
    • 전통적인 WAR application 여부에 대한 조건입니다.
    • embedded server에는 매칭되지 않습니다.

 

SpEL Expression Conditions
  • @ConditionalOnExpression 는 SpEL expression 기반 설정클래스의 동작을 결정하는 조건으로 사용됩니다.

 

 

 

 

 

참고