-
[Spring] 스프링 핵심 원리 - @Aspect AOPStudy/Spring 2025. 4. 22. 23:33
@Aspect 프록시 - 적용
- 스프링은 @Aspect 어노테이션으로 Pointcut과 Advice로 구성되어 있는 Advisor 생성 기능을 지원함
예시)
더보기import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @Slf4j @Aspect public class LogTraceAspect { private final LogTrace logTrace; public LogTraceAspect(LogTrace logTrace) { this.logTrace = logTrace; } @Around("execution(* com.example.demo.proxy..*(..))") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { TraceStatus status = null; try { String message = joinPoint.getSignature().toShortString(); status = logTrace.begin(message); Object result = joinPoint.proceed(); logTrace.end(status); return result; } catch (Exception e) { logTrace.exception(status, e); throw e; } } }
- @Aspect : 어노테이션 기반 프록시를 적용할 때 필요함
- @Around(...)
- @Around의 값에 Pointcut 표현식을 넣음 (표현식은 AspectJ 표현식을 사용함)
- @Around의 메서드는 Advice가 됨
- ProceedingJoinPoint joinPoint : Advice에서 살펴본 `MethodInvocation methodInvocation`과 유사한 기능임
- 내부에 실제 호출 대상, 전달 인자, 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있음
- joinPoint.proceed() : 실제 호출 대상(target)을 호출함
- @Aspect가 있어도 스프링 빈으로 등록해줘야 함
@Aspect 프록시 - 설명
- 스프링의 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)는 2가지 역할을 수행함
- @Aspect를 보고 Advisor(Pointcut + Advice)로 변환해서 저장한다.
- Advisor를 기반으로 프록시를 생성한다.
1) @Aspect를 Advisor로 변환해서 저장하는 과정
- 실행 : 스프링 어플리케이션 로딩 시점에 자동 프록시 생성기를 호출한다.
- 모든 @Aspect 빈 조회 : 자동 프록시 생성기는 스프링 컨테이너에서 @Aspect 어노테이션이 붙은 스프링 빈을 모두 조회한다.
- Advisor 생성 : @Aspect Advisor Builder를 통해 @Aspect 어노테이션 정보를 기반으로 Advisor를 생성한다.
- @Aspect 기반 Advisor 저장 : 생성한 Advisor를 @Aspect Advisor Builder 내부에 저장한다.
추가) @Aspect Advisor Builder
더보기- BeanFactoryAspectJAdvisorsBuilder 클래스
- @Aspect의 정보를 기반으로 Pointcut, Advice, Advisor를 생성하고 보관하는 것을 담당함
- @Aspect의 정보를 기반으로 Advisor를 만들고, @Aspect Advisor Builder 내부 저장소에 캐시함
- 캐시에 Advisor가 이미 만들어져 있는 경우 캐시에 저장된 Advisor를 반환함
2) Advisor를 기반으로 프록시 생성
자동 프록시 생성기의 작동 과정
- 생성 : 스프링 빈 대상이 되는 객체를 생성함 (@Bean, 컴포넌트 스캔 모두 포함)
- 전달 : 생성된 객체를 빈 저장소에 등록하기 직전에 빈 후처리기에 전달함 (여기서는 스프링의 자동 프록시 생성기에 전달됨)
- Advisor 조회
- Advisor 빈 조회 : 스프링 컨테이너에서 Advisor 빈을 모두 조회함
- @Aspect Advisor 조회 : @Aspect Advisor Builder 내부에 저장된 Advisor를 모두 조회함
- 프록시 적용 대상 체크
- 3-1, 3-2에서 조회한 Advisor에 포함되어 있는 Pointcut을 사용해서 해당 객체가 프록시를 적용할 대상인지 판단함
- 이때 객체의 클래스 정보는 물론이고, 해당 객체의 모든 메서드를 Pointcut에 하나하나 모두 매칭해봄
- 조건이 하나라도 만족하면 프록시 적용 대상이 됨 (메서드 하나만 Pointcut 조건에 만족해도 프록시 적용 대상이 됨)
- 프록시 생성
- 프록시 적용 대상이면 프록시를 생성하고 프록시를 반환하고 해당 프록시를 스프링 빈으로 등록함
- 프록시 적용 대상이 아니라면 원본 객체를 반환해서 원본 객체를 스프링 빈으로 등록함
- 빈 등록 : 반환된 객체는 스프링 빈으로 등록됨
참고
'Study > Spring' 카테고리의 다른 글
[Spring] 스프링 핵심 원리 - 스프링 AOP 주의사항 (0) 2025.05.07 [Spring] 스프링 핵심 원리 - 스프링 AOP (0) 2025.04.23 [Spring] 스프링 핵심 원리 - 빈 후처리기 (0) 2025.04.21 [Spring] 스프링 핵심 원리 - 스프링이 지원하는 프록시 (0) 2025.04.20 [Spring] 스프링 핵심 원리 - 동적 프록시 (0) 2025.04.20