티스토리 뷰

AOP(Aspect-Oriented Programming)는 핵심 비즈니스 로직과 분리되는 부가적인 기능, 즉 '횡단 관심사'를 분리해 코드의 가독성과 유지 보수성을 높여줍니다. 대표적인 예로 로깅, 트랜잭션 관리, 보안 등이 있는데, 이 중에서도 메서드 호출에 대한 로깅은 애플리케이션의 동작을 추적하고 디버깅하는 데 큰 도움이 됩니다. 이번 포스팅에서는 Spring Boot의 AOP를 활용해 프로젝트 내 모든 메서드 호출 시마다 자동으로 로그를 남기는 방법을 알아보겠습니다.

Spring logback 설정은 블로그 포스팅 을 참고해주세요.

 

1. 라이브러리 추가

// AOP
implementation 'org.springframework.boot:spring-boot-starter-aop'

 

2. LogAop.java

package com.criteria.criteriaexample.config;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class LogAop {

  @Before("execution(* com.criteria..*(..))")
  public void methodCall(JoinPoint joinPoint) {
    String methodName = joinPoint.getSignature().getName();
    String className = joinPoint.getSignature().getDeclaringTypeName();
    log.info("Entering method: " + className + "." + methodName + "()");
  }

  @AfterReturning(pointcut = "execution(* com.criteria..*(..))", returning = "result")
  public void logMethodExit(JoinPoint joinPoint, Object result) {
    String methodName = joinPoint.getSignature().getName();
    String className = joinPoint.getSignature().getDeclaringTypeName();
    log.info("Exiting method: " + className + "." + methodName + "() with result: " + result);
  }

}
  • @Slf4j: Lombok을 통해 log라는 Logger 객체를 자동으로 생성해주는 어노테이션입니다. 이를 통해 log.info()와 같은 메서드를 사용하여 간편하게 로그를 남길 수 있습니다.
  • @Aspect: 이 클래스가 AOP의 핵심인 Aspect임을 나타냅니다. Aspect는 여러 곳에서 적용될 공통 기능을 모아놓은 모듈입니다.
  • @Component: Spring의 Bean으로 등록되어 자동으로 관리되도록 하는 어노테이션입니다. 이를 통해 Spring IoC 컨테이너가 이 클래스를 인식하고 AOP 기능을 적용할 수 있게 됩니다.
  • @Before("execution(* com.criteria..*(..))")
    • 이 어노테이션은 com.criteria 패키지와 그 하위 패키지에 있는 모든 클래스의 모든 메서드가 호출되기 에 이 methodCall 메서드가 실행된다는 것을 의미합니다.
  • @AfterReturning(pointcut = "execution(* com.criteria..*(..))", returning = "result")
    • 이 어노테이션은 com.criteria 패키지와 그 하위 패키지의 모든 메서드가 실행된 후에, 즉 정상적으로 반환된 경우에 logMethodExit 메서드가 실행된다는 것을 의미합니다.

 

감사합니다.

최근에 올라온 글
Total
Today
Yesterday