로그를 거의 모든 매서드마다 직접 찍어줘야 하는 불편함을 개선하기 위해서, 다음과 같은 코드를 사용했습니다.
Poincut(@Within) 이 아닌 어노테이션을 사용해서 처리했습니다.
아래는 먼저 어노테이션을 정의한 클래스입니다.
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME)
public @interface ExeTimer {
}
어노테이션을 사용하는 클래스입니다.
@Slf4j
@Aspect
@Component
public class ExecutionTimer {
// 조인포인트를 어노테이션으로 설정
@Pointcut("@annotation(com.team.final8teamproject.aop.Timer)")
private void timer(){}
// 패키지의 Controller 라는 이름으로 끝나는 패키지에 모두 적용 (매서드만)
@Pointcut("within(*..*Controller)")
private void cut(){}
// 메서드 전 후로 시간 측정 시작하고 멈추려면 Before,
// AfterReturning으로는 시간을 공유 할 수가 없음 Around 사용!
@Around("timer()")
public Object AssumeExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = joinPoint.proceed();// 조인포인트의 메서드 실행
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
log.info("실행 메서드: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
return proceed;
}
}
AOP를 왜 사용하는지?
AOP를 사용하는 가장 큰 이유는 관심사의 분리입니다.
-> 여러 매서드에 공통되는 기능을 모듈화 하여, 핵심 기능(비즈니스 로직) 밖에서 필요한 시점에 삽입되어 기능하게 합니다.
AOP의 장점은?
중복 코드 제거, 유지보수의 용이성 등이 있을 수 있습니다.
단점은?
핵심 비즈니스 로직의 기능에 영향을 미칠만한 기능은 삽입되어선 안되며, 만약 그럴 시 비즈니스 로직에 문제를 발생시킬 수 있습니다. 특히 Around 어노테이션은 매서드 실행 전,후,익셉션 발생 이후에까지 영향을 미치므로 신중하게 사용해야 합니다.
로그를 거의 모든 매서드마다 직접 찍어줘야 하는 불편함을 개선하기 위해서, 다음과 같은 코드를 사용했습니다.
Poincut(@Within) 이 아닌 어노테이션을 사용해서 처리했습니다.
아래는 먼저 어노테이션을 정의한 클래스입니다.
어노테이션을 사용하는 클래스입니다.
AOP를 왜 사용하는지?
AOP를 사용하는 가장 큰 이유는 관심사의 분리입니다.
-> 여러 매서드에 공통되는 기능을 모듈화 하여, 핵심 기능(비즈니스 로직) 밖에서 필요한 시점에 삽입되어 기능하게 합니다.
AOP의 장점은?
중복 코드 제거, 유지보수의 용이성 등이 있을 수 있습니다.
단점은?
핵심 비즈니스 로직의 기능에 영향을 미칠만한 기능은 삽입되어선 안되며, 만약 그럴 시 비즈니스 로직에 문제를 발생시킬 수 있습니다. 특히 Around 어노테이션은 매서드 실행 전,후,익셉션 발생 이후에까지 영향을 미치므로 신중하게 사용해야 합니다.