@EnableAutoConfiguration

과녁스·2024년 10월 22일
0

Spring

목록 보기
13/14
post-thumbnail

@EnableAutoConfiguration은 Spring Boot의 핵심 어노테이션 중 하나로, 자동 설정 메커니즘을 활성화하여 애플리케이션에서 필요한 기본적인 설정을 자동으로 구성합니다. 이를 통해 개발자는 특정 기능이나 라이브러리를 사용하기 위한 복잡한 설정을 직접 하지 않아도 됩니다. 이제 이 어노테이션의 작동 원리와 관련된 내부 코드를 설명해 드리겠습니다.

작동 원리

  1. @EnableAutoConfiguration 탐색:
  • Spring Boot 애플리케이션 클래스는 일반적으로 @SpringBootApplication 어노테이션을 포함하며, 이 어노테이션은 @EnableAutoConfiguration을 포함합니다.
  1. spring.factories 파일을 통한 설정 클래스 로딩:
  • Spring Boot는 클래스패스에 있는 META-INF/spring.factories 파일을 읽고, 자동 설정에 필요한 구성 클래스들을 찾습니다.
  • 이 파일에는 EnableAutoConfiguration에 사용할 여러 자동 설정 클래스들이 나열되어 있습니다.
    예를 들어, spring-boot-autoconfigure.jar의 spring.factories 파일에는 다음과 같은 설정이 포함되어 있습니다:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
  1. 자동 설정 클래스 로딩:
  • Spring Boot는 이 설정 파일을 통해 자동 설정 클래스들을 로딩하고, 각 클래스의 @Conditional 어노테이션을 확인하여 조건을 만족하는 경우에만 빈을 등록합니다. 이 클래스들은 보통 @Configuration 어노테이션을 포함하며, 자동으로 빈을 등록하는 역할을 합니다.
  1. 조건에 따른 빈 등록 (@Conditional):
  • @EnableAutoConfiguration은 내부적으로 여러 @Conditional 어노테이션을 사용합니다. @ConditionalOnClass, @ConditionalOnMissingBean 등 조건이 만족될 때만 자동 설정이 적용됩니다.
  • 예를 들어, JDBC 설정은 데이터베이스 드라이버가 클래스패스에 있을 때만 적용됩니다.

@EnableAutoConfiguration 내부 코드 분석

@EnableAutoConfiguration 자체는 복잡한 동작을 제공하지 않지만, 내부적으로 @AutoConfigurationPackage 및 @Import(AutoConfigurationImportSelector.class)를 사용하여 자동 구성 클래스를 애플리케이션 컨텍스트에 등록하는 과정을 관리합니다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

내부 구성 요소 설명:
1. @AutoConfigurationPackage:

  • 이 어노테이션은 Spring Boot가 애플리케이션 패키지 내의 모든 클래스를 자동으로 스캔하도록 만듭니다. 즉, 애플리케이션 패키지에 위치한 모든 컴포넌트가 스프링 컨텍스트에 의해 스캔되고 빈으로 등록될 수 있습니다.
  1. @Import(AutoConfigurationImportSelector.class):
  • AutoConfigurationImportSelector는 Spring Boot의 자동 설정 클래스를 선택하고 로드하는 데 중요한 역할을 합니다. 이 클래스는 spring.factories 파일을 읽어, 거기에 정의된 모든 자동 구성 클래스를 로드하고 애플리케이션 컨텍스트에 빈을 등록합니다.

AutoConfigurationImportSelector 코드 분석

AutoConfigurationImportSelector 클래스는 실제로 자동 설정 클래스를 로드하는 핵심 역할을 합니다.

public class AutoConfigurationImportSelector extends ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        // Get the list of auto-configuration class names from the spring.factories file
        List<String> configurations = getCandidateConfigurations(annotationMetadata);
        // Filter out excluded configurations
        configurations = filter(configurations);
        return configurations.toArray(new String[0]);
    }

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata) {
        // Load the list of auto-configuration classes from the spring.factories file
        return SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, getClass().getClassLoader());
    }

    protected List<String> filter(List<String> configurations) {
        // Apply exclusion logic (exclude specific classes if necessary)
        return configurations.stream()
                .filter(config -> !isExcluded(config))
                .collect(Collectors.toList());
    }

    private boolean isExcluded(String config) {
        // Check if the class is in the list of excluded configurations
        // Exclusions are defined in the @EnableAutoConfiguration annotation's exclude attribute
        return getExcludeAutoConfigurations().contains(config);
    }
}

AutoConfigurationImportSelector 동작 과정:
1. selectImports(): spring.factories 파일에서 자동 설정 클래스를 읽어와 등록할 후보 클래스를 선택합니다.
2. getCandidateConfigurations(): SpringFactoriesLoader를 사용하여 spring.factories 파일에 정의된 자동 설정 클래스를 로드합니다.
3. 필터링: @EnableAutoConfiguration에서 exclude로 지정한 클래스를 필터링하여 최종적으로 등록할 자동 설정 클래스를 결정합니다.

자동 설정의 유연성

@EnableAutoConfiguration은 매우 유연하며, 다음과 같은 방식으로 동작을 제어할 수 있습니다.

  • 자동 설정 제외: 특정 자동 설정을 원하지 않을 때는 exclude 속성을 사용하여 자동 설정에서 제외할 수 있습니다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • 사용자 설정 우선 적용: 개발자가 특정 설정을 직접 정의하면, 자동 설정보다 우선하여 적용됩니다. 자동 설정은 기본값을 제공하는 것이므로, 필요에 따라 직접 설정한 빈이 우선 적용됩니다.
profile
ㅎㅅㅎ
post-custom-banner

0개의 댓글