modifyMember(@Validated @ModelAttribute WebMemberModifyRequestDto dto, @PathVariable("memberSeq") long memberSeq) { try { return new ResponseEntity<>(memberModifyService.modifyMember(memberSeq, dto.convertToServiceDto()), HttpStatus.OK); } catch (IllegalArgumentException e) { return new ResponseEntity<>("요청 값을 다시 확인해주세요.", HttpStatus.BAD_REQUEST); } catch (NotMatchMemberException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } } "> modifyMember(@Validated @ModelAttribute WebMemberModifyRequestDto dto, @PathVariable("memberSeq") long memberSeq) { try { return new ResponseEntity<>(memberModifyService.modifyMember(memberSeq, dto.convertToServiceDto()), HttpStatus.OK); } catch (IllegalArgumentException e) { return new ResponseEntity<>("요청 값을 다시 확인해주세요.", HttpStatus.BAD_REQUEST); } catch (NotMatchMemberException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } } "> modifyMember(@Validated @ModelAttribute WebMemberModifyRequestDto dto, @PathVariable("memberSeq") long memberSeq) { try { return new ResponseEntity<>(memberModifyService.modifyMember(memberSeq, dto.convertToServiceDto()), HttpStatus.OK); } catch (IllegalArgumentException e) { return new ResponseEntity<>("요청 값을 다시 확인해주세요.", HttpStatus.BAD_REQUEST); } catch (NotMatchMemberException e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); } } ">
 @PutMapping("/{memberSeq}")    public ResponseEntity<?> modifyMember(@Validated @ModelAttribute WebMemberModifyRequestDto dto, @PathVariable("memberSeq") long memberSeq) {
        try {
        return new ResponseEntity<>(memberModifyService.modifyMember(memberSeq, dto.convertToServiceDto()), HttpStatus.OK);
        } catch (IllegalArgumentException e) {
            return new ResponseEntity<>("요청 값을 다시 확인해주세요.", HttpStatus.BAD_REQUEST);
        } catch (NotMatchMemberException e) {
            return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
        }
    }

// 멤버 정보 수정
@Multipart
@PUT("members/{memberSeq}")
suspend fun memberModify(
    @Path("memberSeq") memberSeq: Long,
    @Query("nickname") nickname: String,
    @Part image: MultipartBody.Part?,
    @Part background: MultipartBody.Part?,
    @Query("profileMessage") profileMessage: String?
): Response<Boolean>

image와 background 둘다 null을 넣고 API 호출 시

“Multipart body must have at least one part” 라는 오류 발생

null을 하나 보내는 것은 되지만 두 개를 보낼때 해당 문제 발생

// 멤버 정보 수정
@Multipart
@PUT("members/{memberSeq}")
suspend fun memberModify(
    @Path("memberSeq") memberSeq: Long,
    @Query("nickname") nickname: String,
    @Part image: MultipartBody.Part?,
    @Query("profileMessage") profileMessage: String?
): Response<Boolean>

// 멤버 정보 수정
@PUT("members/{memberSeq}")
suspend fun memberModify(
    @Path("memberSeq") memberSeq: Long,
    @Query("nickname") nickname: String,
    @Query("profileMessage") profileMessage: String?
): Response<Boolean>

background 부분을 지우고 API를 호출하면 Json 값이기 때문에 background가 안들어와있을 때 알아서 null로 처리하고 매핑되는 것으로 확인

이미지 둘다 없는 경우도 따로 만들어주어 처리