If at first you don't succeed, try again

[트러블슈팅] 게시물 작성에서 사진 업로드 시 발생했던 문제 본문

개발/트러블슈팅

[트러블슈팅] 게시물 작성에서 사진 업로드 시 발생했던 문제

웅지니어링 2025. 6. 4. 13:38

* 개요

정말 오랜만에 글을 쓴다. 왜 오랜만에 글을 쓰냐면...

사이드 프로젝트 2개를 동시에 진행하느라 블로그에 글을 쓸 여유가 없었다ㅜㅜ

사이드 프로젝트를 진행하면서 발생했던 문제들과 해결 과정을 적고자 한다.

먼저 가장 먼저 발생했던 문제는 사진 업로드였다.

 

* 문제 상황

@PostMapping
public ResponseEntity<PostResponse> createPost(
    @AuthenticationPrincipal CustomUserDetails userDetails,
    @RequestBody PostCreateRequest request,
    @RequestBody List<MultipartFile> imageFiles
) {
        PostResponse response = postService.create(userDetails, request, imageFiles);
        return ResponseEntity.ok(response);
}

게시글 작성 시 JSON 데이터와 사진의 파일 업로드를 동시에 진행해야 하는 상황이었는데 @RequestBody만으로는 해결할 수가 없었다.  @RequestBody로 사진 업로드를 하려고 하면 다음과 같은 에러가 발생한다.

org.springframework.http.converter.HttpMessageNotReadableException: 
Required request body is missing

 

* 원인

@RequestBody는 application/json 타입과 같은 JSON 요청 본문을 처리하기 위해 사용된다.

반면 multipart/form-data는 파일 업로드와 함께 텍스트 필드를 전송할 때 사용된다.

따라서 호환이 되지 않아 발생하는 에러였다.

 

* 해결 방법

@RequestBody 대신 @RequestPart라는 어노테이션을 사용했다.

@PostMapping
public ResponseEntity<PostResponse> createPost(
    @AuthenticationPrincipal CustomUserDetails userDetails,
    @RequestPart("request") PostCreateRequest request,
    @RequestPart(value = "imageFiles", required = false) List<MultipartFile> imageFiles
) {
        PostResponse response = postService.create(userDetails, request, imageFiles);
        return ResponseEntity.ok(response);
}

@RequestPart 는 multipart/form-data 타입의 특정 파트를 추출해서 바인딩하는 데에 사용된다.

MultipartFile이 포함되어 있는 경우, MultipartResolver가 동작하여 역직렬화를 하게 된다.