[Spring] @RequestBody, @ModelAttribute, @RequestParam의 차이점

정지은·2022년 12월 7일
0

스프링(+자바)

목록 보기
4/5
post-custom-banner

컨트롤러를 작성하다 보면, RequestBody와 ModelAttribute, RequestParam을 자주 사용하게 된다. 셋 모두 프론트에서 데이터를 받아오는 형식인 것 같은데, 정확히 무엇이 다른 걸까?


@RequestBody

@RequestMapping("/list.no")
public String list(@RequestBody NoticeVO getNoticeVO) throws Exception {

...

  return "notice/list";
}

파라미터 란에 @RequestBody를 붙이면, 이곳으로 클라이언트가 보낸 json형식의 http 요청 본문(body)이 그대로 전달된다. xml이나 json 기반의 메시지 요청에 유용하다고 한다.

요청 본문을 message converter를 통해 자바 객체로 바꾸는 것이므로, getter와 setter가 없더라도 정상적으로 할당된다. (주입이 아닌 변환으로 인한 할당이기 때문에 가능하다.)

@RequestParam

@RequestMapping("/list.no")
public String list(@RequestParam("name") String n) throws Exception {

...

  return "notice/list";
}

이것은 클라이언트가 보내는 데이터를 핸들러(컨트롤러)의 파라미터와 1대1 대응시키기 위한 어노테이션이다. 예를 들어, /list.no?name=1이라는 요청을 보냈다면 n에는 '1'이 저장된다.

RequestParam은 기본적으로 nullable하지 않기 때문에 선언했다면 반드시 값이 할당되어야 하며, 대응되는 값이 없을 시 400을 리턴한다. 이는 required=false 옵션으로 비워 둘 수 있다.

@ModelAttribute

@RequestMapping("/list.no")
public String list(@ModelAttribute("noticeVO") NoticeVO getNoticeVO) throws Exception {

...

  return "notice/list";
}

@ModelAttribute는 HTTP Body 내용과 HTTP 파라미터의 값들을 Getter, Setter를 통해 주입하기 위해 사용한다. RequestBody와는 달리 기존에 존재하는 bean객체를 생성해 그곳에 값을 넣는 것이므로, getter와 setter가 있어야 한다.

클라이언트로부터 요청이 들어오면, 생성한 객체(여기서는 NoticeVO)에 요청한 파라미터와 같은 이름을 가진 변수에 값을 넣는다. 이로서 파라미터가 여러 개일때 모든 파라미터에 RequestParam을 지정할 필요 없이 한 번에 할당할 수 있게 된다.

이후 jsp에서 호출을 할 때에는 @ModelAttribute("noticeVO")에서 지정한 noticeVO로 변수들을 가져와 쓸 수 있다. 예를 들면, ${noticeVO.id}

profile
Steady!
post-custom-banner

0개의 댓글