@ModelAttribute 바인딩 되지 않는 문제

LSM ·2022년 1월 29일
1

1. 발생 배경

본인이 @ModelAttribute을 쓰는 경우는 @RequestParam를 여러개 쓰면 코드가 난잡해져 이를 한번에 처리하기 위해 @ModelAttribute를 사용한다.
솔직히 @ModelAttribute 어노테이션은 파라미터 앞에 쓰면 단순히 여러 개의 파라미터를 하나의 객체로 바인딩해 주는 정도로만 이해하고 있었다. 그래서 Request용 Dto를 정의하고, 해당 객체 옆에 @ModelAttribute를 붙여주었다.

그런데 왠걸..? 제대로 바인딩이 되지 않았다...

그래서 이를 해결하기 위해 열심히 구글링을 한 결과 문제점을 알 수 있었다. 운이 좋게도 나와 같은 문제로 고민한 분이 있었다. 그분의 블로그를 기반으로 해결법을 작성하겠다.

2. 문제점 및 해결방안

Spring은 URL 파라미터 또는 POST Form Data 형태의 파라미터를 위와 같은 특정 클래스의 자동으로 바인딩해 주는데, 이때 반환되는 객체를 커맨드 객체라고 부른다. 그리고 커맨드 객체를 구성하기 위한 매핑 규칙은 다음과 같다.

DTO에,

NoArgsConstructor과 AllArgsConstructor 둘 다 있는 경우 NoArgsConstructor 호출하고, setter 호출하여 param을 필드에 각각 초기화한다.

AllArgsConstructor만 있는 경우
AllArgsConstructor 호출하여 param을 필드에 각각 초기화한뒤, setter 호출하여 param을 필드에 각각 다시 초기화하여 덮어 씌운다.

즉, 본인 같은 경우에는 매핑 규칙 1번에 해당하지만 setter가 존재하지 않아서 param들을 필드에 초기화해줄 수 없던 것이었다. 그래서 기존에 붙여 두었던 @NoArgsConstructor을 제거하니 잘 바인딩 됨을 확인 할 수 있었다.

3. 결론

요청 Dto를 Jackson 라이브러리를 통해 역직렬화하는 경우
크게 @RequestBody, @RequestParam, @ModelAttribute 등이 있는데 상황에 맞게 잘 사용하도록 각 요소별 특성을 정리 할 필요가 있음을 느꼇다.

4. 참고자료

https://steady-coding.tistory.com/489

profile
개발 및 취준 일지

0개의 댓글