@Aspect AOP
@Aspect 프록시 - 적용
이전 챕터에서 Advisor를 직접 구현하여 스프링 빈으로 등록하면 스프링의 자동 프록시 생성기가 자동으로 처리해주는 것을 배웠다.
스프링은 @Aspect
애노테이션으로 매우 편리하게 포인트컷과 어드바이스로 구성되어 있는 어드바이저 생성 기능을 지원한다.
지금까지 어드바이저를 직접 만들었던 부분을 @Aspect
애노테이션을 사용해서 만들어보자.
(@Aspect
는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 스프링은 이것을 차용해서 프록시를 통한 AOP를 가능하게 한다고 한다.)
@Slf4j
@Aspect
public class LogTraceAspect {
private final LogTrace logTrace;
public LogTraceAspect(LogTrace logTrace) {
this.logTrace = logTrace;
}
@Around("execution(* hello.proxy.app..*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
TraceStatus status = null;
// log.info("target={}", joinPoint.getTarget()); //실제 호출 대상
// log.info("getArgs={}", joinPoint.getArgs()); //전달인자
// log.info("getSignature={}", joinPoint.getSignature()); //join point 시그니처
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("execution(* hello.proxy.app..*(..))")
@Around
의 값에 포인트컷 표현식을 넣는다. 표현식은 AspectJ 표현식을 사용한다.@Around
의 메서드는 어드바이스(Advice)가 된다.- 즉,
@Around
의 value와@Around
가 붙어 있는 메서드를 통해 Advice를 만들어낸다.
ProceedingJoinPoint joinPoint
: 어드바이스에서 살펴본MethodInvocation invocation
과 유사한 기능이다. 내부에 실제 호출 대상, 전달 인자, 그리고 어떤 객체와 어떤 메서드가 호출되었는지 정보가 포함되어 있다.joinPoint.proceed()
: 실제 호출 대상(target)을 호출한다.
@Configuration
@Import({AppV1Config.class, AppV2Config.class})
public class AopConfig {
@Bean
public LogTraceAspect logTraceAspect(LogTrace logTrace) {
return new LogTraceAspect(logTrace);
}
}
@Bean logTraceAspect()
:@Aspect
가 있어도 스프링 빈으로 등록을 해줘야 한다. 물론LogTraceAspect
에@Component
애노테이션을 붙여서 컴포넌트 스캔을 사용해서 스프링 빈으로 등록해도 된다.
@Aspect 프록시 설명
스프링에서 사용하는 자동 프록시 생성기의 이름은 AnnotationAwareAspectJAutoProxyCreator
이다. 이전 챕터에서 AutoProxyCreater와 AspectJ까지는 알아봤다.
위에서 우리는 @Aspect
와 @Around
정보를 통해 Advisor로 만들어주는 것을 배웠다. 애노테이션을 인식한다는 의미에서 AnnotationAware 이 부분이 붙은 것이다.
정리히자면, 자동 프록시 생성기는 2가지 일을 한다.
@Aspect
를 보고 어드바이저(Advisor)로 변환해서 저장한다.- 어드바이저를 기반으로 프록시를 생성한다.
@Aspect 어드바이저 빌더BeanFactoryAspectJAdvisorsBuilder
클래스이다. @Aspect
의 정보를 기반으로 포인트컷, 어드바이스, 어드바이저를 생성하고 내부 저장소에 보관하는 것을 담당한다. (캐싱한다). 캐시에 어드바이저가 이미 만들어져있으면 해당 어드바이저를 반환한다.
“@Aspect
스프링 빈 객체를 Advisor
로 만들어 자신만의 내부 저장소 저장한다”
- 3-1. Advisor 빈 조회: 스프링 컨테이너에서
Advisor
빈을 모두 조회한다. - 3-2. @Aspect Advisor 조회:
@Aspect
어드바이저 빌더 내부에 저장된Advisor
를 모두 조회한다.
정리
지금까지 우리가 진행한 애플리케이션 전반에 로그를 남기는 기능은 특정 기능 하나에 관심이 있는 기능이 아니다. 애플리케이션의 여러 기능들 사이에 걸쳐서 들어가는 관심사이다. 이것을 바로 횡단 관심사(cross-cutting concerns)라고 한다.
스프링 AOP는 이런 횡단 관심사 문제를 해결해준다. (다음 챕터부터 자세히 다룸)
'Spring > AOP' 카테고리의 다른 글
[Spring AOP] 스프링 AOP 구현 (0) | 2025.07.06 |
---|---|
[Spring AOP] 스프링 AOP 개념 (0) | 2025.07.06 |
[Spring AOP] 빈 후처리기 (0) | 2025.07.06 |
[Spring AOP] 스프링이 지원하는 프록시 (0) | 2025.07.06 |
[Spring AOP] 동적 프록시 기술 (0) | 2025.07.06 |