blog

다른 jar 패키지 버전으로 인해 NoSuchMethodError 오류가 발생했습니다.

웹을 둘러보니 이 문제에는 여러 가지 이유가 있다는 것을 알 수 있습니다. 다른 jdk 버전, 다른 jar 패키지에 대한 종속성 등. 갑자기 제가 사용하던 'spring-core'...

Jun 6, 2025 · 2 min. read
シェア

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: 두 모듈의 스프링 코어를 동일한 버전으로 변경하지만 저는 첫 번째 해결 방법을 선호합니다.
Read next

Kubernetes와 Docker의 관계 이해하기

1.배경 소개 오늘날 클라우드 네이티브 애플리케이션 배포 및 관리 분야에서 가장 인기 있는 오픈 소스 도구 중 하나는 Kubernetes와 Docker입니다. 둘 사이의 관계와 연관성은 매우 강력하지만 몇 가지 중요한 차이점이 있습니다. 이 백서에서는 Kubernet에 대해 자세히 살펴봅니다.

Jun 4, 2025 · 8 min read