티스토리 뷰

Skill/spring

@RequestPart

진열사랑 2025. 7. 19. 22:10

좋은 질문입니다!
@RequestPart는 Content-Type이 multipart/form-data일 때, 각 part를 분리해서 받을 수 있도록 도와주는 어노테이션입니다.

즉, 단순히 "Content-Type이 다를 때 사용하는 것"이라기보다는:
👉 multipart/form-data 요청 내에 포함된 각각의 Part (JSON, 파일 등)를 받을 때 사용하는 것입니다.


✅ 핵심 개념 요약

📌 @RequestPart는 언제 사용하는가?

  • Content-Type: multipart/form-data 요청에서,
  • multipart 본문 안에 JSON 데이터 + 파일이 함께 포함될 경우
  • @RequestParam, @ModelAttribute로는 JSON 객체를 받을 수 없기 때문에 → @RequestPart를 사용

🔍 예를 들어 설명해볼게요

클라이언트 요청 예 (POST)

Content-Type: multipart/form-data 헤더로 다음과 같은 본문을 보냅니다:

  • data: JSON 문자열 (DTO용)
  • inpFile: 바이너리 파일

요청 구조

--boundary
Content-Disposition: form-data; name="data"
Content-Type: application/json

{ "name": "홍길동", "age": 30 }
--boundary
Content-Disposition: form-data; name="inpFile"; filename="file.txt"
Content-Type: text/plain

(file content)
--boundary--

📌 Spring Controller

@PostMapping(value="/upload", consumes=MediaType.MULTIPART_FORM_DATA_VALUE)
public void upload(
    @RequestPart("data") InftwtAnlsSaveDto inftwtAnlsSaveDto,
    @RequestPart(value="inpFile", required = false) MultipartFile file
) {
    // data는 JSON → DTO로 변환됨
    // file은 MultipartFile로 전달됨
}

왜 @RequestBody를 쓰지 않을까?

  • @RequestBody는 전체 요청 본문에 대해 하나의 JSON 객체를 읽습니다.
  • 하지만 multipart/form-data는 여러 개의 part로 나뉘어 있으므로, @RequestBody는 사용할 수 없습니다.
  • @RequestPart는 각 part의 Content-Type을 보고 HttpMessageConverter로 적절히 변환함

✅ @RequestParam vs @RequestPart

항목 @RequestParam @RequestPart

용도 일반 form 필드, 파일 JSON 객체 or 파일 (part 전체)
Content-Type application/x-www-form-urlencoded, multipart/form-data multipart/form-data 전용
JSON 처리 ❌ (JSON은 String 처리됨) ✅ (JSON → DTO 자동 변환)
파일 업로드

✅ 정리

  • @RequestPart는 multipart/form-data 요청에서 JSON이나 파일을 받을 때 사용
  • JSON이 포함된 part는 내부적으로 MappingJackson2HttpMessageConverter를 통해 DTO로 변환됨
  • 단순 문자열/숫자라면 @RequestParam으로도 가능, 하지만 **복합 객체(JSON)**라면 @RequestPart가 필요

필요하시면 실제 curl, JS FormData, 또는 React + axios 예제도 보여드릴게요.

'Skill > spring' 카테고리의 다른 글

Hikari booting 로그 보기  (2) 2025.08.12
@PostMapping의 consumes 속성  (0) 2025.07.19
PostgreSQL] 최대 동시 접속자 수를 초과  (0) 2025.07.18
A TupleBackedMap cannot be modified.  (1) 2025.07.18
JPA JOIN 처리  (1) 2025.07.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함