개요
기존에 빈 후처리기에 대해서 알아봤으며 gradle 혹은 pom.xml에 'org.springframework.boot:spring-boot-starter-aop' 라이브러리를 추가하면 AnnotationAwareAspectJAutoProxyCreator라는 자동 프록시 생성기가 스프링 빈에 자동으로 등록이 된다는 것을 배웠습니다. (https://jaimemin.tistory.com/2028)
자동 프록시 생성기는 스프링 빈으로 등록된 Advisor들을 찾고, Pointcut에 매칭이 될 경우 자동으로 프록시를 적용해줍니다.
@Aspect 어노테이션은 편리하게 Advisor 생성 기능을 지원하는데 이번 게시글에서는 @Aspect에 대해서 간단히 알아보겠습니다.
1. @Aspect 프록시 예시
@Aspect는 AOP를 가능하게 하는 AspectJ 프로젝트에서 제공하는 어노테이션입니다.
따라서 기존 게시글에서 AspectJExpressionPointcut을 적용한 코드와 유사한 형태를 띱니다.
1.1 AspectJExpressionPointcut을 적용한 Config
1.2 @Aspect을 적용한 Config 및 Aspect
2. @Aspect 설명
개요에서도 말했듯이 자동 프록시 생성기는 Advisor를 찾아서 프록시를 생성하고 빈에 적용하는 역할을 수행합니다.
자동 프록시 생성기는 또 다른 역할이 있는데 바로 @Aspect 어노테이션을 찾아서 해당 클래스를 Advisor(Pointcut + Advice)로 만들어줍니다.
정리를 하자면 자동 프록시 생성기는 프록시를 생성하고 적용하는 역할 뿐만 아니라 @Aspect를 Advisor로 변환해서 저장하는 기능도 수행합니다.
2.1 @Aspect를 Advisor 변환하는 과정
- 스프링 애플리케이션 로딩 시점에 자동 프록시 생성기 호출
- 자동 프록시 생성기가 스프링 컨테이너 내 @Aspect 어노테이션 붙은 스프링 빈 모두 조회
- @Aspect 어드바이저 빌더를 통해 Advisor 생성
- 생성한 Advisor를 @Aspect 어드바이저 빌더 내부에 저장
* @Aspect 어드바이저 빌더는 BeanFactoryAspectJAdvisorsBuilder 클래스 (@Aspect의 정보를 기반으로 Pointcut, Advice, Advisor를 생성하고 보관하는 것을 담당)
2.2 자동 프록시 생성기의 작동 과정
- 스프링 빈 대상이 되는 객체 생성
- 생성된 객체를 빈 저장소에 등록하기 전 빈 후처리기에 전달
- 스프링 컨테이너 내 Advisor 빈 모두 조회
- @Aspect 어드바이저 빌더 내부에 저장된 Advisor 모두 조회
- 조회된 Advisor 내 Pointcut을 통해 프록시 적용 대상 확인
- 객체의 클래스 정보와 메서드를 Pointcut에 모두 매칭 한 뒤 조건이 하나라도 만족하면 프록시 적용 대상
- 프록시 적용 대상이라면 프록시 생성 후 프록시 반환
- 프록시 적용 대상이 아니라면 원본 객체를 반환 해 원본 객체를 스프링 빈에 등록
- 프록시 적용 대상이라면 원본 객체가 아닌 프록시를 스프링 빈으로 등록
참고
인프런 스프링 핵심 원리 - 고급편 (김영한 강사님)
'Spring' 카테고리의 다른 글
[SpringBoot] OpenSessionInView (0) | 2022.03.29 |
---|---|
[SpringBoot] AOP 간단 정리 (0) | 2022.01.12 |
[SpringBoot] 빈 후처리기 (BeanPostProcessor) 정리 (0) | 2021.12.21 |
[SpringBoot] ProxyFactory 정리 (feat. Advisor) (0) | 2021.12.16 |
[SpringBoot] ThreadLocal 간단 정리 (0) | 2021.11.13 |