⌨️ 메서드 실행 시간 AOP 구현
가장 쉽게 만들 수 있는 AOP중 하나로 Jmeter 테스트 이전 각 메소드의 실행시간을 개별적으로 확인하고 개선 해보기 위해 구현하기로 하였습니다.
1. 메서드 실행 시간 측정
1.1. AOP의 적용 범위
AOP의 적용은 @Target을 통해 패키지, 클래스 , 메서드, 필드 등 여러 방식으로 지정 가능합니다.
저는 메서드에 적용했습니다
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ExeTimer {
}
1.2. 메서드 실행 시간 측정 AOP 클래스 구현
구글링하여 찾은 레퍼런스 들로 학습하여 구현했습니다.
@Slf4j
@Aspect
@Component
public class ExecutionTimer {
// 조인포인트
@Pointcut("@annotation(com.codestates.culinari.global.aop.ExeTimer)")
private void timer(){};
//메서드 실행 전, 후 시간 공유
@Around("timer()")
public void AssumeExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable{
StopWatch stopWatch = new StopWatch();
stopWatch.start();
joinPoint.proceed(); // 조인포인트 메서드 실행
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
log.info("실행 메서드 : {} , 실행 시간 = {} ms", methodName, totalTimeMillis);
}
}
1.3. 실행 측정 결과
밑에서 기술할 전체 메서드 실행 시간도 같이 있기 때문에 형광펜 된 부분이 위 코드의 실행 결과임을 표시해두었습니다.
2. 전체 메서드 실행 시간 측정
위와 같이 짠 AOP에서는 해당 메서드의 총 실행 시간만 나왔기에 특정 부분들이 차지 하는 시간 비율을 알 수 없어 전체 메서드의 실행 시간을 측정하는 것 또한 구현하여 부분적으로 개선해보려 했습니다.
2.1. AOP의 적용 범위
이번에는 위와 다르게 전 패키지에 적용을 해두었습니다.
그래서 특정 메서드가 실행될 때 파생되는 메서드들 또한 추적하여 전체 실행시간에서 각 메서드들이 가지고 있는 파이를 확인 하였습니다.
@Around("execution(* com.codestates..*(..))")
public Object executeTime(ProceedingJoinPoint joinPoint) throws Throwable{
2.2. 메서드 전체 실행 시간 측정 AOP 클래스 구현
@Slf4j
@Aspect
@Component
public class AllTimer {
@Around("execution(* com.codestates..*(..))")
public Object executeTime(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.currentTimeMillis();
log.info("START : {} " ,start);
try{
return joinPoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
log.info("END : {} , 실행 메서드: {} ,실행시간 : {}", finish,methodName,timeMs);
}
}
}
2.3. 실행 결과
위 사진 처럼 각 부분들이 실행 하는 시간을 찾아내어 부분적으로 병목을 찾아내고 개선할 부분을 타겟팅 할 수 있습니다.
3. 활용 및 구현 이유
물론 Jmeter 테스트 도구를 활용하면 각 Http 메서드의 테스트 또한 가능 하기에 이러한 AOP는 의미가 없을 지 모릅니다.
그러나 Jmeter 도입 전 각 메서드들의 실행 시간을 알고 싶었고 충분히 많은 표본이 있지 않은 선에서 Jmeter 테스트는 변별력이 없을거란 생각이었습니다. ( 데이터의 갯수가 100개도 안되는 상황입니다.)
AOP를 구현 하는 것을 간단하고 스탠다드한 방식으로나마 구현해보기도 하고, 해당 AOP를 위해 Jmeter 테스트를 집중적으로 돌려볼 부분들에 대해 파악하려고 구현하게 되었습니다.
위 AOP와 그간 DB에서의 고민들을 종합하여 Jmeter 테스트를 하고 개선사항을 반영해볼 생각입니다.
2023.04.12 - [LIFE/ToDo - learning] - 2023.04.10 [PROJECT][TODO] Culinari V2 DB 최적화 및 고민(2)
🌟REFERENCE
참고 블로그 : https://velog.io/@dhk22/Spring-AOP-%EA%B0%84%EB%8B%A8%ED%95%9C-AOP-%EC%A0%81%EC%9A%A9-%EC%98%88%EC%A0%9C-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%8B%A4%ED%96%89%EC%8B%9C%EA%B0%84-%EC%B8%A1%EC%A0%95
https://koogood.tistory.com/35