티스토리 뷰

IT/Spring

Spring Boot 자동 설정 원리 완전 정복 - @EnableAutoConfiguration 내부에서 벌어지는 일

Stv 2025. 6. 25. 21:52

목차


    1. Spring Boot의 자동 설정이란?

    Spring Boot는 @EnableAutoConfiguration을 통해
    필요한 Bean 설정을 자동으로 구성해주는 기능을 제공한다.

     

    즉, 우리가 DataSource, DispatcherServlet, Jackson, SecurityFilter 등을

    직접 설정하지 않아도 자동으로 등록해주는 것


    2. @SpringBootApplication 안에 숨어 있는 핵심

    @SpringBootApplication
    • 사실 이것은 다음 3개의 어노테이션을 묶은 복합 어노테이션이다.
    @Configuration
    @ComponentScan
    @EnableAutoConfiguration
    • 이 중 자동 설정의 핵심은 @EnableAutoConfiguration이다.

    3. @EnableAutoConfiguration의 내부 동작

    📌핵심 구조

    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    • 이 어노테이션은 내부적으로 AutoConfigurationImportSelector를 통해 자동 설정 클래스 목록을 읽어와 등록한다.

    4. 자동 설정 클래스 목록은 어디에?

    ✅spring-boot-autoconfigure JAR 내부에 존재하는 META-INF/spring.factories 또는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파이에서 로딩된다.

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
    org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
    • 여기에 있는 클래스들이 조건에 맞으면 Bean으로 등록됨

    5. 조건 기반 설정 : @Conditional의 세계

    • Spring Boot는 무조건 Bean을 등록하지 않는다.
    • 조건이 맞는 경우에만 등록한다.

    📌 주요 조건 어노테이션

    어노테이션 설명
    @ConditionalOnClass 클래스가 클래스패스에 존재할 경우
    @ConditionalOnMissingBean 특정 Bean이 없는 경우에만 등록
    @ConditionalOnProperty application.yml에 특정 속성이 있을 때만
    @ConditionalOnWebApplication 웹 애플리케이션 환경일 경우

     

    예시 :

    @ConditionalOnClass(DataSource.class)
    @ConditionalOnProperty(name = "spring.datasource.url")
    public class DataSourceAutoConfiguration { ... }

    6. Bean 우선순위 결정 방식

    • 자동 설정보다 개발자가 수동으로 등록한 Bean이 우선
    • 예 : @Bean이나 @Configuration으로 등록한 경우, 해당 Bean이 사용됨
    • @ConditionalOnMissingBean으로 자동 설정의 중복 방지를 처리함

    7. 실무에서 자동 설정 무시하거나 커스터마이징하기

    ✅ 자동 설정 제외

    @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })

     

    ✅ 특정 조건 설정

    spring:
      jackson:
        date-format: yyyy-MM-dd
        property-naming-strategy: SNAKE_CASE
    • 이 설정은 JacksonAutoConfiguration에서 읽어 사용됨

    8. 자동 설정 만들기 (커스텀 AutoConfiguration)

     

    Step 1.@Configuration 클래스 정의

    @Configuration
    @ConditionalOnProperty(name = "featureX.enabled", havingValue = "true")
    public class FeatureXAutoConfiguration {
        @Bean
        public FeatureXService featureXService() {
            return new FeatureXService();
        }
    }

     

    Step 2. 등록 파일 작성

    resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports:

    com.example.autoconfig.FeatureXAutoConfiguration
    • 이후 의존성 추가만으로도 설정 자동 반영 가능

    9. 자동 설정 확인 방법

     

    1.

    $ mvn spring-boot:run -Ddebug

     

    2.

    debug: true

     

    출력 예 :

    Positive matches:
       - WebMvcAutoConfiguration matched
    Negative matches:
       - SecurityAutoConfiguration did not match
    • 어떤 설정이 적용/제외됐는지 확인 가능

    ✅ 마무리 요약

    항목 요약
    핵심 어노테이션 @EnableAutoConfiguration -> 자동 설정 클래스 등록
    적용 기준 @Conditional 계열 어노테이션으로 조건 판단
    우선순위 개발자 수동 설정 > 자동 설정
    실무 활용 자동 설정 활용/제외/ 확장 모두 가능

    🔜 다음 포스팅에서는 Spring MVC 요청 처리 흐름에 대해서 알아보고자 한다. - DispatcherServlet -> HandlerMapping -> Controller