static @Bean 팩토리 메서드란

2025. 5. 19. 20:56Spring Framework/Spring IoC

Spring의 자바 기반 구성 메타데이터(Java-based configuration metadata)에서 @Bean 어노테이션이 붙은 팩토리 메서드(factory method)static으로 선언된다는 것은, Spring이 그 메서드를 실행할 때 해당 구성 클래스(@Configuration)를 인스턴스화하지 않고도 호출할 수 있다는 의미입니다.

 

📌 핵심 정리: static @Bean 팩토리 메서드란?

@Configuration
public class AppConfig {

    @Bean
    public static MyService myService() {
        return new MyService(); // static 팩토리 메서드
    }
}
  • 이처럼 @Bean 메서드에 static을 붙이면, Spring은 AppConfig 클래스의 인스턴스를 생성하지 않고도 myService() 메서드를 호출할 수 있습니다.
  • 즉, 팩토리 메서드를 클래스 수준에서 정적으로 실행할 수 있습니다.

 

🧠 어떤 의미가 있는가?

✅ 1. Spring이 AppConfig 인스턴스를 만들지 않아도 @Bean을 등록 가능

  • 일반적인 @Bean 메서드는 다음과 같은 방식으로 동작합니다:
@Bean
public MyService myService() {
    return new MyService(); // 이 메서드를 호출하려면 AppConfig 인스턴스가 필요
}
  • 반면 static 메서드는 클래스 인스턴스 없이도 호출 가능하므로, 등록 시점이 더 이릅니다.

 

✅ 2. ApplicationContext 초기화 시점에서 사용 가능

  • @Beanstatic이면, Spring은 @Configuration 클래스의 빈이 완전히 등록되기 전에도 해당 메서드를 호출할 수 있습니다.
  • 예를 들어, 다음과 같은 경우에 유용합니다:
    • BeanDefinitionRegistryPostProcessor, EnvironmentPostProcessor, PropertySourcesPlaceholderConfigurer초기 부트스트랩 빈 등록
    • 순환 참조 방지 목적

 

✅ 3. 스프링 내부 동작 측면

Spring은 @Configuration 클래스의 메서드에서 @Bean을 발견하면 ConfigurationClassBeanDefinitionReader가 해당 메서드를 분석하여 RootBeanDefinition을 생성합니다.

  • 만약 @Bean 메서드가 static이면:
    • RootBeanDefinition#setBeanClass(configClass)
    • factoryMethodstatic이므로 factoryBeanName은 필요 없음
  • 반면 non-static이면:
    • factoryBeanName으로 구성 클래스의 빈 ID를 설정해야 함
if (isStaticMethod(methodMetadata)) {
    beanDef.setBeanClass(Class.forName(configClass.getClassName()));
    beanDef.setFactoryMethodName(methodMetadata.getMethodName());
} else {
    beanDef.setFactoryBeanName(configClass.getBeanName());
    beanDef.setFactoryMethodName(methodMetadata.getMethodName());
}

 

📋 차이 정리: static vs non-static @Bean 메서드

항목 static @Bean non-static @Bean
호출 방법 클래스명.메서드() 구성 클래스 인스턴스.메서드()
구성 클래스 인스턴스 필요 ❌ 없음 ✅ 필요
초기화 순서 더 빠름 느림 (구성 클래스 빈 등록 이후)
대표 사용처 BeanFactoryPostProcessor, PropertySourcesPlaceholderConfigurer 등 초기 등록용 일반적인 의존성 주입용 빈

 

✅ 실용 예시: PropertySourcesPlaceholderConfigurer

@Configuration
public class AppConfig {

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}
  • 이 구성 요소는 @Value("${...}") 같은 표현식이 작동하게 해주는 역할을 하며, 매우 초기에 등록되어야 하므로 static으로 선언해야 합니다.

 

🔚 결론

  • @Bean 어노테이션이 붙은 팩토리 메서드를 static으로 선언하면 스프링이 구성 클래스 인스턴스를 만들지 않고도 해당 메서드를 호출할 수 있습니다.
  • 이는 등록 시점이 앞당겨져야 하는 빈, 또는 구성 클래스 간의 순환 참조를 피하고자 할 때 매우 유용합니다.
  • 일반적인 빈은 non-static으로 선언해도 되지만, 초기화 순서가 중요한 구성 요소static을 적극 활용해야 합니다.

'Spring Framework > Spring IoC' 카테고리의 다른 글

GenericBeanDefinition  (1) 2025.05.19
RootBeanDefinition  (0) 2025.05.19
DefaultListableBeanFactory의 확장성이란?  (0) 2025.03.06
BeanPostProcessor / BeanFactoryPostProcessor  (0) 2025.03.06
@Order  (0) 2025.01.26