해당 어노테이션을 항상 사용할 때 마다 헷갈려서 이번에 정리하기로 했습니다.
@RequestBody란?
HTTP 요청으로 넘어오는 body의 내용을 HttpMessageConverter를 통해 Java Object로 역직렬화 합니다.
즉, @RequestBody는 JSON 형태의 데이터를 Java 객체에 매핑할 때 사용하는 어노테이션입니다.
Http 통신 메세지의 구성의 status line, headers , body 중 body 부분의 데이터를 받아올 때 사용합니다.
ex) Content-type 예시
application/json : {key : value}
@RequestPart란?
@RequestPart는 HTTP request body에 'multipart/form-data'가 포함되어 있는 경우에 사용하는 어노테이션입니다.
MultipartFile이 포함되어 있는 경우에는 MultipartResolver가 동작하여 역직렬화를 하게됩니다.
만약, MultipartFile가 포함되어 있지 않다면, @RequestBody와 마찬가지로 동작하게 됩니다.
이슈 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
'CS > 자바 스프링' 카테고리의 다른 글
[Java Spring] 스프링으로 Thread Pool 원리 이해하기 ( 다중 유저 요청 처리 등) (0) | 2024.04.05 |
---|---|
[java spring] @ComponentScan를 이해하고 @Component과 @Configuration의 차이를 알아보자 (0) | 2024.03.30 |
MVC 패턴의 @Controller , @Service 그리고 @Repository과 이를 활용한 동작 과정 이해하기 (0) | 2024.02.26 |
MVC 패턴이란 무엇인가 (1) | 2024.02.23 |