전에 올린 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이 잘 체크되어있는지 확인한다.
'Spring' 카테고리의 다른 글
[Spring] @Transactional의 Transaction Propagation (0) | 2023.03.08 |
---|---|
@Valid exception handling (with BindException) (1) | 2022.11.29 |
DTO와 MultipartFile 요청하기 (415 Unsupported Media Type 해결) (0) | 2022.11.28 |
[Spring] 빈 스코프 (0) | 2022.09.17 |
[Spring] 빈 생명주기 콜백 (1) | 2022.09.17 |