Chef.Yeon
Code Cook
Chef.Yeon
전체 방문자
오늘
어제
  • 분류 전체보기 (230)
    • 게임 개발 (1)
      • Unity (1)
    • Android (27)
      • Kotlin (19)
      • 우아한테크코스 5기 (4)
    • Language (11)
      • 파이썬 (3)
      • Java (7)
    • DB (2)
      • SQL (16)
    • Spring (25)
    • 코딩테스트 (56)
    • Git (1)
    • TIL (85)
    • DevOps (6)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • kotlin
  • 안드로이드
  • 문자열
  • 에라토스테네스의 체
  • 레포지토리
  • MariaDB
  • til
  • 코딩테스트
  • 다이나믹 프로그래밍
  • grafana
  • Wil
  • enum
  • 프로그래머스
  • 코틀린
  • Android
  • 파이썬
  • ec2
  • rsocket
  • Docker
  • kibana
  • spring
  • 우아한테크코스
  • 백준
  • webflux
  • SQL
  • elasticsearch
  • java
  • 프리코스
  • 코틀린 인 액션
  • 내림차순

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Chef.Yeon

Code Cook

[TIL - 20230513] 게시글 수정(썸네일 변경 포함)을 위한 MutipartFile과 Dto 함께 받기
TIL

[TIL - 20230513] 게시글 수정(썸네일 변경 포함)을 위한 MutipartFile과 Dto 함께 받기

2023. 5. 14. 04:21

 

💻문제점

게시글 작성과 이미지 업로드를 위해 MultipartFile과 dto를 함께 받아야할 일이 생겼다. @RequestBody와 @RequestParam을 사용해서 데이터를 받으려고 했다. 하지만 실패!

public ResponseDto<?> updatePostStory(@PathVariable Long id,
                                      @Valid @RequestBody PostInfoRequestDto postInfoRequestDto,
                                      @RequestParam(value="ghumbnail") MultipartFile image) {
    return postService.updatePostInfo(id, postStoryRequestDto, image);
}

📃시도

1. PostInfoRequestDto 클래스에 MultipartFile 프로퍼티 추가하여 @ModelAttribute 애노테이션을 사용했다.

public ResponseDto<?> updatePostStory(@PathVariable Long id,
                                      @ModelAttribute PostInfoRequestDto postInfoRequestDto) {
    return postService.updatePostInfo(id, postStoryRequestDto, image);
}
@Getter
public class PostInfoRequestDto {
    @Size(max = 40, message = "{title}")
    @NotBlank
    private String title;

    @Size(min = 500000, max = 100000000, message = "{targetAmount}")
    private int targetAmount;

    @Size(min = 1000, message = "{price}")
    private int price;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
    @Future(message = "{future}")
    private LocalDate deadLine;

    private List<String> searchTag = new ArrayList<>();

    private MultipartFile thumbnail;
}

 

포스트맨에서 다음과 같이 요청했다.

 

오류가 안 나길래 되는줄 알았는데, 확인해보니 값들이 변경되지 않고 null이다...


🔍해결

@RequestPart 애노테이션을 사용했다. key가 postInfo이고 value는 PostInfoRequestDto 클래스에 해당하는 Json이 들어가게 된다.

@PutMapping(value = "/{id}/info", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseDto<?> updatePostIndo(@PathVariable Long id,
                                     @Valid @RequestPart(value = "postInfo") PostInfoRequestDto postInfoRequestDto,
                                     @RequestPart(value="thumbnail", required = false) MultipartFile multipartFile) {
    return postService.updatePostInfo(id, postInfoRequestDto, multipartFile);
}

 

@Getter
public class PostInfoRequestDto {
    @Size(max = 40, message = "{title}")
    @NotBlank
    private String title;

    @Size(min = 500000, max = 100000000, message = "{targetAmount}")
    private int targetAmount;

    @Size(min = 1000, message = "{price}")
    private int price;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
    @Future(message = "{future}")
    private LocalDate deadLine;

    private List<String> searchTag = new ArrayList<>();
}

 

다음과 같이 dto 클래스에 맞는 Json 데이터를 value로 가지고 있다.

 

DB도 확인해 봤더니, 정상적으로 반영되었고, S3에도 이미지가 업로드 되었다.

 

프론트에서 요청은 다음과 같이 했다.

  const onClickSaveStory = async (event) => {
    event.preventDefault();
    const formData = new FormData();

    const storyData = {
      summary: summary,
      storyBoard: storyBoard,
    };

    formData.append("projectImage", file); // assuming selectedFile is your file input

    formData.append(
      "postStory",
      new Blob([JSON.stringify(storyData)], {
        type: "application/json",
      })
    );
    try {
      await jwtInstance.put(`/posts/${id}/story`, formData, {
        headers: {
          "Content-Type": "multipart/form-data",
        },
      });
    } catch (error) {
      console.error(error);
    }
  };

 

https://yeon-dev.tistory.com/188

 

[Spring] @RequestPart 사용하여 MultipartFile과 Dto 함께 받기, Postman 테스트

글을 작성한다고 할때, 제목, 내용을 작성할 수 있다면 다음과 같이 Controller와 dto클래스를 작성할 수 있을 것이다. @PostMapping("/post") public ResponseDto savePost(@Valid @RequestBody PostRequestDto postRequestDto, @Au

yeon-dev.tistory.com

 

728x90

'TIL' 카테고리의 다른 글

[TIL - 20230515] 게시글 제목과 태그에 검색어를 포함하는 게시글 조회  (0) 2023.05.16
[TIL - 20230515] @ReqeustParam enum 타입 받기  (0) 2023.05.15
[TIL - 20230510] Service 유효성 검사 메서드 분리  (0) 2023.05.11
[TIL - 20230506] 회원/비회원 전체 게시글 조회 처리  (0) 2023.05.06
[TIL - 202030504] WebSocket+Stomp 채팅방에 직접 참여하지 않은 사용자 구독시키기2 + 자잘한 문제점 해결  (0) 2023.05.04
    'TIL' 카테고리의 다른 글
    • [TIL - 20230515] 게시글 제목과 태그에 검색어를 포함하는 게시글 조회
    • [TIL - 20230515] @ReqeustParam enum 타입 받기
    • [TIL - 20230510] Service 유효성 검사 메서드 분리
    • [TIL - 20230506] 회원/비회원 전체 게시글 조회 처리
    Chef.Yeon
    Chef.Yeon
    보기 좋고 깔끔한 코드를 요리하기 위해 노력하고 있습니다.

    티스토리툴바