Spring ‐ 빈 후처리기 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 빈 후처리기

스크린샷 2025-02-09 오전 1 25 50

  • @Bean 어노테이션을 명시해주거나 컴포넌트 스캔으로 스프링 빈을 등록하게 되면 스프링은 대상 객체를 생성하고 스프링 컨테이너의 빈으로 등록한다. 이 때, @Bean의 경우 빈 이름은 메서드 이름이 되고, 컴포넌트 스캔의 경우 클래스 이름의 첫 글자를 소문자로 바꾼 이름이 된다. 빈 객체는 생성된 객체이다.
  • 스프링 컨테이너의 빈으로 등록하기 직전에 조작을 하고 싶다면 빈 후처리기를 사용하면 된다.

스크린샷 2025-02-09 오전 1 29 36

  • 생성 : 스프링 빈 대상이 되는 객체를 생성한다.
  • 전달 : 생성된 객체를 스프링 컨테이너의 빈으로 등록하기 전에 빈 후처리기에 전달한다.
  • 후처리 작업 : 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 다른 객체로 바꿔치기 할 수 있다.
  • 등록 : 후처리 작업 후 빈 후처리기는 빈을 반환한다. 전달된 빈을 그대로 반환하면 해당 빈이 등록되고 바꿔치기 하면 다른 객체가 빈으로 등록된다.

스크린샷 2025-02-09 오전 1 31 20

@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 타입의 스프링 빈이 존재하게 된다.
  • 빈 후처리기는 빈을 조작하고 변경할 수 있는 후킹 포인트이다.

📚 스프링이 제공하는 빈 후처리기

스크린샷 2025-02-09 오전 8 11 50

  1. 스프링이 스프링 빈 대상이 되는 객체를 생성한다.
  2. 생성된 객체를 스프링 컨테이너에 등록하기 전에 빈 후처리기에 전달한다.
  3. 빈 후처리기는 스프링 컨테이너에서 모든 Advisor를 조회한다.
  4. Advisor에는 Pointcut과 Advice가 포함되어 있다. 포인트컷을 사용해서 해당 객체가 프록시를 적용할 대상인지 아닌지 판단한다. 조건이 하나라도 만족하면 프록시 적용 대상이 된다.
  5. 프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록한다. 만약 프록시 적용 대상이 아니면 실제 객체를 반환해서 실제 객체를 스프링 빈으로 등록한다.
  6. 반환된 객체는 스프링 빈으로 등록된다.

[ 포인트 컷 ]

  • 프록시 적용 여부 판단
    • 자동 프록시 생성기는 포인트컷을 사용해서 해당 빈이 프록시를 생성할 필요가 있는지 없는지 체크한다.
    • 클래스 + 메서드 조건을 모두 비교한다. 이 때, 모든 메서드를 체크하는데 포인트컷 조건에 하나하나 매칭해본다.
    • 만약 조건에 맞는 것이 하나도 없으면 프록시를 생성하지 않는다.
  • 어드바이스 적용 여부 판단
    • 프록시가 호출되었을 때, 부가 기능인 어드바이스를 적용할지 말지 포인트컷을 보고 판단한다.
    • 포인트컷 조건에 만족한다면 어드바이스를 호출, 포인트컷 조건에 만족하지 않는다면 어드바이스를 호출하지 않는다.

하나의 스프링 빈이 여러 어드바이저의 포인트컷을 모두 만족한다면 프록시 자동 생성기는 어드바이저의 개수만큼 프록시를 생성하는 것이 아니라 하나만 생성하게 된다.