백엔드/Spring

[Spring] 빈 후처리기 - BeanPostProcessor

kwang2134 2024. 11. 7. 16:36
728x90
반응형
728x90

BeanPostProcessor

  • 빈을 생성하고 의존성 주입이 끝난 후 빈의 초기화 메서드가 호출되기 전에 혹은 호출된 후에 추가적인 작업
  • 객체를 빈 저장소에 등록하기 전 조작이 필요할 때 사용
  • 컴포넌트 스캔을 사용하는 클래스를 프록시로 감싸 빈 등록 가능

구성 요소 (인터페이스)

  • BeanPostProcessor 인터페이스를 상속받아 구현

postProcessBeforeInitialization

  • 빈 초기화 전 호출되는 메서드
  • 빈을 수정하거나 필요한 전처리 가능
  • default로 정의되어 상속 후 구현하지 않아도 됨

postProcessAfterInitialization

  • 빈 초기화 후 호출되는 메서드
  • 빈 상태가 초기화 된 후 호출되어 후처리나 프록시 추가 가능
  • default로 정의되어 상속 후 구현하지 않아도 됨

초기화 후 빈을 프록시로 감싸 등록하는 예제

public class MyBeanPostProcessor implements BeanPostProcessor {

    private final Advisor advisor;  //Advisor를 외부에서 주입 받는다고 가정

    //생성자 주입
    public MyBeanPostProcessor(Advisor advisor) {
        this.advisor = advisor;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //프록시 적용 여부 검사 
        if (bean instanceof MyBean && beanName.startsWith("myBean")) {
            log.info("Creating proxy for={}", beanName);
            
            //ProxyFactory로 프록시 생성
            ProxyFactory proxyFactory = new ProxyFactory(bean);
            proxyFactory.addAdvisor(advisor);  // Advisor 추가

            // 프록시 객체 반환
            return proxyFactory.getProxy();
        }

        return bean;  //프록시 대상이 아닌 경우 원본 빈 반환
    }
}

스프링 빈 후처리기

  • 스프링에서 제공하는 빈 후처리기
  • 스프링 AOP 기술로 aspectjweaver 라이브러리를 통해 스프링 부트가 aop 관련 클래스를 자동으로 빈 등록

AutoProxyCreator - 자동 프록시 생성기

  • 스프링 부트 자동 설정으로 AnnotationAwareAspectJAutoProxyCreator 빈 후처리기가 스프링 빈에 자동 등록
  • 스프링 빈으로 등록된 Advisor들을 찾아 프록시가 필요한 곳에 자동으로 프록시 적용
  • 포인트 컷을 사용한 조건 검사
    • 포인트 컷 조건에 맞는 메서드가 존재한다면 프록시 적용
  • 조건에 맞는 Advisor가 여러 개라면 여러 개의 Advisor가 등록된 프록시 생성
    • 각 Advisor에 맞는 여러 개의 프록시가 생성되는 것이 아닌 1개의 프록시가 여러 개의 Advisor를 가짐

동작 과정

  1. 생성
    • 스프링이 스프링 빈 대상이 되는 객체를 생성
    • @Bean, 컴포넌트 스캔 모두 포함
  2. 전달
    • 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달
  3. 모든 Advisor 빈 조회
    • 빈 후처리기는 스프링 컨테이너에서 모든 Advisor를 조회
  4. 프록시 적용 대상 체크
    • 조회한 Advisor에 포함되어 있는 포인트컷을 사용해서 해당 객체가 프록시를 적용할 대상인지 아닌지 판단
    • 객체의 클래스 정보, 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭
    • 조건이 하나라도 만족하면 프록시 적용 대상
  5. 프록시 생성
    • 프록시 적용 대상이면 프록시를 생성하고 반환해서 프록시를 스프링 빈으로 등록
    • 적용 대상이 아니라면 원본 객체를 빈으로 등록
  6. 빈 등록
    • 반환된 객체 빈 등록

스프링 핵심 원리 - 고급편 강의 | 김영한 - 인프런 강의 내용 참고

728x90

'백엔드 > Spring' 카테고리의 다른 글

[Spring] Spring AOP - Pointcut  (2) 2024.11.10
[Spring] AOP - Aspect-Oriented Programming 개념  (0) 2024.11.08
[Spring] ProxyFactory  (1) 2024.11.06
[Spring] 동적 프록시  (0) 2024.11.05
[Spring] Proxy & Decorator Pattern  (0) 2024.11.02