IT/development

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

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

클라이언트에서 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이 발생한다.

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

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

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

반응형