coding

@ModelAttribute에서 바인딩안되는 문제

하루우울루 2025. 4. 9. 13:09

@RequestParam을 여러 개 쓰면 코드가 더러워져서 @ModelAttribute를 쓰는 경우가 있다.

여러 개의 파라미터를 하나의 객체로 바인딩해 주는 것으로 단순히 알고 있었는 데 사용 중 바인딩이 제대로 되지 않는 문제가 발생했다.


Spring은 url파라미터 또는 post로 가는 form-data를 자동으로 바인딩해 주는데 이때 반환되는 객체를 커맨드 객체라고 부른다고 한다.

그리고 커맨드 객체를 구성하기 위한 매핑 규칙이 있다.

 

DTO

NoArgsConstructorAllArgsConstructor가 동시에 있는 경우, NoArgsConstructor를 호출하고, setter를 호출해 param을 각 필드에 초기화한다.

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

 

나는 dto에 setter만 있는 경우였는데, AllArgsConstructor가 없었기에 규칙 2번에 해당하지 않았던 것이다.

 

그래서 @AllArgsConstructor를 추가하니 잘 바인딩된 것을 확인할 수 있었다.

 

dto를 Jackson 라이브러리를 통해 역직렬화하는 경우가 있는데 유의해서 dto를 목적에 맞게 설계하는 게 좋겠다.