개발 지식, 스크립트/Spring
(Spring) AOP --정리 중
개발하는지호
2024. 2. 8. 16:00
//로깅 xml 까지 싹 다 정리하기
package dev.syntax.aop.aspect;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
// Logging에 대한 관심사를 별도의 모듈인 하나의 Aspect로 지정
@Aspect // 해당 클래스가 AOP의 애스펙트라고 명시
@Component // 스프링 컨테이너에게 LoggingAspect를 하나의 빈으로 등록해서 스프링 AOP 프레임워크가 이 Aspect를 알 수 있도록
@Slf4j // 로깅을 위한 롬복 Annotation
public class LoggingAspect {
/*
* Advice: 횡단 관심사를 구현하는 Aspect의 메서드, 이 코드에서는 logBefore()
* JoinPoint: 어드바이스를 적용할 메서드
* Pointcut: 각 어드바이스에서 그 어드바이스를 적용할 메서드를 구별시켜주는 구별자(표현식)
*/
// 포인트컷 식 ↓
// execution: 메서드의 이름 패턴을 사용하겠다
// execution( *(Asterisk) ~ : 메서드의 반환 타입은 무엇을 사용하든 상관없음
// dev.syntax.aop.controller : 해당 패키지 하위에 속해야함
// *Controller : 클래스 이름이 ~Controller로 끝나야함
// *( ) : 메서드로 전달되는 인수도 상관없음
// (..) : 대상 메 서드가 인수를 받을 수도 있고, 하나 이상의 인수를 받아도 상관없음
@Before(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
public void logBefore(JoinPoint joinPoint) {
// 호출된 클래스 및 메서드의 이름 로깅
log.info("-- "
+ joinPoint.getTarget().getClass().getSimpleName() + "'s "
+ joinPoint.getSignature().getName()
);
// 호출된 메서드의 인수로 전달된 파라미터값 로깅
Object[] args = joinPoint.getArgs(); // getArgs() : 대상(Target) 메서드에 전달된 인수를 얻는다.
for (int i = 0; i < args.length; i++) {
log.info("args[" + i + "] -->" + args[i]);
}
}
@After(value = "execution(* dev.syntax.aop.controller.*Controller.*(..))")
public void logafter(JoinPoint joinPoint) {
log.info("-- "
+ joinPoint.getTarget().getClass().getSimpleName() + "'s "
+ joinPoint.getSignature().getName()
);
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
log.info("args[" + i + "] -->" + args[i]);
}
}
}