Spring Web exception - Name of argument type [java.lang.Long]

Name of argument exception 원인 및 해결
dustjq1005 · 2024년 12월 09일

1. 원인

Exception의 명칭 그대로 Path Variable을 사용할 경우 Path Variable 명칭에 해당하는 Controller 메서드 매개변수의 이름을 찾을 수 없어 발생하는 오류이다. 대게는 명칭을 지정할 수 있는 @PathVariable("{명칭}")을 생략하지만, 이것은 자바 클래스파일이 디버깅모드로 컴파일 됐을 때에만 유효하다. 그 이유는 자바는 컴파일 된 바이트 코드에 메소드 매개변수 타입 정보만 포함하는데 디버깅 모드를 사용하는 경우엔 매개변수 이름 까지 바이크 코드로 변환되기 때문이다. 개발할 때 사용하는 IDE는컴파일을 디버깅 모드로 자동 컴파일 해주기 때문에 이러한 이슈를 볼 수 없었다. 그래서 로컬 환경에서는 해당 이슈는 발생하지 않았고, 릴리즈 모드로 배포되는 운영 환경에서만 발생했다.

2. 해결

코드 수정

@PutMapping("/api/articles/{id}")
public ResponseEntity<Article> updateArticle(@PathVariable(value = "id") long id,
                                             @RequestBody UpdateArticleRequest request) {

해결은 위에서 처럼 어노테이션에 value 값으로 name을 일치 시키면 되지만 굳이 이것 때문에 불필요한 코드를 치고 싶지 않다. 그렇다면 설정을 통해서 다르게 해결할 수 있다.

Intellij 설정

Build, Execution, Deployment → Compiler → Java Compiler → Additional command line parameters 해당 경로로 이동해서 -parameters 하나 넣어주면 된다.

Gradle 설정

tasks.withType<JavaCompile>(){
    options.compilerArgs.add("-parameters")
}

Gradle이 자바 컴파일시 -parameters 설정을 해준다.

문제점

바이트코드 크기 증가

소규모 애플리케이션에서라면 큰 문제가 되지 않겠지만 서비스가 큰 애플리케이션이라면 메모리 사용량에 큰 영향을 미칠 수 있다.

리플렉션 사용 시 성능 저하

리플렉션 성능 측면에서 불필요한 사용을 발생시킴으로써 부정적인 영향을 줄 수 있다.


참고

https://m.blog.naver.com/sm_woo/70185755273

https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention

Comments