Spring

파일과 텍스트 함께 전송하기1 - RequestPart

da77777 2022. 6. 9. 19:16

프로젝트 하던 중 게시글 작성 시 파일과 텍스트데이터를 함께 주고 받을 일이 생겼다.

기존에는 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

https://gaemi606.tistory.com/m/entry/Spring-Boot-multipartform-data-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-React-Axios-REST-API

 

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