본문 바로가기

CS/자바 스프링

@RequestBody VS @RequestPart VS @RequestParam의 개념을 알아보자

해당 어노테이션을 항상 사용할 때 마다 헷갈려서 이번에 정리하기로 했습니다.

 

@RequestBody란?

HTTP 요청으로 넘어오는 body의 내용을 HttpMessageConverter를 통해 Java Object로 역직렬화 합니다.

 즉, @RequestBody는 JSON 형태의 데이터를 Java 객체에 매핑할 때 사용하는 어노테이션입니다.

Http 통신 메세지의 구성의 status line, headers , body 중 body 부분의 데이터를 받아올 때 사용합니다.

 

ex) Content-type 예시

application/json : {key : value}

@RequestBody 사용법


 

@RequestPart란?

@RequestPart는 HTTP request body에 'multipart/form-data'가 포함되어 있는 경우에 사용하는 어노테이션입니다.

MultipartFile이 포함되어 있는 경우에는 MultipartResolver가 동작하여 역직렬화를 하게됩니다.

만약, MultipartFile가 포함되어 있지 않다면, @RequestBody와 마찬가지로 동작하게 됩니다.

@RequestPart 사용방법

 


이슈 1 - 이미지 파일을 게시판에 등록해야 하는 상황에서 @RequestBody를 사용

과제를 수행하며 이미지 파일을 게시판에 등록해야 하는 상황이 있었습니다. 해당 상황에서 기존에 하던 방법으로 @RequestBody를 사용하여 게시글과 관련된 데이터를 json 형태로 받아오고, 이미지 파일은 RequestPart 파일로 따로 받아오려고 했습니다. 

하지만, 아래와 같이 작성을 하면 하나의 요청에서  @RequestBody와 @RequestPart는 모두 요청 본문에서 데이터를 읽는데
사용되지만,  @RequestBody는 JSON 형식의 데이터를 읽고, @RequestPart는 multipart 형식의 데이터를 읽습니다. 

그래서 한번에 사용하면 Content-type 충돌이 발생합니다.

 

이를 해결하기 위해서는 @RequestPart를 활용해 온전하게 파일과 데이터를 받아올 수 있도록 해야합니다.

 

처음 시도 방법


 

@RequestParam이란?

 @RequestParam는 HTTP 요청을 파라미터 이름으로 바인딩합니다.

@ResponseBody
@RequestMapping("/request-param")
public String requestParamV2(
        @RequestParam("username") String memberName,
        @RequestParam("age") int memberAge
) {
    log.info("username={}, age={}", memberName, memberAge);
    return "ok";
}
예시 참조 블로그 : https://yummy0102.tistory.com/669

@RequestParam와 @RequestPart의 차이 

 @RequestParam는 단순히 HTTP 요청을 파라미터 이름으로 바인딩합니다. 특히, multipart 요청에는 사용되지 않습니다.

하지만, @RequestPart는 HTTP request body에 'multipart/form-data'가 포함되어 있는 경우에 사용하는 어노테이션입니다.

그래서 파일 업로드 등 multipart 데이터를 처리하는데 용이한 것은  @RequestPart입니다.


학습을 위해 게시글을 작성하고 있습니다.

틀린 부분이 있으면 언제든지 말씀해주세요. 

읽어주셔서 감사합니다.

출처:

https://middleearth.tistory.com/35

https://yuma1029.tistory.com/8

https://velog.io/@rlvy98/Spring-RequestPart를-사용해보자

https://yummy0102.tistory.com/669