강사님께서 말씀주신 실행시간에 따른 log 레벨 달리하는 부분 적용 해보았습니다. 필요하신 분 있으면 참고해 주세요.
(오류 발생 시에만 로그 남기는 부분은 @AfterThrowing 어드바이스를 사용하면 될거 같습니다 - Retry에서는 재시도 제거)
피드백 사항 있으면 말씀 부탁합니다. ^^;
1. 어노테이션 - 기본값 1000
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckTime {
int value() default 1000;
}
2. Aspect
@Around("@annotation(checkTime)")
public void checkTimer(ProceedingJoinPoint joinPoint, CheckTime checkTime) throws Throwable {
int mills = checkTime.value();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
joinPoint.proceed();
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
Signature signature = joinPoint.getSignature();
String methodName = signature.getName();
if (totalTimeMillis <= mills) {
log.info("methodName: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
}else if (totalTimeMillis > mills) {
log.error("methodName: {}, 실행시간 = {}ms", methodName, totalTimeMillis);
}
}
3. repository 레이어- 랜덤으로 실행시간 적용
@CheckTime(value = 2000)
public String save(String itemId) {
seq++;
if (seq % 5 == 0) {
throw new IllegalStateException("예외 발생");
}
sleep();
return "ok";
}
private void sleep() {
int[] ints = {1000, 2000,3000,4000,5000};
double random= Math.random();
int num = (int) Math.round(random * (ints.length-1));
try {
Thread.sleep(ints[num]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
영한님 항상 감사합니다!!