본문 바로가기

개발

Spring 빈 후처리기(BeanPostProcessor)?

반응형

이번 글에서는 빈 후처리기(BeanPostProcessor)가 빈 생명주기 사이에서 어떤 역할을 수행하는지, 그리고 스프링 AOP의 핵심 기능인 자동 프록시 생성기가 어떻게 동작하는지를 정리해 보려 합니다.

 

 


 

빈 후처리기(BeanPostProcessor)?

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

 

1. 일반적인 스프링 빈 등록 과정

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

그리고 그 이후에 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다.

 

 

2. 빈 후처리기 과정

과정 - 1

일반적인 빈 등록 과정에서 스프링 빈 저장소에 등록하기 전 단계에 빈 후처리기 과정이 추가된것을 볼 수 있다.

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

과정 - 2

"빈 후처리기 과정 - 1 3번 단계"에서 전달된 "A 객체"를 B객체로 바꿔 "B 객체"로반환할 경우, 스프링 빈 저장소엔 "beanA"이름을 가진 빈 객체 "B 객체"로 저장 할 수 있다.


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

AnnotationAwareAspectJAutoProxyCreator

build.gradle에 아래 라이브 러리 추가

implementation 'org.springframework.boot:spring-boot-starter-aop'

이 라이브러리를 추가하면 aspectjweaver 라는 aspectJ 관련 라이브러리를 등록하고, 스프링 부트가 AOP 관련 클래스를 자동으로 스프링 빈에 등록한다. 스프링 부트가 없던 시절에는 @EnableAspectJAutoProxy 를 직접 사용해야 했는데, 이 부분을 스프링 부트가 자동으로 처리해준다.

(라이브러리 폴더에 추가된걸 확인할 수 있다)

 

스프링 부트 자동 설정으로 AnnotationAwareAspectJAutoProxyCreator 라는 빈 후처리기가 자동으로 등록 되고, 이 빈 후처리기는 스프링 빈으로 등록된 Advisor 들을 찾아 프록시가 필요한 곳에 자동으로 프록시를 적용해준다.

Advisor안에는 Pointcut, Advice 가 이미 모두 포함되어 있기에 Advisor 만 알고 있으면 그 안에 있는 Pointcut 을 통해 스프링 빈에 프록시를 적용해야 할 지 알 수 있다.

 

AnnotationAwareAspectJAutoProxyCreatorBeanPostProcessor 를 구현하여 Spring AOP의 핵심인 "자동 프록시 생성" 기능을 제공하는 구체적인 구현체 입니다.

참고
AnnotationAwareAspectJAutoProxyCreator 는 @AspectJ와 관련된 AOP 기능도 자동으로 찾아 처리해준다.
Advisor 는 물론이고, @Aspect 도 자동으로 인식해 프록시를 만들고 AOP를 적용해준다 

 


자동 프록시 생성기 과정

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

하나의 프록시, 여러 Advisor 적용

스프링 빈이 advisor1, advisor2가 제공하는 포인트컷의 조건을 모두 만족하면 프록시 자동생성기는 프록시를 몇 개 생성할까?

-> 정답은 1개이다.

프록시 팩토리가 생성하는 프록시는 내부에 여러 advisor 들을 포함할 수 있다.

 

프록시 자동 생성기 상황별 정리

  • advisor1의 포인트컷만 만족 -> 프록시 1개 생성, 프록시에 advisor1 만 포함
  • advisor1, advisor2의 포인트컷을 모두 만족 -> 프록시1개 생성, 프록시에 advisor1, advisor2 모두 포함
  • advisor1, advisor2의 포인트컷을 모두 만족하지 않음 -> 프록시가 생성되지 않음

 

 

 

 

 

📌 정리

Spring을 공부하면 할수록 정말 자동으로 해주는게 많다는걸 새삼 한번더 느꼇고. 내부 동작 원리를 하나씩 들여다볼수록 "아 이런식으로 동작하고 있었구나" 하는 깨달음? 이 생기고 그게 참 재밌는거 같다.
또, 공부할수록 내가 모르는게 더 많아진다는 느낌도 함께 든다.
한가지를 이해하면 그 뒤에 이어지는 새로운 개념들이 꼬리를 물고 나타나고, 끝이 없는 것처럼 느껴지기도 한다.
하지만 그 과정 자체가 재밌고, 지금보다 더 깊이 이해하고 싶다는 생각이 들었다.

 

 

[참고 자료]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B3%A0%EA%B8%89%ED%8E%B8

반응형