BACK/SPRING

[Spring] AOP를 이용한 Request 로깅

연듀 2024. 5. 5. 16:43

 

AOP(Aspect-Oriented Programming)를 이용하여 HTTP 요청과 응답을 로깅했습니다.

 

package contest.collectingbox.global.config;

import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

@Slf4j
@Aspect
@Component
public class LoggingAspect {
    @Pointcut("within(contest.collectingbox.module..*Controller)")
    private void cut() {
    }

    @Around("cut()")
    public Object doLogging(final ProceedingJoinPoint joinPoint) throws Throwable {
        final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                .getRequest();
        final String ipAddr = request.getRemoteAddr();
        final String method = request.getMethod();
        final String requestURI = request.getRequestURI();
        final Object[] args = joinPoint.getArgs();

        log.info("[REQUEST] {} {} {} args={}", ipAddr, method, requestURI, args);
        try{
            Object result = joinPoint.proceed();
            log.info("[RESPONSE] {}", result);
            return result;
        }catch(Exception e){
            log.error("[RESPONSE] exception message = {}", e.getMessage());
            throw e;
        }

    }
}

 

 

@Pointcut: contest.collectingbox.module 패키지 하위에 있는 모든 Controller 클래스의 메서드에 Advice를 적용하도록 합니다.

 

@Around: 해당 메서드 실행 전 후에 로깅 작업을 수행합니다.

 

JoinPoint: 프로그램 실행 중의 특정한 지점을 의미합니다. ProceedingJoinPoint 객체는 around Advice 메소드가 가지고 있는 비즈니스 메소드에 대한 정보입니다.

 

proceed() 메소드: 비즈니스 메소드를 진행하도록 합니다. proceed()를 기준으로 비즈니스 메소드의 수행 전과 후가 나누어집니다.

HTTP 요청 정보를 추출해 로깅하고, 메서드 실행 후 반환된 결과를 로깅했습니다.