📌1. @RequestPart란?
@RequestPart는 멀티파트 요청 (multipart request) 에서 특정 파일이나 JSON 데이터를 개별적으로 매핑할 때 사용되는 Spring MVC의 어노테이션입니다.
2. @RequestParam vs @RequestBody vs @RequestPart 차이점
어노테이션 사용 대상 주요 목적 Content-Type
@RequestParam | 단순 파라미터 (쿼리 스트링, 폼 데이터) | 기본 데이터 타입 (String, int 등) 전송 | application/x-www-form-urlencoded |
@RequestBody | JSON 요청 본문 | 객체로 변환 (DTO 등) | application/json |
@RequestPart | 멀티파트 요청 (파일 + JSON) | 파일과 JSON 데이터를 함께 받기 | multipart/form-data |
3. @RequestPart 사용 예제
📌 파일과 JSON 데이터를 동시에 받는 경우
@RestController
@RequestMapping("/posts")
public class PostController {
@PostMapping("/write")
public ResponseEntity<String> writePost(
@RequestPart("postDto") PostDto postDto, // JSON 데이터
@RequestPart(value = "file", required = false) MultipartFile file // 파일 (선택)
) {
log.info("게시글 작성: {}", postDto);
if (file != null) {
log.info("첨부된 파일: {}", file.getOriginalFilename());
}
return ResponseEntity.ok("게시글 작성 완료!");
}
}
요청 예시 (Postman)
multipart/form-data로 요청
POST /posts/write
Content-Type: multipart/form-data
postDto: {"title": "Hello", "content": "This is a post"}
file: (image.jpg 첨부)
📌 Spring은 postDto를 JSON으로 변환하고, file을 MultipartFile로 처리.
4. @RequestPart가 필요한 이유
@RequestBody로 JSON과 파일을 동시에 받을 수 없는 문제
@PostMapping("/write")
public ResponseEntity<String> writePost(@RequestBody PostDto postDto, MultipartFile file) {
// ❌ 실행되지 않음: @RequestBody는 JSON 요청만 처리할 수 있음
}
- @RequestBody는 Content-Type: application/json을 기대하기 때문에 multipart/form-data를 처리하지 못함
- 파일과 JSON을 동시에 받으려면 @RequestPart를 사용해야 함
정리
- @RequestPart는 multipart/form-data 요청에서 파일과 JSON 데이터를 함께 처리할 때 사용
- @RequestParam과 달리 JSON 데이터를 DTO로 변환 가능
- @RequestBody는 application/json에서만 동작하므로 멀티파트 요청과 함께 사용할 수 없음
- @RequestPart(value = "file", required = false)로 파일을 선택적으로 받을 수도 있음
즉, @RequestPart는 파일과 JSON을 동시에 받아야 할 때 가장 적절한 방법!
'Spring' 카테고리의 다른 글
Spring Security + JWT (1) | 2025.02.21 |
---|---|
Ports and Adapter 패턴 (Hexagonal) (0) | 2025.02.17 |
열어봐요 @RequestBody로 데이터 받는 과정 (0) | 2025.02.10 |
@RequestBody 와 <form> 태그 (0) | 2025.02.05 |
Spring Pageable 안 쓰면 바보 (1) | 2025.01.31 |