문제
Spring Boot 백엔드에서 multipart/form-data 요청 처리 시, 아래와 같은 에러가 발생
org.springframework.web.HttpMediaTypeNotSupportedException:
Content-Type 'multipart/form-data;boundary=--dio-boundary-0131634832;charset=UTF-8'
- @RequestBody와 multipart/form-data의 비호환성:
- @RequestBody는 JSON 데이터를 처리하는 데 사용되며 multipart/form-data 요청과 호환되지 않음.
- multipart/form-data는 파일과 텍스트 필드를 함께 처리하는 특별한 Content-Type으로 @RequestPart 또는 @RequestParam이 필요함.
해결 방법
1. 컨트롤러 수정
@ModelAttribute를 사용하여 multipart 요청의 데이터를 처리함으로써 JSON과 파일 데이터를 DTO 객체로 매핑할 수 있었습니다.
@PostMapping(GlobalURI.POSTING_ROOT_URI)
public ResponseEntity<RequestResultDto> registerPosting(
@ModelAttribute RegisterPostingRequest requestDto,
@AuthenticationPrincipal String userId) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(postingService.registerPosting(requestDto, userId));
}
2. Spring 설정 확인
multipart/form-data 요청을 처리하려면, Spring Boot의 MultipartResolver 설정이 올바르게 구성되어 있어야 합니다.
application.yml 설정
spring:
servlet:
multipart:
enabled: true
max-file-size: 10MB
max-request-size: 10MB
추가 개념 설명
@ModelAttribute란?
- Spring MVC에서 요청 데이터를 객체로 매핑하는 데 사용.
- 기본적으로 HTTP 요청의 파라미터를 매핑하며 multipart/form-data 요청도 지원.
@ModelAttribute와 Multipart
- multipart/form-data 요청에서 파일(MultipartFile)과 텍스트 필드를 DTO에 한 번에 매핑할 수 있는 강력한 방법.
- 텍스트 데이터는 HTTP 요청의 폼 필드에서 파일 데이터는 MultipartResolver를 통해 처리.