티스토리 뷰
좋은 질문입니다!
@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
링크
TAG
- spring
- $.extend
- 여러 컬럼 update
- Keycode
- excel
- springboot
- lombok
- getter
- oracle
- $.each
- caniuse
- CSS
- JQuery
- 프로젝트명변경
- 진열사랑
- DatePicker
- element위치
- 정규식
- setter
- border-collapse
- QueryDSL
- sumifs
- draw.io
- ul li로 테이블
- PostgreSQL
- Javascript
- devtools
- @ExceptionHandler
- object key
- 전후방탐색
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함
