RequestBody vs ModelAttribute

Spring MVC에서 클라이언트 요청 데이터를 Java 객체로 바인딩할 때 사용하는 두 방식의 차이를 설명하는 개념입니다.

핵심 차이

@RequestBody

@RequestBody는 요청 본문에 담긴 JSON, XML 같은 데이터를 Java 객체로 역직렬화합니다.

@PostMapping("/members")
public ResponseEntity<Void> create(@RequestBody MemberRequest request) {
    memberService.create(request);
    return ResponseEntity.ok().build();
}

Spring은 요청의 Content-Type을 보고 적절한 HttpMessageConverter를 선택합니다. JSON 요청이라면 보통 Jackson ObjectMapper가 객체 생성을 담당합니다.

@ModelAttribute

@ModelAttribute는 쿼리 파라미터나 form-data를 객체의 필드에 바인딩합니다.

@GetMapping("/members")
public List<MemberResponse> search(@ModelAttribute MemberSearchCondition condition) {
    return memberService.search(condition);
}
@PostMapping("/profiles")
public ResponseEntity<Void> upload(@ModelAttribute ProfileForm form) {
    profileService.upload(form);
    return ResponseEntity.ok().build();
}

파일 업로드처럼 multipart/form-data가 섞인 요청에는 @ModelAttribute가 자연스럽습니다.

RequestBody vs ModelAttribute

항목@RequestBody@ModelAttribute
대상요청 본문요청 파라미터, form-data
대표 Content-Typeapplication/jsonapplication/x-www-form-urlencoded, multipart/form-data
변환 방식HttpMessageConverter데이터 바인딩
주 사용처REST API JSON 요청검색 조건, HTML form, 파일 업로드

주의사항

핵심 정리

JSON 본문을 객체로 받을 때는 @RequestBody, 쿼리 파라미터나 form-data를 객체로 받을 때는 @ModelAttribute가 적합합니다.

둘 다 요청 데이터를 객체로 바꾸지만, 읽는 위치와 변환 메커니즘이 다릅니다.

→ RequestBody VS ModelAttribute의 차이점을 말해주세요

CSLOG에서 보기