ModelAttribute, RequestParam, RequestBody 차이

sojukang·2022년 4월 28일
1

RequestParam

  • query parameter, form-data를 받을 수 있다.
  • 단일 파라미터를 받을 수 있다.
  • 필수가 아닐 경우 default value를 지정해줄 수 있다.
  • Map으로 받는 것도 가능하다. 이 경우 Map<String, String>으로 name과 value 값이 바인딩 된 Map을 받는다.

ModelAttribute

  • form-data만 받을 수 있다.
  • 전달받은 form-data를 파싱하여 객체를 생성한다.
  • 반드시 생성자가 있어야한다. 생성자와 Setter를 사용해서 객체를 생성한다. 구체적인 사항은 다음과 같다.
  • 기본 생성자가 public일 경우 기본생성자로 생성
  • 기본생성자 & 그 외 생성자 2개 이상 -> 무조건 기본 생성자로 생성하고 setter로 binding
    • setter 없으면 property null로 바인딩
  • 기본생성자 & 그 외 생성자 1개 -> 그 외 생성자로 생성 + 빈 값 setter로 binding
    • setter 없으면 생성자로 할당되지 않은 property null로 바인딩
  • 기본생성자 X & 그 외 생성자 1개 -> 그 외 생성자로 생성 + 빈 값 setter로 binding
    • 기본 생성자 Exception 뜨지 않음,
  • 기본생성자 X & 그 외 생성자 2개 이상 -> 기본 생성자 오류 Exception

RequestBody

  • JSON, XML 을 받을 수 있다.
  • reflection을 사용해서 역직렬화하기 때문에 setter, 생성자가 필요 없다.
  • 그러나 반드시 기본 생성자는 필요한데, 내부에서 jackson 라이브러리ObjectMapper를 사용하기 때문이다.
    • ObjectMapper는 기본 생성자가 없으면 delegate로 객체를 생성한다.
    • @Delegate(Lombok)가 있으면 해당 속성을 가진 멤버의 메서드를 객체 외부에서 사용할 수 있다.

참고

RequestParam - Spring API
@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까?
@Delegate - Lombok

profile
기계공학과 개발어린이

0개의 댓글