프로젝트 하던 중 게시글 작성 시 파일과 텍스트데이터를 함께 주고 받을 일이 생겼다.
기존에는 json데이터만 주고받으면 되어서 RequestBody를 사용했었는데, 후에 파일도 넣을 수 있도록 수정된 것.
파일이랑 json 데이터 함께 넘기려다보니까 RequestBody 말고 다른 방식을 찾아야 했음
(다만 기능 완성 후 ☞이런 방법은 지양해야 한다는 것을 알게 됨)
RequestBody가 불가능한 이유
Content-Type이 보통 텍스트는 json / 파일은 multipart/form-data 포맷인데
- 하나의 요청에 json과 multipart/form-data를 각각 넣는 것은 불가
→ 하나의 요청에는 하나의 Content-Type이 있어야 함 - 그리고 json 포맷에 multipart/form-data를 넣는 것도 불가
그리고
- RequestBody는 json포맷으로 데이터를 주고받는 용도
때문에 내가 원하는 상황(json + multipart/form-data)에서는 사용이 불가능한 것.
RequestPart를 선택한 이유
json안에 multipart/form-data는 불가하지만
multipart/form-data 안에 json 포맷이 들어가는 건 가능하다고 함.
multipart/form-data 포맷으로 주고받을 수 있는 건 RequestParam, RequestBody, ModelAttribute
나는 Rest API로 프로젝트를 구성했고,
json등의 내용을 포함한 경우에는 RequestPart가 더 적합하다고들하여 RequestPart를 사용하였음
각각의 특징을 간단히 구분 해보자면
RequestBody
- json, xml 포맷
- 값을 주입시키는 것이 아니라, 요청받은 데이터를 변환시키는 것이므로 Setter 없어도 매핑 가능
- body가 없는 get 메소드에서는 사용 불가, post 메소드에서 사용
- RequestBody를 여러 개 사용하는 것은 불가, 여러 객체를 포함하는 클래스를 별도로 생성하여 하나의 RequestBody로 받아야 함
ModelAttribut
- multipart/form-data포맷
- HTTP Body의 내용과 HTTP 파라미터들을 Setter를 통해 1:1 매핑
- 변환x 값을 주입시키는 것이므로 Setter 필수
- return값을 Model 객체와 바인딩
RequestPart
- multipart/form-data포맷
- json, xml 등 복잡한 내용을 포함한 경우 적합
- API 통신에서 이미지와 데이터를 함께 보낼 때 사용
RequestParam
- multipart/form-data포맷
- name-value form 형태에 적합
RequestPart 사용 예
코드
value = "" : 클라이언트로부터 들어오는 파라미터명을 value로 명시해줌
required = false : 값이 없어도 되는 데이터에 사용
@PostMapping("diary")
public ResponseEntity<ResponseMessage> createDiary(@RequestPart(value = "diary") DiaryVO diaryVO,
@RequestPart(value = "file", required = false) MultipartFile[] file) {
...
return new ResponseEntity<>(...);
}
Postman
json데이터에 content-type을 application/json으로 명시해줘야 함
참고
https://okky.kr/article/1218089
OKKY | 컨트롤러로 formData와 json 동시에 전송시
RequestPart로 컨트롤로 단에 매개변수를 RequestPart CharacterCreateRequest request, RequestPart MultipartFile imgFile 로 dto와 MultipartFile 를 분리하여 받지 않고 CharacterCreateRequest 안에 MultipartFile
okky.kr
Spring Boot | multipart/form-data 파일 업로드 ( + React , Axios, REST API, multiple files)
클라이언트(React) 측에서 파일과 함께 JSON데이터를 전송해보기. 찾아보면 파일 하나만 전송하는 경우 예제는 많은데 JSON데이터와 함께 보내는 건 잘 없었다.. 거기다가 나는 모델 안에 오브젝트
gaemi606.tistory.com
https://backtony.github.io/spring/2021-12-02-spring-mvc-1/
Spring MVC - 기능 정리
Java, JPA, Spring을 주로 다루고 공유합니다.
backtony.github.io
'Spring' 카테고리의 다른 글
[Spring] Spring Security - SecurityContextHolder와 ThreadLocal에 관한 의문 (0) | 2022.06.15 |
---|---|
[Spring] Spring Security - 필터 (0) | 2022.06.14 |
[Spring] Spring Security - 주요 모듈 (2) | 2022.06.13 |
파일과 텍스트 함께 전송하기2 - 지양해야 하는 이유 (0) | 2022.06.09 |