본문 바로가기
Spring

MultipartFile이 있는 DTO 요청하기 (404 Bad Request 해결)

by soro.k 2022. 11. 28.

 

전에 올린 DTO와 MultipartFile을 같이 요청하는 기능을 구현한 이후에 게시물 수정 기능도 구현하다 보니 MultipartFile을 계속 파라미터로 따로 받는 것보다 DTO로 한꺼번에 받는 게 나을 것 같아서 변경하기로 결정했다. 

 

 

변경하기 전

 

PostDTO

public class PostDTO {
	@Getter
    @Builder
    public static class UpdateRequest {

        private String title;

        private String content;

        private List<MultipartFile> multipartFiles;

    }
}

 

Contoller

@PostMapping(value = "/post")
public ResponseEntity<Long> savePost(@RequestBody PostDTO.SaveRequest dto) {
    return ResponseEntity.ok(postService.savePost(dto));
}

 

처음에는 DTO에 기존 코드 그대로 @RequetBody 어노테이션을 뒀었다.

이 어노테이션은 Header에 있는 Content-Type을 보고 converter를 이용해서 맞는 타입의 객체로 변환을 하는데 multipart/form-data 형식의 데이터는 받을 수가 없다. 

 

그렇다면 @RequestPart는 원하는대로 DTO 데이터를 다 받을 수 있을까?

 

결과적으로 다음 화면과 같이 400 Bad Request를 만나게 되면서 기존에 사용했던 두 어노테이션 모두 사용할 수 없다.

@PostMapping(value = "/post")
public ResponseEntity<Long> savePost(@RequestPart PostDTO.SaveRequest dto) {
    return ResponseEntity.ok(postService.savePost(dto));
}

 

 

변경한 이후

 

그래서 DTO 앞에 어노테이션을 생략해서 default 어노테이션인 @ModelAttribute 가 적용될 수 있게 했다.

@PostMapping(value = "/post")
public ResponseEntity<Long> savePost(PostDTO.SaveRequest dto) {
    return ResponseEntity.ok(postService.savePost(dto));
}

 

요청을 보낼 때의 Postman 데이터 설정은 다음과 같다.

 

 

✨ Tip

이렇게 했을 때 혹시나 DTO 값이 모두 null로 전달된다면 [Headers] 탭의 Content-Type이 잘 체크되어있는지 확인한다.