[Spring boot] Multipart Upload

brandon·2025년 6월 12일

spring-boot

목록 보기
14/15

@RequestBody 는 데이터 형식을 JSON 형태로 전달받기 때문에 만약 파일을 Body로 받게 된다면 원하는 결과를 얻을 수 없습니다. @RequestParam 또한, 기본적으로 문자열 데이터를 처리하는데 사용되므로 미디어 파일과 같은 바이너리 데이터를 @RequestParam 을 통해 받아오는 것은 적절하지 않습니다.

이를 해결하기 위해서는 @RequestPart 를 활용해 온전한 미디어 파일을 받아오도록 해야합니다.

@RequestPart

@RequestPart는 HTTP request body에 multipart/form-data 가 포함되어 있는 경우에 사용하는 어노테이션입니다. MultipartFile이 포함되어 있는 경우 MultipartResolver가 동작하여 역직렬화를 하게 됩니다. 만약 MultipartFile이 포함되어있지 않다면, @RequestBody와 마찬가지로 동작하게 됩니다.

multipart/form-data 요청 본문에서 각 파트는 다음과 같은 구조를 가집니다.

--[boundary]
Content-Disposition: form-data; name="[여기!]"
Content-Type: [해당 파트의 MIME 타입, 선택 사항]

[해당 파트의 데이터]

@RequestPart("fieldName") 어노테이션은 이 name="fieldName" 부분을 찾아서 해당 파트의 데이터를 컨트롤러 메소드의 파라미터로 주입합니다.

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)

@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)는 Spring Framework에서 컨트롤러 메소드를 정의할 때 사용하는 어노테이션의 일부입니다. 하나씩 뜯어보겠습니다.

  1. @PostMapping
  • @PostMapping은 Spring Web에서 HTTP POST 요청을 특정 핸들러 메소드(컨트롤러 메소드)에 매핑하는 데 사용되는 복합 어노테이션입니다. 이는 @RequestMapping(method = RequestMethod.POST)의 축약형입니다.

  • 역할: 클라이언트로부터 온 POST 요청을 받아서 해당 메소드가 처리하도록 합니다. 주로 새로운 리소스를 생성하거나, 데이터를 서버로 제출할 때 사용됩니다.

  1. consumes 속성
  • consumes는 @RequestMapping (그리고 @PostMapping, @GetMapping 등 파생 어노테이션)의 속성 중 하나로, 해당 메소드가 처리할 수 있는 요청의 Content-Type 미디어 타입을 지정합니다.

  • 역할: 서버가 특정 Content-Type의 요청만 처리하도록 제한합니다. 이는 요청 매핑의 충돌을 방지하고, 특정 데이터 형식에 대한 처리 로직을 명확히 할 때 유용합니다.

  • 작동 방식: 클라이언트가 HTTP 요청을 보낼 때 Content-Type 헤더에 데이터의 타입을 명시합니다 (예: application/json, text/plain, application/x-www-form-urlencoded 등). 서버는 이 Content-Type 헤더를 보고 consumes 속성에 지정된 타입과 일치하는 핸들러 메소드를 찾아 요청을 전달합니다. 일치하지 않으면 415 Unsupported Media Type 오류를 반환합니다.

  1. MediaType.MULTIPART_FORM_DATA_VALUE
  • MediaType 클래스는 HTTP에서 사용되는 표준 미디어 타입(MIME 타입) 상수를 정의합니다.
  • MediaType.MULTIPART_FORM_DATA_VALUE: 이 상수는 "multipart/form-data" 문자열을 나타냅니다.
profile
everything happens for a reason

0개의 댓글