spring.factories

2024. 10. 16. 17:04Spring Boot/Spring Boot Auto Configuration

🚀 Spring Boot의 spring.factories 완벽 분석 🔍

🎯 목표:

  • spring.factories 파일이 무엇이며, Spring Boot에서 어떤 역할을 하는지 심층적으로 이해
  • Spring Boot의 자동 구성(Auto Configuration)과의 관계 분석
  • SpringFactoriesLoader의 내부 동작 원리
  • 실제 프로젝트에서 spring.factories를 활용하는 고급 기법 학습
  • 최적화 및 운영 시 고려 사항

🏗️ 1. spring.factories란?

🔹 개념 정의

spring.factoriesSpring 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.factoriesSpring 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