Spring Web exception - Name of argument type [java.lang.Long]
Name of argument exception 원인 및 해결
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
설정을 해준다.
문제점
바이트코드 크기 증가
소규모 애플리케이션에서라면 큰 문제가 되지 않겠지만 서비스가 큰 애플리케이션이라면 메모리 사용량에 큰 영향을 미칠 수 있다.
리플렉션 사용 시 성능 저하
리플렉션 성능 측면에서 불필요한 사용을 발생시킴으로써 부정적인 영향을 줄 수 있다.