작성
·
538
0
스프링부트 3.3.7 버전으로 실습하다가 DispatcherServlet 이 hello() 메서드의 파라미터 String name을 못가져오는 에러를 겪었습니다.
검색좀 해보니 부트 3.2, 스프링6.x 이상부터는 더이상 파라미터 추론을 기본으로 하지 않는다고 하네요.
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.2-Release-Notes
컴파일 시 -parameters 옵션을 사용하거나
@RequestParam() 어노테이션을 사용하여 해결가능합니다 !
답변 4
2
좋은 정보 제공해주셔서 감사합니다.
자바 컴파일러의 메소드 파라미터 메타정보를 컴파일 시점에 남기려면 -parameters 정보를 줘야하죠. 이를 통해서 파라미터 이름을 가져오는 방식을 스프링 6부터는 디폴트로 만들었기 때문에 이 컴파일 옵션이 없으면 @RequestParam 등에 명시하지 않은 경우 바인딩할 query string 이름을 피라미터 이름으로부터 가져올 수 없는 문제가 발생합니다.
스프링 부트 강의에서는 그 이전에 많이 알려져있던, IntelliJ에서 프로젝트 빌드와 테스트 등의 성능을 좀 더 높일 수 있도록 iIIntelliJ의 Gradle build 설정의 디폴트인 Gradle 대신 IntelliJ IDEA로 변경하는 팁을 말씀드렸습니다. 최신 장비가 아닌 경우 조금의 실행 성능 개선 효과가 있었습니다. 하지만 스프링이 기본으로 제공하는 Gradle을 이용한 빌드와 미묘한 차이가 있기 때문에 최근에는 가능한 Gradle을 이용한 빌드를 사용하는 것이 권장됩니다. CI 과정에서 빌드할 때나, 배포 후에 Spring Boot task를 이용해서 실행하는 것과 동일한 설정을 개발 장비에서도 적용하는 것이 바람직하기 때문이죠. 그 중의 하나가 Gradle 대신 IntelliJ로 빌드하는 옵션을 선택하는 경우 -parameters가 추가되지 않습니다. 그래서 예제와 같은 경우에는 에러가 발생하는 것입니다.
반면 스프링 부트 프로젝트에서 사용하는 Gradle 빌드 기본 설정을 사용하면 자바 클래스를 컴파일할 때 -parameters 옵션을 기본으로 추가해줍니다. 그래서 스프링만을 이용하고 독자적인 빌드 코드를 만들어서 만들지 않고, 스프링 부트를 기본 Gradle을 이용해서 개발하고 빌드하는 경우엔 사실 @RequestParam 없이도 메소드 이름을 잘 가져옵니다.
저도 IntelliJ에서 스프링 부트 프로젝트를 만들고 디폴트 빌드 옵션(Gradle)을 그대로 사용해서 예제를 만들었기 때문에 최근까지도 별 문제가 없었던 듯합니다.
0
추가적으로 아래와 같이 설정 가능합니다
[인텔리 build 시]
File Settings
gradle 검색
Build and run using : IntelliJ IDEA
Run tests using : IntelliJ IDEA
javac 검색
Additional command line parameters : -parameters
추가
[gradle build 시]
build.gradle 추가
tasks.withType(JavaCompile).configureEach {
// getParameterNames() 사용을 위한 설정
options.compilerArgs.add("-parameters")
}
0
0
안녕하세요, 인프런 AI 인턴입니다. 조윤재님,
스프링 부트 3.2 및 그 이상의 버전에서는 메서드 파라미터 추론이 중단되어 발생할 수 있는 문제에 대해 설명드리겠습니다. 개발 환경에서 메서드 파라미터를 유추하지 않는 이유는, 코드의 명시성을 높이고 잠재적 오류를 줄이기 위함입니다. 이러한 변경 사항은 스프링 프레임워크 6.x 버전부터 시작되었습니다.
문제를 해결하기 위해서 다음 두 가지 방법 중 하나를 선택할 수 있습니다:
-parameters 컴파일 옵션 사용: 이 옵션을 사용하면, 컴파일 시점에 메서드 파라미터 이름을 유지할 수 있습니다. 이를 통해 DispatcherServlet이 메서드 파라미터를 올바르게 추론할 수 있습니다.
@RequestParam
어노테이션 사용: 메서드 파라미터에 @RequestParam
을 명시적으로 추가하면, 스프링 프레임워크에 해당 파라미터가 요청 매핑 변수임을 알려주어 추론 문제를 방지할 수 있습니다.
이와 관련하여 유용한 링크를 제공하겠습니다:
- Spring Boot 3.2 Release Notes: 버전 업데이트에 따른 변경 사항이 설명되어 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.