Spring Boot Auto Configuration

김유진·2026년 4월 7일
post-thumbnail

개요

Spring을 배우면서 pom.xml에 의존성을 추가하고 라이브러리를 가져다 쓰는 걸 아주 습관적으로 반복했다.
하지만 생각해보면 어떻게 작동되는지는 궁금하지도 않았고 알 필요도 없다고 생각했다.


노란 밑줄 굉장히 거슬림

그러나 Spring에서의 Auto Configuration을 배우는 과정 중에,
✅ maven과 Spring이 어떻게 상호작용 하는지,
✅ 어떻게 외부 라이브러리를 가져와서 사용하는지,
✅ 그로 인해 어떤 편리함이 있는지,
알게 되어서 정리한다.

메커니즘

1. pom.xml에 의존성 추가

개발자는 외부 라이브러리의 의존성(spring boot, lombok, mysql 등)을 pom.xml에 추가한다.
이는 마치 필요한 부품의 목록을 작성하는 것과 같다.

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
      
      ...

2. 의존성 관리

빌드 초기 단계(패키징, IDE프로젝트 로딩, complie 등)에서, pom.xml을 참고하여 maven Central Repository(mvn 원격 저장소) 으로부터 실제 코드를 다운받고, 로컬 저장소에 캐싱한다.
(그래서 mvn clean package를 처음하면 라이브러리를 다운 받느라 빌드하는데 시간이 오래 걸린다.)

그리고 다운받은 라이브러리 jar 파일은 프로젝트 classpath에 올려진다.
📌 classpath에 올려졌다는 표현은, 애플리케이션 실행시 JVM의 ClassLoader가 JAR 파일을 읽을 수 있는 상태가 된다는 의미이다.

3. @EnableAutoConfiguration에 의한 라이브러리 빈 자동 등록

스프링 부트가 실행되고, @EnableAutoConfiguration 어노테이션을 통해 외부 라이브러리 빈 등록이 시작된다.
@EnableAutoConfiguration 은, classpath에 있는 라이브러리를 확인하고, 필요한 빈을 자동으로 등록해주는 어노테이션이다.

  1. META-INF/spring/*.imports 목록을 쭉 스캔한다. 이때 이 목록에는 제공할 수 있는 모든 AutoConfiguration이 담겨있다.
    (Spring 2.7 ~ 이상의 버전에만 해당)
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration  
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration  
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration  
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration  
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration  
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration  
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
...
  1. /*.imports 목록의 클래스를 탐색하면서 @Conditional 조건을 체크한다.
@AutoConfiguration(
    after = {DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) // ----> 이런 이런 조건들을 classpath의 jar와 비교함
@AutoConfigureOrder(-2147483638)
@ImportRuntimeHints({WebResourcesRuntimeHints.class})
public class WebMvcAutoConfiguration {
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = "";
    private static final String SERVLET_LOCATION = "/";

    @Bean
    @ConditionalOnMissingBean({HiddenHttpMethodFilter.class})
    @ConditionalOnProperty(
        prefix = "spring.mvc.hiddenmethod.filter",
        name = {"enabled"}
    )
    public OrderedHiddenHttpMethodFilter hiddenHttpMethodFilter() {
        return new OrderedHiddenHttpMethodFilter();
    }
  1. classpath에 올려진 jar파일을 기준으로 조건을 체크하고, 조건 만족 시 해당 AutoConfiguration 클래스의 빈을 생성하고 등록한다.
    정확히는, 개발자가 직접 등록한 빈이 없을 때(ConditionalOnMissingBean) 작동한다. 그러므로 우리가 직접 설정을 커스텀 할 수 있게 된다. ⭐

마무리

결국, 습관적으로 추가했던 의존성이 실제로 어떻게 가져와지며, 어떻게 빈으로 등록이 되는지를 알 수 있게 됐다!

그리고, Spring이 없었다면 얼마나 많은 과정을 거쳐 사용해야했는지 생각한다면, Spring의 자동화 로직은 참 편리한 것 같다!

profile
제가 공부한 내용을 적은 것이기 때문에 틀릴 수 있습니다.

0개의 댓글