Spring/Spring Core Advanced

@Aspect AOP

민철킹 2022. 1. 25. 18:34

Spring@Aspect 애노테이션을 사용하면 이것이 Advisor 생성 기능을 지원한다.

@AspectAspectJ에서 제공하는 애노테이션으로 스프링은 이를 사용해 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로 변환하여 저장하는 기능도 수행한다.

 

 

다시 말해

  1. @Aspect를 보고 Advisor로 변환해 저장한다.
  2. 저장된 Advisor를 기반으로 프록시를 생성한다.

 

 

@Aspect를 보고 Advisor를 생성하는 것은 Advisor Builder가 담당하는데 내부 구현을 뜯어보니 아래 메서드에서 이 로직을 수행하고 있는 듯 하다.

코드가 너무 길어서 일부분만 가져왔다.

 

반환 값을 확인해보면 List<Advisor>인 것을 확인할 수 있는데, 이렇게 생성된 AdvisorList에 담아 반환하고 내부에 저장하는 구조이다.

 

 

추가로, 내부 저장소에 생성된 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