https://sundaland.tistory.com/382
[ ▶ @EnableAutoConfiguration ]
@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 {};
}
[ ▷ @EnableAutoConfiguration의 역할 ]
@EnableAutoConfiguration은 기본적으로 애플리케이션에 포함된 클래스패스를 기반으로 적절한 설정을 자동으로 적용하는 메커니즘을 제공한다. 이를 통해 개발자는 설정 작업을 최소화할 수 있으며, 필요한 기능을 빠르게 구현할 수 있다.
- 자동 구성(Autoconfiguration): 클래스 경로 상에 포함된 라이브러리들을 기반으로, 그 라이브러리와 관련된 구성을 자동으로 수행한다. 예를 들어, H2 데이터베이스가 클래스 경로에 존재하면, 이를 감지하여 데이터 소스(DataSource)를 자동으로 구성한다.
- 디폴트값 적용: 자동 구성은 일반적으로 합리적인 디폴트값을 사용하여 구성된다. 즉, 별도의 구성이 없는 경우에도 애플리케이션이 정상적으로 동작할 수 있도록 미리 정의된 값을 사용한다.
- 조건부 빈 등록: 자동 구성은 다양한 조건(예: 특정 클래스가 클래스패스에 존재하는지 여부)에 따라 빈을 등록하거나 구성을 적용한다. @ConditionalOnClass, @ConditionalOnMissingBean 등의 어노테이션이 이를 제어한다.
[ ▷ 자동 구성이 동작하는 방식 ]
@EnableAutoConfiguration은 기본적으로 spring.factories 파일을 기반으로 자동 설정 클래스를 찾고 로드한다.
- Class Path 분석: 스프링 부트는 애플리케이션이 실행될 때, 클래스 패스를 스캔하여 어떤 라이브러리들이 포함되어 있는지 확인한다. 이때 포함된 라이브러리들에 맞는 자동 구성 클래스를 찾는다. (H2 데이터베이스가 클래스 패스에 존재한다면, DataSourecAutoConfiguration 클래스가 활성화된다.)
- 자동 구성 파일 로드: spring-boot-autoconfigure JAR 파일 내의 META-INF/spring.factories 파일에서 자동 구성 클래스 목록을 읽어들인다. 이 파일에는 스프링 부트가 제공하는 다양한 자동 구성 클래스들이 정의되어 있다. (org.springframework.boot.autoconfigure.EnableAutoConfiguration=...와 같은 형식으로 자동 구성 클래스가 나열된다.)
- 조건에 따른 빈 등록: 각 자동 구성 클래스는 @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty 등의 조건부 어노테이션을 사용하여, 특정 조건이 만족될 때에만 빈을 등록한다.
- 실행 시점의 구성 적용: 스프링 부트는 자동 구성 클래스를 로드하고, 그 안에서 제공되는 구성을 적용한다. 이 구성들은 스프링 애플리케이션 컨텍스트에 필요한 빈을 등록하거나 특정 설정을 구성하는 방식으로 동작한다. (spring.datasource 관련 프로퍼티를 설정하지 않아도, DataSourceAutoConfiguration이 자동으로 기본적인 데이터 소스를 설정한다.)
- @ConditionalOnClass: 특정 클래스가 클래스패스에 존재하는 경우에만 빈을 등록.
- @ConditionalOnMissingBean: 특정 빈이 이미 등록되어 있지 않은 경우에만 빈을 등록.
- @ConditionalOnProperty: 특정 프로퍼티가 설정되어 있을 때 빈을 등록.
[ ▷ @EnableAutoConfiguration의 세부 동작 단계 ]
△ 1. 패키지 스캔 및 자동 구성 활성화
스프링 부트는 @EnableAutoConfiguration이 적용된 애플리케이션을 시작할 때 패키지 스캔을 수행하고, 클래스패스에서 사용할 수 있는 자동 구성 클래스를 로드한다.
△ 2. spring.factories 파일 참조
스프링 부트는 META-INF/spring.factories 파일에서 자동 구성을 위한 설정 정보를 읽어온다.
△ 3. 빈 등록 및 자동 구성
- 조건에 맞는 자동 구성 클래스가 빈을 등록하거나 구성을 적용한다.
- 특정 기능에 필요한 빈이 이미 존재하는 경우, 자동 구성 클래스는 빈을 추가로 등록하지 않는다.
△ 4. 사용자 설정과 자동 구성의 병합
- 개발자가 명시적으로 제공한 설정은 자동 구성을 덮어쓴다. 즉, application.properties 또는 application.yml 파일에 정의한 값이 우선적으로 적용된다.
- 자동 구성은 디폴트값을 제공하되, 필요할 경우 개발자가 이를 재정의할 수 있다.
[ ▷ 자동 설정 비활성화 및 커스터마이징 ]
스프링 부트에서 자동 구성을 무조건 사용하는 것은 아니다. 필요하지 않은 경우 특정 자동 구성을 비활성화할 수도 있다.
- 특정 자동 구성 비활성화: @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 파일을 통해 명시적으로 설정을 지정하면 된다. 스프링 부트는 이 설정을 자동 구성보다 우선적으로 적용한다.
[ ▷ 데이터베이스 자동 구성 ]
데이터베이스 설정의 경우, 스프링 부트는 다음과 같은 과정을 통해 자동 구성을 처리한다.
- 클래스패스 확인: H2 또는 MySQL 등의 JDBC 드라이버가 클래스패스에 있는지 확인한다.
- 자동 구성 클래스 로드: DataSourceAutoConfiguration 클래스를 로드 한다.
- 조건 확인: @ConditionalOnClass(DataSource.class) 및 @ConditionalOnMissingBean(DataSource.class) 조건을 확인 한다.
- 빈 등록: 조건이 충족되면 DataSource 빈을 등록하고, 기본적인 연결 구성을 자동으로 적용한다.
- 사용자 구성 적용: application.properties에서 spring.datasource.url 등을 구성한 경우 이를 사용한다.
@EnableAutoConfiguration은 스프링 부트에서 애플리케이션을 쉽고 빠르게 구성할 수 있도록 도와주는 강력한 도구이다. 자동 구성을 통해 기본 설정을 빠르게 적용할 수 있으며, 필요에 따라 사용자가 직접 구성을 추가하거나 특정 자동 구성을 비활성화하여 애플리케이션을 커스터마이징할 수 있다. 이 기능 덕분에 스프링 부트는 설정의 복잡성을 크게 줄이고, 개발 속도를 높여준다.
'Spring Boot > Auto-Configuration' 카테고리의 다른 글
@AutoConfigurationPackage (0) | 2024.10.21 |
---|---|
Project Classpath (0) | 2024.10.21 |
Spring Boot Starter (0) | 2024.10.21 |
Spring Boot DevTools (0) | 2024.10.21 |
SpringApplication.run (0) | 2024.10.21 |