본문 바로가기
발견

[Error / Spring] @PathVariable 변수명 인식 실패 이슈

by Dev_Green 2024. 5. 7.

문제 상황

아래와 같이 PathVariable을 포함하고 있는 path에 API 요청을 보내니 에러가 발생하였다.

Controller
Error Message

Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the '-parameters' flag.] with root cause

 

에러 메세지를 보니 parameter를 인식하지 못한다는 내용이었다.

Ensure that the compiler uses the '-parameters' flag 라는 메세지가 있는데 Java Compile 시에 '-paramter' 옵션 사용을 권장하는 내용이다.

 

이제껏 @PathVariable 어노테이션을 사용하면서 변수명을 명시하지 않아도 문제가 없어서 인지하지 못했었는데 

SpringBoot 버전 업그레이가 되면서 변경사항이 있었다.SringBoot 3.2. 버전 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도하였으나,이후 버전부터는 이러한 시도를 하지 않는다고 한다. 이로써 @PathVariable("변수명") 과 같이 변수명을 명시해주지 않았을 경우 변수명 추론이 불가하여 위와 같은 에러가 발생하는 것이었다.

 

이 문제는 @PathVariable 뿐만 아니라 다음과 같은 어노테이션을 사용할 경우에도 마찬가지로 발생할 수 있다.

@RequestParam, @PathVariable, @Autowired, @ConfigurationProperties

 

문제 해결

해결의 핵심은 파라미터를 인식하게끔 해주는 것이다.

방안1.

어노테이션 사용 시 파라미터명을 명시한다.

@PathVariable("noteId")

방안2.

자바 컴파일 시에 '-parameter' 옵션을 추가한다.자바 컴파일을 명령어를 통해 직접 수행한다면 위와 같이 옵션을 추가하면 되겠지만 그렇지 않은 경우 Gradle을 사용해서 빌드한다.

Build, Execution, Deployment -> Build Tools -> Gradle에서Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생한다.

 

회고

어노테이션 사용 시에 충분히 파라미터명 추론이 가능할 것이라 생각해서 생략하며 개발하는 경우가 많았는데 웬만하면 명시함으로써 확실히 하는 게 좋을 듯하다.