@EnableAutoConfiguration은 Spring Boot의 핵심 어노테이션 중 하나로, 자동 설정 메커니즘을 활성화하여 애플리케이션에서 필요한 기본적인 설정을 자동으로 구성합니다. 이를 통해 개발자는 특정 기능이나 라이브러리를 사용하기 위한 복잡한 설정을 직접 하지 않아도 됩니다. 이제 이 어노테이션의 작동 원리와 관련된 내부 코드를 설명해 드리겠습니다.
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
@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:
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은 매우 유연하며, 다음과 같은 방식으로 동작을 제어할 수 있습니다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}