이번 글에서는 빈 후처리기(BeanPostProcessor)가 빈 생명주기 사이에서 어떤 역할을 수행하는지, 그리고 스프링 AOP의 핵심 기능인 자동 프록시 생성기가 어떻게 동작하는지를 정리해 보려 합니다.
빈 후처리기(BeanPostProcessor)?
스프링이 빈 저장소에 등록할 목적으로 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶을 경우, 빈 후처리기를 사용하면 된다.
1. 일반적인 스프링 빈 등록 과정

@Bean또는 컴포넌트 스캔으로 스프링빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록
그리고 그 이후에 스프링 컨테이너를 통해 등록한 스프링 빈을 조회해서 사용하면 된다.
2. 빈 후처리기 과정
과정 - 1

일반적인 빈 등록 과정에서 스프링 빈 저장소에 등록하기 전 단계에 빈 후처리기 과정이 추가된것을 볼 수 있다.
- 생성 : 스프링 빈 대상이 되는 객체를 생성
- 전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달
- 후 처리 작업 : 빈 후처리기는 전달된 스프링 빈 객체를 조작하거나 다른 객체로 바꿔치기 할 수 있다.
- 등록 : 스프링에서 전달된 빈을 빈 후처리기에서 그대로 반환하면 해당 빈이 등록되고, 바꿔치기 하면 다른 객체가 빈 저장소에 등록
과정 - 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 을 통해 스프링 빈에 프록시를 적용해야 할 지 알 수 있다.
AnnotationAwareAspectJAutoProxyCreator는 BeanPostProcessor 를 구현하여 Spring AOP의 핵심인 "자동 프록시 생성" 기능을 제공하는 구체적인 구현체 입니다.

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

- 생성 : 스프링이 스프링 빈 대상이 되는 객체 생성
- 전달 : 생성된 객체를 빈 저장소에 등록하기 직전 빈 후처리기에 전달
- 모든 Advisor 빈 조회 : 자동 프록시 생성기 - 빈 후처리기는 스프링 컨테이너에서 모든 Advisor 를 조회
- 프록시 적용 대상 체크 : 조회한 Advisor 에 포함된 포인트 컷을 사용해 해당 객체가 프록시 적용 대상인지 아닌지 판단. 이때 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 포인트컷에 하나하나 모두 매칭. 여러 매칭 조건중에 하나라도 만족 할 경우 프록시 적용 대상으로 판단
- 프록시 생성 : 프록시 적용 대상일 경우, 프록시를 생성해서 반환. 프록시 적용 대상이 아닐 경우 원본 객체 반환
- 빈 등록 : 반환된 객체를 스프링 빈으로 등록
하나의 프록시, 여러 Advisor 적용
스프링 빈이 advisor1, advisor2가 제공하는 포인트컷의 조건을 모두 만족하면 프록시 자동생성기는 프록시를 몇 개 생성할까?
-> 정답은 1개이다.
프록시 팩토리가 생성하는 프록시는 내부에 여러 advisor 들을 포함할 수 있다.
프록시 자동 생성기 상황별 정리
- advisor1의 포인트컷만 만족 -> 프록시 1개 생성, 프록시에 advisor1 만 포함
- advisor1, advisor2의 포인트컷을 모두 만족 -> 프록시1개 생성, 프록시에 advisor1, advisor2 모두 포함
- advisor1, advisor2의 포인트컷을 모두 만족하지 않음 -> 프록시가 생성되지 않음

📌 정리
Spring을 공부하면 할수록 정말 자동으로 해주는게 많다는걸 새삼 한번더 느꼇고. 내부 동작 원리를 하나씩 들여다볼수록 "아 이런식으로 동작하고 있었구나" 하는 깨달음? 이 생기고 그게 참 재밌는거 같다.
또, 공부할수록 내가 모르는게 더 많아진다는 느낌도 함께 든다.
한가지를 이해하면 그 뒤에 이어지는 새로운 개념들이 꼬리를 물고 나타나고, 끝이 없는 것처럼 느껴지기도 한다.
하지만 그 과정 자체가 재밌고, 지금보다 더 깊이 이해하고 싶다는 생각이 들었다.
'개발' 카테고리의 다른 글
| GitHub 오픈소스 기여, 처음부터 끝까지 해본 경험 (5) | 2025.07.01 |
|---|---|
| Spring AOP의 시작, ProxyFactory 이해하기 (2) | 2025.05.27 |
| JDK 동적 프록시, CGLIB (0) | 2025.05.26 |