AutoConfigurationImportSelector

2024. 10. 18. 09:45Spring Boot/Spring Boot Auto Configuration

AutoConfigurationImportSelector는 Spring Boot의 자동 구성(autoconfiguration) 메커니즘에서 중요한 역할을 담당하는 클래스입니다. 이 클래스는 애플리케이션이 시작될 때 필요한 자동 구성 클래스를 동적으로 선택하는데 사용됩니다. Spring Boot에서는 기본적으로 META-INF/spring.factories 파일을 통해 자동 구성 클래스를 찾지만, Spring Boot 2.7 이후로는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일도 함께 사용되기 시작했습니다.

자세한 내용은 다음과 같습니다.

1. AutoConfigurationImportSelector의 역할

AutoConfigurationImportSelector는 애플리케이션의 클래스 경로에서 필요한 자동 구성 클래스를 선택하는 기능을 제공하는 ImportSelector 인터페이스를 구현한 클래스입니다. 이 클래스는 주로 @EnableAutoConfiguration 또는 @SpringBootApplication 애노테이션이 선언된 곳에서 호출되어, 애플리케이션에 필요한 자동 구성 클래스를 로드합니다.

2. META-INF/spring.factories 파일

Spring Boot의 이전 버전에서는 자동 구성을 할 때 META-INF/spring.factories 파일에 나열된 자동 구성 클래스들을 기준으로 동작했습니다. 이 파일의 형식은 아래와 같습니다.

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfiguration.Class1,\
com.example.autoconfiguration.Class2

이 파일은 EnableAutoConfiguration 키를 기반으로 자동 구성에 사용할 클래스들을 정의합니다. Spring Boot는 이 파일을 읽어 모든 자동 구성 클래스를 로드하고, 각 클래스의 조건이 만족되면 이를 애플리케이션의 ApplicationContext에 추가합니다.

3. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일

Spring Boot 2.7부터는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일도 함께 사용됩니다. 이는 기존의 spring.factories 파일에서 자동 구성을 분리하고, 더 나은 모듈성과 관리성을 제공합니다. 이 파일은 자동 구성 클래스를 정의하는 새로운 방식으로 도입되었으며, 이 파일의 형식은 다음과 같습니다.

com.example.autoconfiguration.Class1
com.example.autoconfiguration.Class2

이 파일은 spring.factories와 달리, 더 간결하게 클래스 목록을 나열하는데 중점을 둡니다. 이 파일에 정의된 자동 구성 클래스는 AutoConfigurationImportSelector에 의해 자동으로 선택되고, 애플리케이션의 컨텍스트에 등록됩니다.

4. AutoConfigurationImportSelector의 동작 방식

AutoConfigurationImportSelector는 자동 구성 클래스를 선택하는 핵심 메커니즘을 다음과 같이 수행합니다.

  • 먼저, spring.factoriesAutoConfiguration.imports 파일을 둘 다 스캔하여 사용 가능한 자동 구성 클래스를 찾아냅니다.
  • 이 클래스는 @EnableAutoConfiguration의 구현체로서, getAutoConfigurationEntry 메서드를 통해 자동 구성 클래스를 선택합니다.
  • 이 과정에서 조건부 애노테이션@ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty 등이 선언된 구성 클래스가 있는 경우, 해당 조건이 충족될 때에만 그 클래스를 애플리케이션 컨텍스트에 추가합니다.

5. AutoConfiguration.imports 파일 사용의 장점

Spring Boot 2.7 이후로 AutoConfiguration.imports 파일을 도입한 이유는 몇 가지 장점을 제공하기 위함입니다.

  • 모듈성: 각 모듈의 자동 구성을 독립적으로 관리할 수 있습니다. 이는 모듈 간의 의존성을 최소화하고, 더 깔끔한 구성 관리를 가능하게 합니다.
  • 가독성 및 간결성: spring.factories 파일에 비해 더 간단한 형식을 제공하여 자동 구성 클래스를 나열할 때 중복된 정보를 줄일 수 있습니다.
  • 호환성 유지: spring.factories 파일은 여전히 사용 가능하므로, 이전 버전의 Spring Boot 애플리케이션과도 호환성을 유지할 수 있습니다.

6. 우선순위 및 적용

두 파일을 사용하는 경우, AutoConfiguration.imports 파일이 더 높은 우선순위를 갖습니다. 만약 동일한 클래스가 두 파일에 정의되어 있다면, AutoConfiguration.imports 파일에 정의된 내용이 우선적으로 적용됩니다. 다만, spring.factories는 여전히 하위 호환성을 제공하고 있으며, Spring Boot 2.7 이전 버전에서는 계속 사용될 수 있습니다.

7. 정리

AutoConfigurationImportSelector는 Spring Boot의 자동 구성 클래스를 동적으로 선택하는 메커니즘을 제공하며, Spring Boot 2.7 이후부터는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 파일을 통해 더 간결하고 모듈화된 방식으로 자동 구성을 관리할 수 있게 되었습니다. 이전의 spring.factories 파일과 함께 동작하여 하위 호환성을 유지하면서도, 새로운 방식의 자동 구성을 제공합니다.

'Spring Boot > Spring Boot Auto Configuration' 카테고리의 다른 글

PostProcessorRegistrationDelegate  (0) 2024.10.18
AnnotationConfigServletWebServerApplicationContext  (0) 2024.10.18
DeferredImportSelector  (0) 2024.10.17
spring-boot-autoconfigure.jar  (0) 2024.10.16
spring.factories  (0) 2024.10.16