[JAVA] Spring AOP에서 @Aspect와 @Around 어노테이션 제대로 활용하기

Spring에서 반복적인 코드(로깅, 트랜잭션, 보안 검사 등)를 공통으로 처리하고 싶을 때, AOP(Aspect Oriented Programming)는 매우 강력한 도구입니다. 특히 @Aspect@Around 어노테이션은 AOP의 핵심을 이루는 중요한 개념이죠. 

 

@Aspect란?

@Aspect는 해당 클래스가 AOP 기능을 제공하는 클래스임을 Spring에게 알려주는 어노테이션입니다. 쉽게 말하면 "이 클래스는 여러 지점(Pointcut)에 관여해서 공통 기능을 끼워넣을 거야!" 라는 선언입니다.

 

 

@Around 어노테이션의 역할

@Around는 메서드 실행 전/후, 예외 발생 여부 등 모든 시점에 개입할 수 있는 가장 강력한 어드바이스 타입입니다. ProceedingJoinPoint를 사용해 원래의 메서드 실행을 명시적으로 제어할 수 있습니다.

@Aspect
@Component
public class LoggingAspect {

    @Around("execution(* com.example.service..*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        
        Object result = joinPoint.proceed(); // 실제 대상 메서드 실행

        long end = System.currentTimeMillis();
        System.out.println("[LOG] " + joinPoint.getSignature() + " 실행 시간: " + (end - start) + "ms");

        return result;
    }
}

 

 

Pointcut 표현식 살펴보기

  • execution(* com.example.service..*(..)): 해당 패키지 이하의 모든 클래스, 모든 메서드에 적용
  • within(com.example.controller..*): 특정 패키지 내 클래스 전체에 적용
  • @annotation(MyCustomAnnotation): 특정 어노테이션이 붙은 메서드에만 적용

 

실무 적용 팁

  • 서비스 레이어의 로깅, 트랜잭션 시간 측정에 유용
  • 커스텀 어노테이션과 조합하면 역할 분리가 명확해짐
  • 조심할 점: AOP는 프록시 기반이라 private 메서드는 적용되지 않음

 


 

 

@Aspect@Around는 Spring AOP에서 공통 관심사를 구현할 때 매우 유용합니다. 복잡한 서비스 로직에 중복된 코드를 넣지 않고, 필요한 곳에만 AOP로 기능을 분리할 수 있어 유지보수성이 크게 향상됩니다. 실무에서는 로깅, 보안, 트랜잭션, 성능 측정 등에 많이 활용되며, Pointcut을 잘 정의하는 것이 핵심입니다.