스프링

MultipartFile With Json

winwin-k9 2023. 4. 3. 02:31

API 에서 Json 과 MultipartFile 을 한번에 전달받는 방법은 무엇이 있을까?

바로 MultipartFile을 사용하는 것이다.

 

다음의 값들을 한번에 전달받아야 한다고 가정한다.

1. 이름
2. 나이
3. 이미지

 

@Getter
@ToString
public class CharacterCreateRequest {
    private String name;
    private Long age;
    private MultipartFile image;
}

그렇다면, 위 vo 를 사용한 Post API 가 다음과 같을 때

@RestController
@Slf4j
public class TestController {

    @PostMapping("/api/v1/character")
    public void saveCharacter(@RequestBody CharacterCreateRequest request) {
    ...
    }
}

과연 Json으로 요청을 받는 것이 가능할까?

정답은 당연히 불가능이다.


@RequestBody 는 데이터 형식을 JSON 형태로 전달받기 때문에. 
단순히 vo 내부에 MultipartFile 형태의 필드를 추가했다고해서 해당 값을 @RequestBody 형태로 전달 받을 수 는 없다.

이때는 @RequestPart를 사용해야 한다.

 

기존 vo 내부에 존재하던 MultipartFile 필드를 제거하고

@Getter
@ToString
public class CharacterCreateRequest {
    private String name;
    private Long age;
}

API 를 @RequestPart 를 사용해 다음과 같이 변경한다. 

@RestController
@Slf4j
public class TestController {

    @PostMapping(value = "/api/v1/character", onsumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE})
    public void saveCharacter(@RequestPart CharacterCreateRequest request,
                              @RequestPart MultipartFile imgFile) {
      ...
    }
}

위와 같은 형태를 사용하면 하나의 API 에서Json 과 MultipartFile 을 한번에 전달받을 수 있다.
특이점으로는 API 에서 consume  MediaType 을 지정해줘야 한다는 점 이다. 

만약 적절한 MediaType 을 지정하지 않을 경우
415 Unsupported MediaType ERROR 가 발생한다. 

728x90