Back-End/Spring Advance & Boot

스프링 고급편 - @Aspect AOP

Meluu_ 2024. 10. 2. 16:50

✔️ @Aspect 프록시


스프링은 @Aspect 애노테이션으로 매우 편리하게 포인트 컷과 어드바이스로 구성되어있는 어드바이저 생성 기능 지원

 

 

참고

@Aspect 는 관점 지향 프로그래밍(AOP)을 가능하게 하는 AspectJ 프로젝트에서 제공하는 애노테이션이다. 

 

 

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

        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(..) : 포인트컷 표현식 (AspectJ 표현식)을 넣는다.  (포인트컷)

  • 이 애노테이션이 붙으면 이 메서드는 어드바이스가 된다. 

ProceedingJoinPoint joinPoint : MethodInvocation invocation 과 유사한 기능

jointPoint.proceed() : 실제 호출 대상(target) 호출

 

 

config로 의존관계 주입시 Aspect도 스프링 빈으로 등록해줘야한다. (아니면 @Componenet)

 

 

 

 

설명

자동 프록시 생성기는 Advisor를 자동으로 찾아와서 필요한 곳에 프록시를 생성하고 적용해준다.

자동 프록시 생성기는 추가로 @Aspect 를 찾아서 이것을 Advisor를 만들어 주는 역할을 한다.

 

그림만으로 이해가 잘 간다..

 

 

 

정리

지금까지 우리가 진행한 애플리케이션 전반에로그를 남기는 기능은 특정 기능 하나에 관심이 있는 기능이 아닌, 애플리케이션의 여러 기능들 사이에 걸쳐서 들어가는 관심사이다. 이를 횡단 관심사(cross-cutting concerns)라고 한다. 

이를 기반으로 횡단 관심사를 전문으로 해결하는 스프링 AOP에 대해 본격적으로 학습한다.

 

🔖 학습내용 출처


스프링 핵심 원리 - 고급편 / 김영한