본문으로 건너뛰기
Advertisement

8.2 핵심 용어와 @Around 로깅 실전

1. AOP 핵심 용어 정리

AOP를 자유자재로 다루기 위해서는 아래 5가지 용어를 완벽히 숙지해야 합니다.

  • Aspect (관점): 흩어진 공통 관심사(로깅, 보안, 트랜잭션 등)를 모아놓은 메인 모듈입니다. (Advice + Pointcut)
  • Advice (조언): 실제로 어떤 공통 로직을 실행할 것인지 정의한 코드 덩어리입니다. (@Around, @Before 등 작동 시점 정의)
  • JoinPoint (조인 포인트): Advice가 침투하여 적용될 수 있는 애플리케이션 실행의 "합류 가능 지점" 스펙 전체입니다. (단, 스프링 AOP는 기술적 한계로 '메서드 실행' 지점만 지원합니다.)
  • Pointcut (포인트컷): 무수히 많은 JoinPoint 중에서, 실제로 이번 Advice를 적용할 타겟 지점을 필터링해내는 파싱 표현식입니다.
  • Target (타겟): Advice가 실제로 적용되는 파급 대상, 즉 핵심 비즈니스 로직을 담은 원본 객체입니다.

2. @Around를 이용한 실전 수행시간 로깅

실제 실무에서 가장 많이 쓰이는 AOP는 특정 핵심 패키지 하위 클래스들의 메서드 실행 처리 시간을 일괄 측정하는 성능 로깅입니다.

@Slf4j
@Aspect
@Component
public class PerformanceLoggingAspect {

// com.example.service 패키지 하위의 모든 메서드를 Pointcut으로 지정
@Around("execution(* com.example.service..*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();

// 1. 핵심 비즈니스 로직 실행 (Target 프록시 메서드 위임 호출)
Object result = joinPoint.proceed();

// 2. 실행 완료 후 로깅
long endTime = System.currentTimeMillis();
long executionTime = endTime - startTime;

log.info("[{}] 실행 시간: {}ms", joinPoint.getSignature().toShortString(), executionTime);

return result; // 반드시 원본 결과값을 반환해야 안전하게 진행됩니다.
}
}
  • ProceedingJoinPoint: 반드시 @Around 스코프 내에서만 매개변수로 쓰이며, 프록시를 뚫고 원본 타겟 메서드를 명시적으로 구동시키는 proceed() 특수 제어 메서드를 제공합니다.
Advertisement