Spring

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

soro.k 2022. 11. 28. 15:11

 

전에 올린 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이 잘 체크되어있는지 확인한다.