<aside>

multipart/form-data


서버로 파일을 전송해야 하거나, 파일과 데이터를 함께 전송해야할 때 사용하는 HTTP 요청 방식

</aside>

<aside>

사용 이유


  1. JSON은 파일 바이너리를 직접 담을 수 없다.
  2. 서버가 MultipartFile을 자동으로 파싱하기 위함이다. </aside>

<aside>

요청 구조


Content-Type: multipart/form-data; boundary=----XYZ123

------XYZ123
Content-Disposition: form-data; name="image"; filename="a.png"
Content-Type: image/png

(binary data)
------XYZ123
Content-Disposition: form-data; name="accountId"

12345
------XYZ123
Content-Disposition: form-data; name="accessToken"

abcd-efgh-token
------XYZ123--

</aside>

@ModelAttribute

<aside>

스프링 MVC에서 클라이언트로부터 전달된 데이터를 컨트롤러 메서드의 파라미터 객체로 자동 바인딩해주는 어노테이션이다.

주로 HTML 폼 전송이나 multipart/form-data 요청을 처리할 때 사용된다.

단, JSON 바디를 처리할 때는 사용하지 않는다.

</aside>

consumes = MediaType.MULTIPART_FORM_DATA_VALUE

<aside>

스프링 MVC에서 컨트롤러 메서드가 어떤 Content-Type의 요청만 처리할지 명시하는 옵션이다.

@PostMapping, @GetMapping 등에서 사용 가능하며, 지정한 Content-Type과 일치하지 않는 요청이 들어오면 스프링 HTTP 415 Unsupported Media Type 에러를 반환한다.

즉, 컨트롤러 메서드가 처리할 요청 데이터 형식을 제한하는 안정장치 역할을 한다.

</aside>

주의 사항

<aside>

  1. 파일 업로드가 포함된 요청(multipart/form-data 형식)에서 consumes = MediaType.MULTIPART_FORM_DATA_VALUE를 선언하지 않을 때 발생하는 문제

  1. JSON 요청에서 @ModelAttribute 로 전달된 데이터를 컨트롤러 메서드의 파라미터 객체로 자동 바인딩하게되면 발생하는 문제