[review] 빈 후처리기

corncheese·2023년 11월 11일
0
  1. 일반적인 스프링 빈 등록

    @Bean 이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다.

빈 후처리기(BeanPostProcessor)

스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면, 빈 후처리기를 사용하면 된다.

빈 후처리기 과정

  1. 생성 : 스프링 빈 대상이 되는 객체를 생성한다.
  2. 전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달한다.
  3. 후 처리 작업 : 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나, 다른 객체로 바꿔치기 할 수 있다.
  4. 등록 : 빈 후처리기는 빈을 반환한다.
  • 빈 후처리기로 A객체를 B객체로 바꾸기

  • 빈 후처리기를 적용해서 실제 객체대신 프록시를 스프링빈으로 등록하기
    -> 수동으로 등록하는 빈 뿐만 아닌, 컴포넌트 스캔을 사용하는 빈까지 모두 프로시를 적용할 수 있다. 나아가 프록시 생성코드도 작성하지 않아도 된다.

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

- 이 라이브러리를 추가하면 aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고, 스프링부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다.

자동 프록시 생성기 - AutoProxyCreator

  • 스프링 부트 자동 설정으로 AnnotationAwareAspectAutoProxyCreator라는 빈 후처리기가 스프링빈에 자동으로 등록된다.
  • 이 빈 후처리기는 스프링 빈으로 등록된 Advisor들을 찾아서 프록시가 필요한 곳에 적용해준다.
  • AnnotationAwareAspectAutoProxyCreator는 @AspectJ와 관련된 AOP 기능도 찾아서 자동으로 처리한다.


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

!! 중요 : 포인트컷의 사용

  1. 프록시 적용 여부 판단 (생성 단계)
    자동 프록시 생성기는 포인터컷을 사용해서 해당 빈이 프록시를 생성할 필요가 있는지, 없는지 체크
    ex) orderControllerV1dms request(), nolog() 메서드가 있는데, request()가 프록시 생성 조건에 만족하므로 프록시를 생성

  2. 어드바이스가 적용 여부 판단 (사용 단계)
    프록시가 호출되었을 때 부가 기능인 어드바이스를 적용할지를 포인트컷으로 판단한다.
    ex) orderControllerV1 - request()는 포인트컷 조건에 만족하므로 프록시를 어드바이스를 먼저 호출하고, target을 호출한다.
    orderControllerV1 - noLog()는 포인트컷 조건에 만족하지 않으므로 어드바이스를 호출하지 않고 바로 target만 호출한다.

AspectJExpressionPointcut

AspectJ라는 AOP에 특화된 포인트컷 표현식을 적용할 수 있다.
포인트컷 표현식을 더욱 정밀하게 적용

0개의 댓글