ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 빈 후처리기 - BeanPostProcessor
    Spring 2022. 6. 19. 20:49

    @Bean 애너테이션 또는 컴포넌트 스캔을 활용하여 스프링 빈을 등록하면

    대상 객체를 생성 후 스프링 커테이너 내부 빈 저장소에 등록되고

    등록한 스프링 빈을 조회해서 사용하게 된다.

     

    빈 후처리기(BeanPostProcessor)

    위 설명대로 스프링 컨테이너에 객체를 저장할 때 이를 조작하고 싶다면

    빈 후처리기를 통해 빈 생성후 처리를 하면 된다.

     

    빈 후처리기를 통해 객체를 조작하거나 다른 객체로 변경할 수 있다.

     

    * 빈 등록 과정

    1. 스프링 빈 대상이 되는 객체를 생성한다. (@Bean, 컴포넌트 스캔)

    2. 생성된 객체를 빈 후처리기에 전달한다. (빈 저장소 등록 이전)

    3. 빈 후처리기에서 대상 객체를 조작 또는 변경한다.

    4. 빈 후처리기가 작업한 빈을 스프링 빈 저장소에 등록한다.

     

    * 빈 후처리기 사용 과정

    빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현 후 스프링 빈으로 등록한다.

    해당 인터페이스에는 2개의 메서드가 선언 되어 있는데 내용은 아래와 같다.

    - postProcessBeforeInitialization(Object bean, String beanName)

     : 객체 생성 이후 @PostConstruct 같은 초기화 발생되기 전 호출되는 포스트 프로세스

     

    - postProcessAfterInitialization(Object bean, String beanName)

    : 객체 생성 이후 @PostConstrruct 같은 초기화 이후 호출되는 포스트 프로세스

     

    * @PostConstruct 란?

    스프링 빈 생성 이후 빈을 초기화하는 역할로 해당 애너테이션이 붙은 초기화 메서드를

    한번 호출하는 것이다.

     

    스프링은 CommonAnnotationBeanPostProcessor 라는 빈 후처리기를 자동 등록하는데

    이때 위 애너테이션이 붙은 메서드를 호출한다.

    즉 스프링도 내부 기능 확장을 위해 빈 후처리기를 활용한다.

     

    * 빈 후처리기는 빈을 조작, 변경할 수 있는 후킹 포인트

    빈 후처리기는 빈 객체를 조작하거나 다른 객체로 바꾸어 버릴 수 있는데

    이때 조작은 해당 객체의 특정 메서드를 호출하는 것이다.

     

    컴포넌트 스캔의 대상이 되는 빈들을 중간 조작하는 방법으로 사용하며

    즉, 빈 객체를 프록시로 교체하는 것도 가능하다.

     

     

    * 빈 후처리기를 적용하여 스프링 빈 대신 프록시 등록하기

    1. 특정 프록시를 적용하기 위한 클래스에 BeanPostProcessor 인터페이스를 구현하도록 한다.

    2. 해당 클래스는 Advisor(Advice + Pointcut)와 패키지 이름을 주입받는다.

    (패키지 이름을 주입받는 이유는 해당 패키지 외에는 동작하지 않도록 하기 위함이다.)

    (비교는 매개변수로 받는 bean을 통해 해당 클래스의 패키지 이름을 반환 받을 수 있다.)

    (해당 과정이 없다면 스프링 부트가 기본으로 등록하는 많은 빈들이 후처리기를 통과한다.)

    (만약 동작시키려는 패키지가 아니라면 스프링 빈을 그대로 반환한다. - 주의!)

    3. 프록시 팩토리를 생성하여 Advisor를 추가한다.

    4. 프록시 팩토리를 통해 얻은 프록시를 리턴한다.

     

    - 위 과정을 통해 프록시를 생성하고 프록시를 스프링 빈으로 등록하면 빈 후처리기가 처리한다.

     

     

    빈 후처리기를 통해 해결할 수 있는 문제

    1. 설정 파일을 적용하는 클래스 수만큼 등록했던 문제 해결

    프록시 팩토리를 활용하여 인터페이스, 구체클래스 관계없이 편하게 프록시를 만들 수 있었지만

    이를 등록하기 위해서는 프록시 설정 코드를 수없이 많이 작성해야했다.

    하지만 빈 후처리기는 알아서 동작한다. (중복코드 제거)

     

    2. 컴포넌트 스캔으로 등록되는 빈에도 동작

    컴포넌트 스캔으로 스프링 빈을 등록하는 경우에는 등록되는 중간에 대상 객체를

    조작, 변경할 수 없었으나 빈 후처리기는 컨테이너에 등록되기 전에 호출 되어

    동작하기 때문에 이를 할 수 있게 되었다.

     

     

     

     

    [참고 : 인프런 - 스프링 핵심 원리 - 고급편]

Designed by Tistory.