2024. 10. 16. 17:04ㆍSpring Boot/Spring Boot Auto Configuration
🚀 Spring Boot의 spring.factories
완벽 분석 🔍
🎯 목표:
spring.factories
파일이 무엇이며, Spring Boot에서 어떤 역할을 하는지 심층적으로 이해- Spring Boot의 자동 구성(Auto Configuration)과의 관계 분석
SpringFactoriesLoader
의 내부 동작 원리- 실제 프로젝트에서
spring.factories
를 활용하는 고급 기법 학습 - 최적화 및 운영 시 고려 사항
🏗️ 1. spring.factories
란?
🔹 개념 정의
✅ spring.factories
는 Spring Boot의 자동 구성(Auto Configuration) 시스템의 핵심 메타데이터 파일
✅ 아티팩트 JAR의 클래스패스(classpath
) 내의 META-INF/spring.factories
경로에 위치
✅ JAR 파일 내부에도 포함될 수 있으며, 여러 개의 spring.factories
가 존재할 수 있음
✅ Spring Boot는 이 파일을 기반으로 자동 설정 클래스, 초기화 클래스, 리스너 등을 로드
📌 2. spring.factories
의 역할
🔍 Spring Boot에서 spring.factories
는 어디에 사용되는가?
Spring Boot에서 spring.factories
파일은 주로 자동 설정(Auto Configuration), 이벤트 리스너, 컨텍스트 초기화 등의 목적으로 사용됩니다.
사용 목적 | 설명 |
---|---|
자동 설정(Auto Configuration) | EnableAutoConfiguration 을 사용하여 자동 설정 클래스 로딩 |
애플리케이션 리스너(ApplicationListener) | Spring Boot 애플리케이션 이벤트 감지 |
컨텍스트 초기화(ApplicationContextInitializer) | Spring 애플리케이션 컨텍스트 초기화 시 특정 로직 실행 |
서블릿 컨테이너 초기화 | Spring Boot 내장 톰캣, Jetty 등의 초기화 설정 |
📄 spring.factories
파일 예제
아래는 Spring Boot에서 spring.factories
를 사용하는 대표적인 예제입니다.
# ✅ 자동 설정(Auto Configuration) 클래스 등록
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
# ✅ 애플리케이션 리스너(ApplicationListener) 등록
org.springframework.context.ApplicationListener=\
com.example.MyCustomApplicationListener
# ✅ 애플리케이션 컨텍스트 초기화(ApplicationContextInitializer) 등록
org.springframework.context.ApplicationContextInitializer=\
com.example.MyApplicationContextInitializer
📌 Spring Boot는 위의 파일을 기반으로 SpringFactoriesLoader
를 사용하여 클래스를 동적으로 로드하고 실행함
🛠️ 3. Spring Boot에서 spring.factories
동작 원리
🔹 SpringFactoriesLoader란?
Spring Boot는 spring.factories
를 직접 읽어서 클래스를 로드하는 것이 아니라,
✔ SpringFactoriesLoader
를 사용하여 자동으로 해당 파일을 읽고 클래스를 인스턴스화
✔ Spring Boot의 자동 설정을 가능하게 하는 핵심 클래스
🔍 동작 과정
Spring Boot가 spring.factories
를 활용하는 과정은 다음과 같습니다.
1️⃣ META-INF/spring.factories
파일을 읽음
2️⃣ 주어진 키(예: EnableAutoConfiguration
)에 해당하는 모든 클래스를 리스트로 가져옴
3️⃣ 리플렉션(Reflection)을 사용하여 해당 클래스를 인스턴스화
4️⃣ Spring Boot 컨텍스트(ApplicationContext)에 자동으로 등록
📌 SpringFactoriesLoader
의 핵심 코드 분석
Spring Boot는 spring.factories
를 읽고 인스턴스화하는 역할을 SpringFactoriesLoader
에서 수행합니다.
public static <T> List<T> loadFactories(Class<T> factoryType, ClassLoader classLoader) {
List<String> factoryNames = loadFactoryNames(factoryType, classLoader);
List<T> result = new ArrayList<>(factoryNames.size());
for (String factoryName : factoryNames) {
result.add(instantiateFactory(factoryName, factoryType, classLoader));
}
return result;
}
📌 이 과정에서 실행되는 주요 메서드:
✔ loadFactoryNames()
→ spring.factories
파일에서 특정 타입(factoryType
)의 클래스를 찾음
✔ instantiateFactory()
→ 찾은 클래스들을 리플렉션을 통해 인스턴스화
⚡ 4. spring.factories
를 활용한 자동 설정 적용
✅ Spring Boot의 자동 설정(Auto Configuration) 로딩 과정
Spring Boot는 다음 코드에서 spring.factories
파일을 사용하여 자동 구성 클래스를 로드합니다.
List<EnableAutoConfiguration> autoConfigurations =
SpringFactoriesLoader.loadFactories(EnableAutoConfiguration.class, getClass().getClassLoader());
✔ JDBC 및 JPA 관련 자동 설정 클래스(DataSourceAutoConfiguration
, HibernateJpaAutoConfiguration
)가 자동으로 로드됨
✔ 개발자가 @EnableAutoConfiguration
을 명시하지 않아도, 자동으로 적용됨
❌ 5. spring.factories
가 없는 경우 (필요 없는 이유)
📌 spring.factories
파일이 존재하지 않을 수도 있는 이유
spring.factories
가 없는 라이브러리는 Spring Boot의 자동 구성을 필요로 하지 않는 경우가 많음.
대표적인 경우는 다음과 같음.
🚀 (1) Spring 자동 설정을 사용하지 않는 경우
✔ spring.factories
는 Spring Boot의 자동 구성(Auto Configuration)과 관련이 있음
✔ 하지만, 모든 라이브러리가 자동 구성을 필요로 하는 것은 아님
✅ 예제: 수동 설정이 가능한 경우
@Configuration
public class MyManualConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
✔ 이 경우, spring.factories
를 사용할 필요 없이 개발자가 직접 빈을 등록 가능
🚀 (2) 독립적인 라이브러리 또는 비-Spring 라이브러리
✔ Spring Boot에 종속적이지 않고 독립적인 라이브러리는 spring.factories
가 필요 없음
✔ 대표적인 예:
- JSON 처리 라이브러리 (
Jackson
) - 로깅 라이브러리 (
SLF4J
,Logback
) - Apache Commons 유틸리티 (
commons-lang
,commons-io
)
✅ 예제: Jackson 라이브러리는 spring.factories
가 필요 없음
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(new Person("Alice", 30));
✔ Spring과 무관하게 동작 가능하므로, 자동 설정이 필요하지 않음
🎯 6. Summary
✅ SpringFactoriesLoader는 Spring Boot에서 자동 구성을 지원하는 핵심 클래스
✅ Spring Boot는 spring.factories
파일을 통해 자동 구성 클래스를 로드하고 실행
✅ 일반적인 유틸리티 라이브러리나 독립적인 라이브러리는 spring.factories
가 필요 없음
✅ 스프링 부트가 자동 구성을 수행하는 방식을 깊이 이해하려면 SpringFactoriesLoader
를 분석해야 함
🔥 이제 spring.factories
를 활용하여 더욱 강력한 스프링 애플리케이션을 개발할 수 있습니다! 🚀
'Spring Boot > Spring Boot Auto Configuration' 카테고리의 다른 글
DeferredImportSelector (0) | 2024.10.17 |
---|---|
spring-boot-autoconfigure.jar (0) | 2024.10.16 |
Project Classpath (0) | 2024.10.16 |
@AutoConfigurationPackage (0) | 2024.10.16 |
@EnableAutoConfiguration (0) | 2024.10.16 |