@ModelAttribute 와 Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long';

pudding·2023년 2월 5일
0

팀 프로젝트에서 우리는 rest API 개발을 먼저 모두 끝내고 프론트를 구현하고 있다. rest API 구현을 하면서 기능이 잘 작동하는지는 이미 모두 테스트를 해봤기 때문에 사실 프론트 엔드 개발은 순탄하게 진행될거라고 생각했다. 기대와는 달리 처음 만들어보는 UI 화면은 하나 하나 공부해가며 만들다보니 시간이 훨씬 더 오래걸렸다.

상품 검색 부분의 UI를 구현하고 실행했는데 마주하게 된 오류이다.

Failed to convert value of type 'java.lang.String' to required type 'java.lang.Long'; nested exception is java.lang.NumberFormatException: For input string: "search"

내용을 봤을 때는 타입이 잘못되었다는 것 같았다. 하지만 타입이 잘 못 될만한 부분도 없었고, 타입이 잘 못 되었다면 rest API에서도 오류가 났을 것이다. 구글링을 한참 해본 결과

값을 받아오는 dto에 setter를 붙여주지 않아서 발생한 오류였다

우리는 RequestParameter가 필요할 때 값을 바인딩하여 우리가 원하는 객체로 변환해주는 @ModelAttribute를 사용한다.

@ModelAttribute는

  1. 먼저 적절한 생성자가 있는지 찾아보고, 있다면 생성자로 값을 바인딩 한다.(객체 생성)
  2. 1에서 적절한 생성자가 없어서 바인딩되지 못한 값은 @Setter로 값을 바인딩 해준다.

따라서 @AllArgsContructor로 모든 필드를 매개변수로 가지는 생성자를 만들어주거나 @Setter를 사용하여야(기본생성자는 자바가 자동으로 생성) @ModelAttribute가 정상적으로 작동할 수 있는 것이다.

참고: https://minchul-son.tistory.com/546

profile
영차 영차 개발 공부 기록 하기

0개의 댓글