1. 빈 후처리기(Bean Post Processor) 소개
- 스프링은 빈을 생성하고 의존관계를 주입한 후에, 최종적으로 빈 객체를 조작할 수 있는 기회를 제공합니다.
- 빈 후처리기(Bean Post Processor)는 이름 그대로 빈을 생성한 후에 무언가를 처리하는 용도로 사용됩니다.
- 빈 후처리기를 사용하면 스프링이 관리하는 빈을 중간에 조작하거나, 다른 객체로 바꿔치기할 수 있습니다.
1.1 스프링 빈 생명주기와 후처리기의 위치
-
스프링 빈 생명주기의 흐름
- 빈 생성: 스프링 컨테이너가 빈을 생성합니다. (예:
@Bean
어노테이션, 컴포넌트 스캔 등) - 의존 관계 주입: 필요한 의존 관계를 주입합니다.
- 초기화 콜백: 빈이 생성되고 의존관계 주입이 완료된 후 호출됩니다.
- 사용: 빈을 실제로 사용합니다.
- 소멸 전 콜백: 빈이 소멸되기 직전에 호출됩니다.
- 소멸: 스프링 컨테이너에서 빈을 제거합니다.
- 빈 생성: 스프링 컨테이너가 빈을 생성합니다. (예:
-
빈 후처리기는 초기화 콜백 전후에 위치하며, 이 시점에 빈 객체를 조작하거나 다른 객체로 바꿔치기할 수 있습니다.
2. 빈 후처리기의 동작 원리
2.1 BeanPostProcessor 인터페이스
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
- 빈 후처리기를 구현하려면
BeanPostProcessor
인터페이스를 구현해야 합니다.postProcessBeforeInitialization
: 빈 객체의 초기화 메서드(@PostConstruct
등) 호출 전에 실행됩니다.postProcessAfterInitialization
: 빈 객체의 초기화 메서드 호출 후에 실행됩니다.
2.2 빈 후처리기 기본 예제
다음은 빈 후처리기의 기본적인 동작을 보여주는 예제입니다.
@Slf4j
static class AToBPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
log.info("beanName={} bean={}", beanName, bean);
if (bean instanceof A) {
return new B();
}
return bean;
}
}
- 이 후처리기는 매우 단순합니다: 타입이
A
인 빈이 있으면B
타입의 새로운 객체를 생성해서 반환합니다. - 즉, A 타입의 빈을 B 타입의 빈으로 교체하는 것입니다.
2.3 빈 후처리기 등록 방법
빈 후처리기를 사용하려면 스프링 빈으로 등록해야 합니다.
@Configuration
static class BeanPostProcessorConfig {
@Bean(name = "beanA")
public A a() {
return new A();
}
@Bean
public AToBPostProcessor helloPostProcessor() {
return new AToBPostProcessor();
}
}
- 이렇게 등록하면 스프링은 등록된 빈 후처리기를 찾아서 빈 생성 과정에 적용합니다.