@EnableAutoConfiguration

2024. 10. 16. 12:40Spring Boot/Spring Boot Auto Configuration

@EnableAutoConfiguration 어노테이션은 스프링 부트(Spring Boot)의 핵심적인 기능 중 하나로, 애플리케이션에서 필요한 설정을 자동으로 구성해주는 역할을 합니다. 스프링 부트 애플리케이션에서는 개발자가 일일이 설정 파일을 작성하지 않더라도, 다양한 스프링 라이브러리와 외부 라이브러리들을 자동으로 감지하고, 적절한 설정을 자동으로 수행하여 애플리케이션을 구동할 수 있도록 돕습니다.

스프링 애플리케이션 컨텍스트의 자동 구성을 활성화하여, 필요한 빈들을 추측하고 구성하려 시도합니다. 자동 구성 클래스들은 일반적으로 클래스패스(classpath)와 이미 정의된 빈들에 따라 적용됩니다. 예를 들어, 클래스패스에 tomcat-embedded.jar가 있다면, TomcatServletWebServerFactory를 원할 가능성이 높습니다(직접 ServletWebServerFactory 빈을 정의하지 않은 경우).
@SpringBootApplication을 사용할 때는 컨텍스트의 자동 구성이 자동으로 활성화되며, 이 어노테이션을 추가하는 것은 별다른 추가 효과가 없습니다. 자동 구성은 가능한 한 지능적으로 동작하며, 사용자가 직접 더 많은 설정을 정의할수록 자동 구성을 적용하지 않습니다. 언제든지 exclude() 메서드를 사용하여 원하지 않는 구성을 수동으로 제외할 수 있으며, 해당 구성을 접근할 수 없을 때는 excludeName()을 사용할 수 있습니다. 또한 spring.autoconfigure.exclude 프로퍼티를 통해서도 구성을 제외할 수 있습니다. 자동 구성은 항상 사용자 정의 빈이 등록된 후에 적용됩니다.
@EnableAutoConfiguration이 적용된 클래스의 패키지는 중요한 의미를 가지며, 종종 디폴트값으로 사용됩니다. 예를 들어, @Entity 클래스를 스캔할 때 사용됩니다. 일반적으로 @EnableAutoConfiguration을 (만약 @SpringBootApplication을 사용하지 않는다면) 루트 패키지에 배치하여 모든 하위 패키지와 클래스가 검색될 수 있도록 배치하는 것이 권장됩니다.
자동 구성 클래스는 일반적인 스프링 @Configuration 빈들입니다. 이들은 ImportCandidates를 사용해 위치가 검색됩니다. 일반적으로 자동 구성 빈들은 조건부 빈(@Conditional 빈들)이며, 대부분 @ConditionalOnClass@ConditionalOnMissingBean 어노테이션을 사용합니다.

 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
	
	Class<?>[] exclude() default {};
	
	String[] excludeName() default {};

}

 

1. @EnableAutoConfiguration의 역할

@EnableAutoConfiguration은 기본적으로 애플리케이션에 포함된 클래스패스를 기반으로 적절한 설정을 자동으로 적용하는 메커니즘을 제공합니다. 이를 통해 개발자는 설정 작업을 최소화할 수 있으며, 필요한 기능을 빠르게 구현할 수 있습니다.

  • 자동 구성(Autoconfiguration): 클래스 경로 상에 포함된 라이브러리들을 기반으로, 그 라이브러리와 관련된 구성을 자동으로 수행합니다. 예를 들어, H2 데이터베이스가 클래스 경로에 존재하면, 이를 감지하여 데이터 소스(DataSource)를 자동으로 구성합니다.
  • 디폴트값 적용: 자동 구성은 일반적으로 합리적인 디폴트값을 사용하여 구성됩니다. 즉, 별도의 구성이 없는 경우에도 애플리케이션이 정상적으로 동작할 수 있도록 미리 정의된 값을 사용합니다.
  • 조건부 빈 등록: 자동 구성은 다양한 조건(예: 특정 클래스가 클래스패스에 존재하는지 여부)에 따라 빈을 등록하거나 구성을 적용합니다. @ConditionalOnClass, @ConditionalOnMissingBean 등의 어노테이션이 이를 제어합니다.

2. 자동 구성이 동작하는 방식

@EnableAutoConfiguration은 기본적으로 spring.factories 파일을 기반으로 자동 설정 클래스를 찾고 로드합니다. 이 과정에서 다음과 같은 절차가 진행됩니다:

  1. Class Path 분석: 스프링 부트는 애플리케이션이 실행될 때, 클래스패스를 스캔하여 어떤 라이브러리들이 포함되어 있는지 확인합니다. 이때 포함된 라이브러리들에 맞는 자동 구성 클래스를 찾습니다.
    • 예: H2 데이터베이스가 클래스패스에 존재한다면, DataSourceAutoConfiguration 클래스가 활성화됩니다.
  2. 자동 구성 파일 로드: spring-boot-autoconfigure JAR 파일 내의 META-INF/spring.factories 파일에서 자동 구성 클래스 목록을 읽어들입니다. 이 파일에는 스프링 부트가 제공하는 다양한 자동 구성 클래스들이 정의되어 있습니다.
    • 예: org.springframework.boot.autoconfigure.EnableAutoConfiguration=...와 같은 형식으로 자동 구성 클래스가 나열됩니다.
  3. 조건에 따른 빈 등록: 각 자동 구성 클래스는 @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty 등의 조건부 어노테이션을 사용하여, 특정 조건이 만족될 때에만 빈을 등록합니다.
    • @ConditionalOnClass: 특정 클래스가 클래스패스에 존재하는 경우에만 빈을 등록.
    • @ConditionalOnMissingBean: 특정 빈이 이미 등록되어 있지 않은 경우에만 빈을 등록.
    • @ConditionalOnProperty: 특정 프로퍼티가 설정되어 있을 때 빈을 등록.
  4. 실행 시점의 구성 적용: 스프링 부트는 자동 구성 클래스를 로드하고, 그 안에서 제공되는 구성을 적용합니다. 이 구성들은 스프링 애플리케이션 컨텍스트에 필요한 빈을 등록하거나 특정 설정을 구성하는 방식으로 동작합니다.
  5. 예를 들어, spring.datasource 관련 프로퍼티를 설정하지 않아도, DataSourceAutoConfiguration이 자동으로 기본적인 데이터 소스를 설정합니다.

3. @EnableAutoConfiguration의 세부 동작 단계

  • 단계 1: 패키지 스캔 및 자동 구성 활성화
    • 스프링 부트는 @EnableAutoConfiguration이 적용된 애플리케이션을 시작할 때 패키지 스캔을 수행하고, 클래스패스에서 사용할 수 있는 자동 구성 클래스를 로드합니다.
  • 단계 2: spring.factories 파일 참조
    • 스프링 부트는 META-INF/spring.factories 파일에서 자동 구성을 위한 설정 정보를 읽어옵니다.
  • 단계 3: 빈 등록 및 자동 구성
    • 조건에 맞는 자동 구성 클래스가 빈을 등록하거나 구성을 적용합니다.
    • 특정 기능에 필요한 빈이 이미 존재하는 경우, 자동 구성 클래스는 빈을 추가로 등록하지 않습니다.
  • 단계 4: 사용자 설정과 자동 구성의 병합
    • 개발자가 명시적으로 제공한 설정은 자동 구성을 덮어씁니다. 즉, application.properties 또는 application.yml 파일에 정의한 값이 우선적으로 적용됩니다.
    • 자동 구성은 디폴트값을 제공하되, 필요할 경우 개발자가 이를 재정의할 수 있습니다.

4. 자동 설정 비활성화 및 커스터마이징

스프링 부트에서 자동 구성을 무조건 사용하는 것은 아닙니다. 필요하지 않은 경우 특정 자동 구성을 비활성화할 수도 있습니다.

  • 특정 자동 구성 비활성화: @SpringBootApplication 또는 @EnableAutoConfiguration에 exclude 속성을 사용하여 특정 자동 구 클래스를 비활성화할 수 있습니다.
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
  • 사용자 정의 설정 우선: 자동 구성을 사용하면서도, 특정 구성을 사용자 정의 구성으로 덮어쓰려면, application.properties 또는 application.yml 파일을 통해 명시적으로 설정을 지정하면 됩니다. 스프링 부트는 이 설정을 자동 구성보다 우선적으로 적용합니다.

5. 예시: 데이터베이스 자동 구성

데이터베이스 설정의 경우, 스프링 부트는 다음과 같은 과정을 통해 자동 구성을 처리합니다:

  1. 클래스패스 확인: H2 또는 MySQL 등의 JDBC 드라이버가 클래스패스에 있는지 확인.
  2. 자동 구성 클래스 로드: DataSourceAutoConfiguration 클래스를 로드.
  3. 조건 확인: @ConditionalOnClass(DataSource.class) 및 @ConditionalOnMissingBean(DataSource.class) 조건을 확인.
  4. 빈 등록: 조건이 충족되면 DataSource 빈을 등록하고, 기본적인 연결 구성을 자동으로 적용.
  5. 사용자 구성 적용: application.properties에서 spring.datasource.url 등을 구성한 경우 이를 사용.

 

@EnableAutoConfiguration은 스프링 부트에서 애플리케이션을 쉽고 빠르게 구성할 수 있도록 도와주는 강력한 도구입니다. 자동 구성을 통해 기본 설정을 빠르게 적용할 수 있으며, 필요에 따라 사용자가 직접 구성을 추가하거나 특정 자동 구성을 비활성화하여 애플리케이션을 커스터마이징할 수 있습니다. 이 기능 덕분에 스프링 부트는 설정의 복잡성을 크게 줄이고, 개발 속도를 높여줍니다.

'Spring Boot > Spring Boot Auto Configuration' 카테고리의 다른 글

Project Classpath  (0) 2024.10.16
@AutoConfigurationPackage  (0) 2024.10.16
@SpringBootConfiguration  (0) 2024.10.16
SpringApplication.run  (0) 2024.10.16
@SpringBootApplication  (0) 2024.10.16