AOP 개념에 관한 이전 포스팅
https://yeoncoding.tistory.com/732
[Spring] AOP란
Spring AOP 관점 지향 프로그래밍(AOP-Aspect Oriented Programming) AOP는 관점을 기준으로 묶어 개발하는 방식을 말한다. 관점(aspect)이란, 어떤 기능을 구현할 때 그 기능을 핵심 기능과 부가 기능으로 구분
yeoncoding.tistory.com
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;
}
}
}
Aspect: 모듈화된 부가기능으로, 위 코드의 경우 LoggingAspect 클래스입니다.
JoinPoint: Aspect가 적용될 수 있는 지점입니다. ProceedingJoinPoint 객체는 around Advice 메소드가 가지고 있는 비즈니스 메소드에 대한 정보입니다.
Advice: 특정 Join Point에서 실행되는 코드입니다. Advice는 언제 실행되는지에 따라 다양한 유형이 있습니다(예: Before, After, Around). 여기서는 doLogging 메서드가 Around Advice입니다.
@Pointcut: contest.collectingbox.module 패키지 하위에 있는 모든 Controller 클래스의 메서드에 Advice를 적용하도록 합니다.
@Around: 해당 메서드 실행 전 후에 로깅 작업을 수행합니다.
proceed() 메소드: 비즈니스 메소드를 진행하도록 합니다. proceed()를 기준으로 비즈니스 메소드의 수행 전과 후가 나누어집니다.
HTTP 요청 정보를 추출해 로깅하고, 메서드 실행 후 반환된 결과를 로깅했습니다.
'BACK > SPRING' 카테고리의 다른 글
[Spring] @ExceptionHandler를 사용해 예외 처리하기 (1) | 2024.04.18 |
---|---|
[Spring] 스프링 MVC1- 웹 애플리케이션 이해(WAS, 서블릿, 쓰레드) (0) | 2024.03.04 |
[Spring] 스프링 핵심 원리 - 빈 스코프 (0) | 2024.03.04 |
[Spring] 스프링 핵심 원리 - 빈 생명주기 콜백 (0) | 2024.03.04 |
[Spring] 스프링 핵심 원리 - 의존관계 자동 주입 (0) | 2024.01.31 |