DefaultListableBeanFactory의 확장성이란?

2025. 3. 6. 21:04Spring Framework/Spring IoC

DefaultListableBeanFactory의 확장성과 BeanPostProcessor/BeanFactoryPostProcessor의 관계를 설명해 드리겠습니다.

📌 1️⃣ DefaultListableBeanFactory의 확장성이란?

DefaultListableBeanFactory스프링의 핵심 Bean Factory로, 빈을 생성, 관리, 검색, 조작할 수 있는 다양한 기능을 제공합니다.
확장성이 뛰어나다는 의미는 단순히 정적인 빈 관리가 아니라, 실행 중 동적으로 빈을 조작할 수 있는 다양한 확장 포인트를 제공한다는 뜻입니다.
✔ 대표적인 확장 포인트가 바로 BeanPostProcessorBeanFactoryPostProcessor 입니다.

📌 즉, DefaultListableBeanFactory의 확장성을 논할 때 BeanPostProcessor 및 BeanFactoryPostProcessor를 함께 설명하는 이유는
DefaultListableBeanFactory 내부에서 이들을 활용하여 빈의 생성 및 설정을 동적으로 변경할 수 있도록 지원하기 때문입니다.

📌 2️⃣ BeanPostProcessor와 BeanFactoryPostProcessor는 확장 포인트다

BeanPostProcessorBeanFactoryPostProcessor스프링 컨테이너가 빈을 생성하고 관리하는 과정에서 개입할 수 있도록 지원하는 확장 포인트입니다.
DefaultListableBeanFactory는 이를 자동으로 인식하고 빈의 라이프사이클에 추가적인 동작을 적용할 수 있도록 합니다.

📌 즉, DefaultListableBeanFactory는 이 확장 포인트를 활용하여, 개발자가 빈을 더 유연하게 조작할 수 있도록 해줍니다.
스프링이 내부적으로 트랜잭션, AOP, @Autowired 주입 등의 기능을 제공할 수 있는 이유도 이 확장 포인트 덕분입니다.

📌 3️⃣ DefaultListableBeanFactory와 BeanPostProcessor / BeanFactoryPostProcessor의 관계

✔ DefaultListableBeanFactory 내부에서의 BeanPostProcessor

  • DefaultListableBeanFactory빈이 초기화될 때 자동으로 BeanPostProcessor들을 실행합니다.
  • 즉, DefaultListableBeanFactory가 빈을 생성하고 나면, BeanPostProcessor가 빈을 가로채서 후처리를 수행합니다.

📌 예제:  BeanPostProcessor를 자동으로 인식하여 실행

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        System.out.println("🚀 빈 초기화 전 (Before Init): " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        System.out.println("✅ 빈 초기화 후 (After Init): " + beanName);
        return bean;
    }
}

DefaultListableBeanFactoryBeanPostProcessor를 자동으로 감지하고 빈의 초기화 과정에서 실행합니다.
✔ 즉, 개별 빈의 초기화 로직을 동적으로 변경할 수 있도록 하는 확장 기능을 제공하는 것입니다.

✔ DefaultListableBeanFactory 내부에서의 BeanFactoryPostProcessor

  • DefaultListableBeanFactory빈을 생성하기 전에 BeanFactoryPostProcessor를 실행하여 빈 정의(BeanDefinition)를 수정할 수 있도록 허용합니다.
  • 즉, 빈 인스턴스를 만들기 전에 BeanDefinition을 조작할 수 있습니다.

📌 예제: BeanFactoryPostProcessor를 통해 BeanDefinition 수정

@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("🛠 BeanFactoryPostProcessor 실행 중...");

        // 특정 빈의 BeanDefinition 수정
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("myService");
        beanDefinition.setScope(BeanDefinition.SCOPE_PROTOTYPE); // 싱글톤 → 프로토타입 변경
    }
}

DefaultListableBeanFactoryBeanFactoryPostProcessor를 실행하여 빈 생성 전에 빈 정의를 수정할 수 있도록 허용합니다.
✔ 즉, 개별 빈이 아닌 빈 팩토리 자체를 확장할 수 있도록 하는 기능을 제공하는 것입니다.

📌 4️⃣ 결론 (DefaultListableBeanFactory의 확장성과 BeanPostProcessor / BeanFactoryPostProcessor 관계 정리)

개념 설명 DefaultListableBeanFactory와의 관계
DefaultListableBeanFactory 스프링 컨테이너의 핵심 빈 팩토리 다양한 확장 포인트를 제공하여 동적 빈 조작 가능
BeanPostProcessor 빈 초기화 전후 후처리 수행 DefaultListableBeanFactory가 자동 감지하여 빈 초기화 시 실행
BeanFactoryPostProcessor 빈 정의(BeanDefinition) 수정 DefaultListableBeanFactory가 빈 생성 전 실행하여 빈 정의 조작 가능

즉, DefaultListableBeanFactory의 확장성을 논할 때, BeanPostProcessor와 BeanFactoryPostProcessor를 함께 설명하는 이유는
👉 DefaultListableBeanFactory가 이 확장 포인트를 활용하여 빈의 생성 및 설정을 동적으로 변경할 수 있도록 지원하기 때문입니다.

📌 결론:
DefaultListableBeanFactory는 빈을 정적인 객체로 관리하는 것이 아니라, 동적으로 수정 및 조작할 수 있도록 하는 강력한 확장성을 제공
BeanPostProcessor개별 빈의 초기화 과정에서 개입할 수 있는 확장 포인트
BeanFactoryPostProcessor빈이 생성되기 전에 BeanDefinition을 수정할 수 있는 확장 포인트
✔ 이 둘을 활용하면 스프링 컨테이너 내부의 동작을 커스텀할 수 있으며, 스프링이 제공하는 다양한 기능(AOP, 트랜잭션, @Autowired 등)도 이를 활용하여 동작

 

🚀 즉, DefaultListableBeanFactory가 확장성이 뛰어나다는 것은, 단순히 빈을 관리하는 것이 아니라, 빈의 정의를 동적으로 수정하고 후처리를 할 수 있도록 지원하는 여러 확장 포인트를 제공하기 때문입니다!

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

BeanPostProcessor / BeanFactoryPostProcessor  (0) 2025.03.06
@Order  (0) 2025.01.26
엔터프라이즈 관련 기능  (1) 2025.01.16
Service Locator Pattern  (1) 2025.01.16
Spring IoC  (0) 2024.11.15