문제

Spring Boot 백엔드에서 multipart/form-data 요청 처리 시, 아래와 같은 에러가 발생

org.springframework.web.HttpMediaTypeNotSupportedException:
Content-Type 'multipart/form-data;boundary=--dio-boundary-0131634832;charset=UTF-8'
  1. @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를 통해 처리.

+ Recent posts