static @Bean 팩토리 메서드란
2025. 5. 19. 20:56ㆍSpring 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 초기화 시점에서 사용 가능
@Bean
이static
이면, Spring은@Configuration
클래스의 빈이 완전히 등록되기 전에도 해당 메서드를 호출할 수 있습니다.- 예를 들어, 다음과 같은 경우에 유용합니다:
BeanDefinitionRegistryPostProcessor
,EnvironmentPostProcessor
,PropertySourcesPlaceholderConfigurer
등 초기 부트스트랩 빈 등록- 순환 참조 방지 목적
✅ 3. 스프링 내부 동작 측면
Spring은 @Configuration
클래스의 메서드에서 @Bean
을 발견하면 ConfigurationClassBeanDefinitionReader
가 해당 메서드를 분석하여 RootBeanDefinition
을 생성합니다.
- 만약
@Bean
메서드가static
이면:RootBeanDefinition#setBeanClass(configClass)
factoryMethod
는static
이므로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 |