Spring
에 @Aspect
애노테이션을 사용하면 이것이 Advisor
생성 기능을 지원한다.
@Aspect
는AspectJ
에서 제공하는 애노테이션으로 스프링은 이를 사용해AOP
를 가능케한다.
코드로 살펴보자
@Aspect
: 프록시를 적용하기 위한 애노테이션@Around
:Pointcut
을 위한 애노테이션, 인자로AspectJ
표현식을 넣는다.@Around
가 붙은 메서드가 바로Advice
이다.(여기서는 execute)
ProceedingJoinPoint
:MethodInvocation
과 유사하다. 내부에 실제 호출 대상(target), 전달 인자, 어떤 객체와 어떤 메서드가 호출되었는지에 대한 정보가 포함되어 있다.proceed()
: target 호출
이렇게 만들어진 프록시를 스프링 빈으로 등록하면 바로 사용할 수 있게 된다.
내부적으로 어떻게 동작하는 것일까?
org.springframework.boot:spring-boot-starter-aop
이 라이브러리를 통해 AnnotationAwareAspectJAutoProxyCreator
라는 자동 프록시 생성 빈 후처리기가 등록된다고 했었다.
이는 Spring Bean
으로 등록된 Advisor
뿐만 아니라 @Aspect
애노테이션을 찾아 Advisor
로 변환하여 저장하는 기능도 수행한다.
다시 말해
@Aspect
를 보고Advisor
로 변환해 저장한다.- 저장된
Advisor
를 기반으로 프록시를 생성한다.
@Aspect
를 보고 Advisor
를 생성하는 것은 Advisor Builder
가 담당하는데 내부 구현을 뜯어보니 아래 메서드에서 이 로직을 수행하고 있는 듯 하다.
반환 값을 확인해보면 List<Advisor>
인 것을 확인할 수 있는데, 이렇게 생성된 Advisor
를 List
에 담아 반환하고 내부에 저장하는 구조이다.
추가로, 내부 저장소에 생성된 Advisor
를 캐시하는데 만약 이미 만들어져있는 Advisor
라면 캐시에 있는 Advisor
를 반환한다.
이렇게 만들어진 Advisor
를 통해 동일하게 Pointcut
으로 적용 대상을 판별해 그 유무에 따라 원본 객체나 프록시를 Spring Bean
으로 등록한다!
'Spring > Spring Core Advanced' 카테고리의 다른 글
Spring AOP (2) | 2022.01.25 |
---|---|
빈 후처리기 (3) | 2022.01.15 |
Spring의 프록시 기술 (0) | 2021.12.16 |
동적 프록시 기술 (0) | 2021.11.18 |
프록시 패턴과 데코레이터 패턴 (0) | 2021.11.08 |