2024. 10. 16. 12:40ㆍSpring Boot/Spring Boot Auto Configuration
🚀 Spring Boot의 @EnableAutoConfiguration
분석 🔍
🎯 목표:
@EnableAutoConfiguration
이 Spring Boot에서 어떤 역할을 하는지 심층적으로 이해- Spring Boot의 자동 구성(Auto Configuration) 메커니즘과
spring.factories
와의 관계 분석 - 자동 구성 클래스를 등록하는 방식과
Conditional
기반 동작 방식 학습
🏗️ 1. @EnableAutoConfiguration
이란?
🔍 개념 정의
✅ @EnableAutoConfiguration
은 Spring Boot에서 애플리케이션이 필요로 하는 설정을 자동으로 구성하는 핵심 기능
✅ 클래스패스(classpath) 내의 라이브러리를 감지하고, 적절한 빈(Bean)을 자동으로 등록
✅ 개발자가 일일이 설정을 작성하지 않아도, Spring Boot가 디폴트로 제공하는 자동 구성을 활용하여 손쉽게 애플리케이션을 실행할 수 있도록 도움
📌 @EnableAutoConfiguration
은 단독으로 사용될 수도 있지만, 일반적으로 @SpringBootApplication
에 포함되어 자동으로 활성화됨
🔥 2. @EnableAutoConfiguration
의 역할과 동작 원리
🔹 Spring Boot에서 자동 구성이 필요한 이유
💡 전통적인 Spring 애플리케이션 개발 방식 vs. Spring Boot 방식 비교
특징 | 전통적인 Spring 방식 | Spring Boot 방식 (@EnableAutoConfiguration ) |
---|---|---|
구성 방식 | XML 또는 Java Config 구성 필요 | 자동 구성 제공 (Auto Config) |
데이터 소스 설정 | @Bean DataSource 직접 등록 |
자동으로 HikariCP, H2, MySQL 설정 감지 |
웹 서버 | 개발자가 수동으로 Tomcat, Jetty 설정 | 내장 톰캣, Jetty 지원 (디폴트 값 제공) |
📌 Spring Boot는 @EnableAutoConfiguration
을 활용하여, 위의 구성을 자동으로 감지하고 적용
🔍 @EnableAutoConfiguration
의 핵심 기능
✔ 자동 구성(Autoconfiguration): 클래스 경로 내의 라이브러리를 감지하여 적절한 구성 적용
✔ 디폴트 설정(Default Configuration): 개발자가 별도로 설정하지 않으면 합리적인 디폴트 값 적용
✔ 조건부 빈 등록(Conditional Bean Registration): 특정 조건을 만족하는 경우에만 빈을 등록
✔ 사용자 설정 우선(User Configuration Priority): 개발자가 직접 설정한 값이 있을 경우, 자동 구성보다 우선 적용
⚙️ 3. @EnableAutoConfiguration
내부 동작 원리
🔍 @EnableAutoConfiguration
어노테이션 코드 분석
@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
의 핵심:
✔ @Import(AutoConfigurationImportSelector.class)
→ 자동 구성 클래스를 선택하여 로드하는 역할
✔ exclude()
→ 특정 자동 구성 클래스를 제외 가능
✔ excludeName()
→ 문자열을 사용하여 특정 자동 구성 클래스를 제외 가능
🔍 자동 구성 클래스 로딩 과정
@EnableAutoConfiguration
은 내부적으로 SpringFactoriesLoader를 사용하여 spring.factories
파일을 로드함
1️⃣ 클래스패스(classpath) 내의 META-INF/spring.factories
파일 확인
2️⃣ 파일 내에서 EnableAutoConfiguration
키를 찾아 자동 구성 클래스를 로드
3️⃣ 조건부 어노테이션(@Conditional)을 확인하여 해당 조건이 만족될 경우 빈(Bean) 등록
📌 spring.factories
에서 자동 구성 클래스 확인
📌 META-INF/spring.factories
예제
# ✅ 자동 구성(Auto Configuration) 클래스 목록
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
📌 Spring Boot는 이 정보를 기반으로 DataSourceAutoConfiguration
과 HibernateJpaAutoConfiguration
을 자동으로 로드
🔄 4. 자동 구성 클래스의 조건부 로딩(Conditional Loading)
📌 자동 구성 클래스 내부의 @Conditional
어노테이션 분석
Spring Boot는 단순히 자동 구성 클래스를 무조건 로드하는 것이 아니라, 특정 조건을 만족하는 경우에만 빈을 등록
📌 자동 구성 클래스 내부 코드 예제 (DataSourceAutoConfiguration
)
@Configuration
@ConditionalOnClass(DataSource.class) // 📌 DataSource가 클래스패스에 존재하는 경우만 활성화
@ConditionalOnMissingBean(DataSource.class) // 📌 기존에 DataSource가 없는 경우만 빈 등록
public class DataSourceAutoConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return new HikariDataSource();
}
}
✔ @ConditionalOnClass(DataSource.class)
→ DataSource
가 클래스패스에 존재할 경우만 자동 구성 활성화
✔ @ConditionalOnMissingBean(DataSource.class)
→ 개발자가 직접 DataSource
를 설정하지 않았을 경우만 자동 등록
🔧 5. @EnableAutoConfiguration
의 커스터마이징
✅ 1️⃣ 특정 자동 구성 클래스 제외하기
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
📌 H2, MySQL 등의 자동 구성을 제외하고, 직접 데이터 소스를 설정할 수 있음
✅ 2️⃣ 특정 자동 구성을 프로퍼티에서 비활성화
application.properties
또는 application.yml
에서 비활성화 가능
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
✅ 3️⃣ 사용자 정의 자동 구성 클래스 등록
📌 META-INF/spring.factories
에 직접 자동 구성 클래스 추가 가능
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyCustomAutoConfiguration
📌 사용자 정의 자동 구성 클래스 (MyCustomAutoConfiguration.java
)
@Configuration
public class MyCustomAutoConfiguration {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
✔ 사용자 정의 자동 구성을 등록하여 프로젝트에 맞는 확장 가능
🎯 6. Summary
✅ @EnableAutoConfiguration
은 Spring Boot의 핵심 기능으로, 자동 구성을 통해 개발자의 설정 부담을 최소화
✅ 자동 구성은 spring.factories
를 기반으로 동작하며, SpringFactoriesLoader
를 사용하여 동적으로 로드
✅ @Conditional
기반으로 특정 조건이 충족될 때만 자동 설정이 활성화됨
✅ 필요 없는 자동 구성을 제외하거나, 직접 사용자 정의 자동 구성을 추가하여 최적화 가능
🔥 이제 @EnableAutoConfiguration
을 활용하여 더욱 강력한 Spring Boot 애플리케이션을 개발하세요! 🚀
'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 |