[Spring] RequestBody vs RequestParam vs RequestPart vs ModelAttribute

DevHwan·2022년 12월 5일
2

RequestBody

RequestBody는 클라이언트가 전송하는 Json 형태의 HTTP request Body를 HttpMessageConverter를 이용하여 Java 객체의 형태로 Convert 해주는 어노테이션이다. 선택적으로 Valid 어노테이션을 추가하여 자동 유효성 검사를 적용할 수도 있다.

회원 정보 수정 API
@PatchMapping("/api/v2/members/{id}")
public UpdateMemberResponse updateMemberV2(@PathVariable("id") Long id,
                                           @RequestBody @Valid UpdateMemberRequest request)

RequestParam

RequestParam은 Servlet request 파라미터에 접근하기 위해 사용한다. multipart file 과 같은 것들도 동일하게 잘 작동한다. 1개의 HTTP 요청 파라미터를 받기 위해서 사용하며, 파라미터 여부가 default로 true이기 때문에 파라미터가 반드시 전송되어야 한다. → 전송되지 않는 경우 클라이언트 오류인 400에러가 발생한다. ( required 옵션을 false 로 변경하면 괜찮아진다. )

RequestParam은 단순 파라미터 값에 효과적인 어노테이션이다.

RequestPart

RequestPart는 HTTP request body에 multipart/form-data 가 포함되어 있는 경우에 사용하는 어노테이션이다. ( 스프링에서 제공하는 어노테이션이다. ) MultipartFile이 포함되어 있는 경우에는 MultipartResolver가 동작하여 역직렬화를 하게 된다. ( Byte로 되어있는 데이터를 객체 형태로 변환한다. ) 만약 MultipartFile이 포함되어있지 않다면, RequestBody와 마찬가지로 동작하게 된다.

ModelAttribute

ModelAttribute는 Spring Controller에서 값을 받을 때, default의 설정이다. Http body로 오거나, 파라미터로 오는 경우에도 받을 수 있고, 이를 binding을 통해 처리한다. 내부적으로는 어노테이션의 내부 필드와 생성자 혹은 Setter를 통해 값이 매핑된다. RequsetPart와 다른 점은 HttpMessageConverter를 통해 값이 Binding되지 않고 생성자 혹은 Setter를 통해 값이 주입된다.

레퍼런스

  • Official Spring Document
profile
달리기 시작한 치타

0개의 댓글