bug
메서드 최적화 전후의 실행 시간을 관찰하기 위해 AOP와 StopWatch로 사용자 정의 주석을 사용하여 실행 시간을 계산했지만 프로젝트를 실행하면 다음과 같은 예외 메시지가 나타났습니다. Handler dispatch failed: java.lang.NoSuchMethodError: 'double org.springframework.util.StopWatch......'
사용자 지정 주석
@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CostTime { 
}
탄젠트 클래스(수학)
@Aspect 
@Slf4j 
@Component 
public class CostTimeAspect { 
 @Pointcut("@annotation(com.tomla.gomall.aop.annotations.CostTime)") 
 public void CostTime(){} 
 
 @Around("CostTime()") 
 public Object costTime(ProceedingJoinPoint point) throws Throwable { 
 StopWatch stopWatch = new StopWatch(); 
 stopWatch.start(); 
 //진입점을 실행하고 반환값을 가져옵니다. 
 Object proceed = point.proceed(); 
 //메서드 이름 
 String methodName = point.getSignature().getName(); 
 //  
 String className = point.getSignature().getDeclaringTypeName(); 
 //시간 소모 계산 
 stopWatch.stop(); 
 log.info(" {}, {},구현에는 시간이 많이 걸립니다:{}",className,methodName,stopWatch.getTotalTimeMillis()); 
 return proceed; 
 } 
}
실행 시간을 계산해야 하는 메서드에 @CostTime 주석을 달기
@CostTime 
@GetMapping("/detail/{skuId}") 
public Result<SkuItemVo> getDetailBySkuId(@PathVariable("skuId") Long skuId){ 
 return skuInfoService.getDetailBySkuId(skuId);
}
버그 해결
- 이 문제에는 다른 jdk 버전, 다른 jar 패키지에 대한 종속성 등 다양한 이유가 있다는 것을 알았습니다. 갑자기 제가 사용하던 StopWatch가 스프링 코어 패키지 아래에 있는 _ 패키지 아래에 있다는 것을 깨달았습니다. 제가 사용하던 StopWatch가 스프링 코어 패키지 아래에 있는 org.springframework.util패키지 아래에 있었고, 마이크로서비스의 공통 모듈 아래에 이 사용자 정의 주석 기반 컷아웃 클래스를 작성했으며 다른 서비스에서 이 사용자 정의 주석을 사용하고 있었다는 것을 갑자기 깨달았습니다. 즉, 제가 사용한 위치와 다른 위치에 패싯 클래스를 정의했고, 두 서비스 모두 스프링 코어 종속성의 다른 버전을 사용했습니다! 공통 모듈은org.springframework:spring-core:6.1.1버전을 사용하고 다른 서비스는org.springframework:spring-core:6.0.4버전을 사용하므로 컴파일과 런타임이 다른 환경에 있어 이 심각한 버그가 발생하게 된 것이죠.
- 해결 방법 1: 공통적으로 hutool 툴킷을 도입했고 다른 서비스에서도 이 툴을 사용하므로 StopWatch 툴킷에서 hutool을 통합적으로 사용하면 다른 jar 패키지를 사용하지 않아도 NoSuchMethodError 문제가 발생하지 않습니다.
- 해결 방법 2: 두 모듈의 스프링 코어를 동일한 버전으로 변경하지만 저는 첫 번째 해결 방법을 선호합니다.




