- 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 패턴으로 제공됩니다.
- @AutoCofigure*이 가지고 있는 @ImportAutoConfiguration의
- 자동설정 클래스의 추가적인 설정은 @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 기반 설정클래스의 동작을 결정하는 조건으로 사용됩니다.
참고
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] 4. Data: SQL Databases (0) | 2023.10.13 |
---|---|
[Spring Boot] 3. Web: Servlet Web Application (0) | 2023.10.12 |
[Spring Boot] 2-8. Core Features: Test (2) | 2023.10.11 |
[Spring Boot] 2-6. Core Features: JSON (0) | 2023.10.09 |
[Spring Boot] 2-3. Core Features: Profile (0) | 2023.10.09 |