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

노란 밑줄 굉장히 거슬림
그러나 Spring에서의 Auto Configuration을 배우는 과정 중에,
✅ maven과 Spring이 어떻게 상호작용 하는지,
✅ 어떻게 외부 라이브러리를 가져와서 사용하는지,
✅ 그로 인해 어떤 편리함이 있는지,
알게 되어서 정리한다.
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>
...
빌드 초기 단계(패키징, IDE프로젝트 로딩, complie 등)에서, pom.xml을 참고하여 maven Central Repository(mvn 원격 저장소) 으로부터 실제 코드를 다운받고, 로컬 저장소에 캐싱한다.
(그래서 mvn clean package를 처음하면 라이브러리를 다운 받느라 빌드하는데 시간이 오래 걸린다.)
그리고 다운받은 라이브러리 jar 파일은 프로젝트 classpath에 올려진다.
📌 classpath에 올려졌다는 표현은, 애플리케이션 실행시 JVM의 ClassLoader가 JAR 파일을 읽을 수 있는 상태가 된다는 의미이다.
@EnableAutoConfiguration에 의한 라이브러리 빈 자동 등록스프링 부트가 실행되고, @EnableAutoConfiguration 어노테이션을 통해 외부 라이브러리 빈 등록이 시작된다.
@EnableAutoConfiguration 은, classpath에 있는 라이브러리를 확인하고, 필요한 빈을 자동으로 등록해주는 어노테이션이다.
META-INF/spring/*.imports 목록을 쭉 스캔한다. 이때 이 목록에는 제공할 수 있는 모든 AutoConfiguration이 담겨있다.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
...
/*.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();
}
AutoConfiguration 클래스의 빈을 생성하고 등록한다.ConditionalOnMissingBean) 작동한다. 그러므로 우리가 직접 설정을 커스텀 할 수 있게 된다. ⭐결국, 습관적으로 추가했던 의존성이 실제로 어떻게 가져와지며, 어떻게 빈으로 등록이 되는지를 알 수 있게 됐다!
그리고, Spring이 없었다면 얼마나 많은 과정을 거쳐 사용해야했는지 생각한다면, Spring의 자동화 로직은 참 편리한 것 같다!