IT/development

[spring] vo와 multipartFile 동시에 서버로 전송(feat.@RequestPart)

알 수 없는 사용자 2023. 2. 8.
반응형

클라이언트에서 JSON 타입의 데이터와 멀티파트 형식 파일을 동시에 전달 받는 방법을 기록한다.

Controller에서 JSON타입의 데이터를 vo로 받고 멀티파트 형식 파일을 받아서 로그만 찍어보겠다.

controller

package study.lsyrestapitest1.controller.api;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import study.lsyrestapitest1.domain.vo.UserVo;

@RestController
@Slf4j
@RequestMapping(value = "/v1/test1")
public class TestController {
    
    @PostMapping(value = "")
    public void create(@RequestPart(value = "file")MultipartFile file, @RequestPart(value = "userInfo") UserVo userVo, Model model) {
        log.info("userInfo => {}, fileInfo => {}", userVo, file.getOriginalFilename());
    }
}

다른 방법도 있겠지만 vo와 MultipartFile 형식의 파일을 @RequestPart로 선언한다.

사용자 객체와 파일 원본이름을 로그로 찍었다.

이제 postman에서 호출을 한 뒤 제대로 값이 찍히는지 보겠다.

Body > form-data(multipart 타입을 보내야 되기 때문)에 key에 컨트롤러에서 parameter로 받는 이름을 적는다.

key 우측에서 Text와 File을 선택할 수 있다.

파일은 "file"로 선언했고 사용자 데이터는 "userInfo"로 선언했다.

다른 이름으로 선언하면 MissingServletRequestPartException: Required request part 'userInfo' is not present가 보일거다.

userInfo의 CONTENT TYPE은 JSON이니까 application/json로 선언 후 아래처럼 JSON 형식으로 작성한다.

{
	"userName": "thor",
	"userEmail": "thor@naver.com"
}

application/json 선언 안하면 HttpMediaTypeNotSupportedException이 발생한다.

이제 준비는 끝났고 호출 하면 아래처럼 서버에 로그가 찍힌다.

내가 원하는 값이 제대로 찍혔다.

이제 내가 원하는데로 저 값들을 요리하면 된다.

반응형

댓글

💲 추천 글