Parameter

도윤·2024년 2월 6일

최종프로젝트를 진행하는 도중

java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either.이런 오류를 처음으로 접하게 되었다.

구글링을 해보니 이 오류는 스프링 부트 3.2 파라미터 이름 인식문제 라고 합니다.

  • 해결방안 1

어노테이션에 이름을 생략하지 않고 다음과 같이 이름을 항상 적어준다.
@PathVariable(name = “reviewId”) Long reviewId

  • 해결방안2

컴파일 시점에 -parameters 옵션 적용

  1. IntelliJ IDEA에서 File -> Settings를 연다. (Mac은 IntelliJ IDEA -> Settings)

  2. Build, Execution, Deployment → Compiler → Java Compiler로 이동한다.

  3. Additional command line parameters라는 항목에 다음을 추가한다.

-parameters

  1. out 폴더를 삭제하고 다시 실행한다. 꼭 out 폴더를 삭제해야 다시 컴파일이 일어난다.
  • 해결 방안3(권장)

Gradle을 사용해서 빌드하고 실행한다.


스프링 부트 3.2.0부터 –parmaters 라는 자바 컴파일 옵션을 설정해야 파라미터 이름을 생략할 수 있다라는 정보를 알게되었다.

Intelij Idea 로 build 시 –parmeters 옵션이 설정되어 있지 않기 때문에 안되는 것이고

gralde 로 build 시에는 –parmaeters 옵션이 자동 설정되어 따로 build.gradle 에 등록을 하지 않아도 된다.

이렇게 스프링 부트 버전을 3.1.5 로 수정해서 컴파일을 하는것도 하나의 해결방안이다.

Build Gradle VS InteliJ IDEA

둘의 차이를 먼저 알아보기전에 Compile(컴파일) 이란 뭘까?

컴파일이란 자바와 같은 사람이 이해할 수 있는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 더욱 저차원적인 코드 또는 기계어로 변환하는 것을 의미한다.
자바의 경우는 JVM(Java Virtual Machine)이 컴파일러 역할을 수행해주고 있다.
이와같은 컴파일 과정을 거치면서 프로그래밍 언어로 작성된 코드가 문법적으로 이상은 없는지 또는 Checked Exception은 없는지 검사를 하고 그걸 알려준다.

Build(빌드)

빌드는 컴파일이 포함된 일종의 과정으로, 프로그래밍 된 코드를 컴파일하고 실행 가능한 결과물로 만드는 과정을 칭한다. IDEA에서는 보통 실행을 시키면 컴파일을 포함한 빌드 과정을 거쳐 실행 가능한 결과물을 만들고 그것을 실행시킨다.

그렇다면 Gradle과 IntelliJ IDEA 빌드 설정은 실행하기 위해서 실행 가능한 결과물을 만드는 방식의 차이인데,

Gradle은 오픈 소스 빌드 자동화 도구이고 IntelliJ IDEA는 인텔리제이 자체에서 제공하는 빌드 자동화 도구이다.

여기서 Gradle 빌드 방식과 IntelliJ IDEA 빌드 방식의 제일 큰 차이는 증분 빌드냐 아니냐다.


증분 빌드(incremental build)란?

증분 빌드는 용어 그대로 증분된 부분, 즉 변경된 부분만 빌드를 하는 방식으로 변경되지 않은 것에 대해서는 건너뛰고 빌드를 진행해서 빠른 빌드를 원할 경우 선택하는 방법이다. IntelliJ IDEA가 바로 증분 빌드이다. 그래서 IntelliJ IDEA가 Gradle 빌드 방식보다 빠르게 빌드를 수행할 수 있었던 것이다.

하지만 증분 빌드이므로 IntelliJ IDEA 빌드 방식은 최신이다라고 판단하고 건너뛰고 빌드를 진행해 이번에 겪었던 것과 같이 이미 삭제한 파일에 대해서 변경 사항이 없다라고 판단해 건너뛰고 빌드를 진행해 빌드를 진행하고 나온 결과물에 삭제됐던 파일이 그대로 포함된 상태로 빌드가 완료될 수 있다. 따라서 정확한 빌드를 원한다면 IntelliJ IDEA 빌드 방식이 아닌 Gradle 빌드 방식을 선택해야하는 것이다.

참고로 Gradle은 build 폴더로 빌드 결과물이 나오고 IntelliJ IDEA는 out 폴더로 빌드 결과물이 나오는 차이도 있다.

여러 가지 해결방안이 있지만, 결론적으로 저의 해결방안은 Build and run Using을 Gradle 로 설정을 해주었고,

어노테이션에 이름을 생략하지 않고 이름을 적어주었습니다.
@PathVariable(name = “reviewId”) Long reviewId

profile
기록은 기억을 이긴다⭐

0개의 댓글