@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 |