Backend/Spring Framework

[Spring Boot] Multipart 객체 솎아보기

mopil 2022. 8. 29. 21:59
반응형

# 서론

multipart/form-data 로 데이터를 서버로 전송할때, 스프링에서 제공하는 객체인 Multipart 객체를 활용해야한다.

이번 글에서는 해당 객체를 다룰때 알면 좋을 법한 것들을 정리한다.

 

# Multipart 전송 메소드

multipart/form-data 는 POST 와 PUT 만 가능하니 유의한다.

 

# 한개, 여러개 Multipart 받기

@PostMapping("/one")
fun one(@RequestParam("file") file: MultipartFile) {
    
}

@PostMapping("/more")
fun more(@RequestParam("files") file: List<MultipartFile>) {

}

컨트롤러단에서는 이런식으로 받아서 처리하면 된다. 여기서 file과 files는 multipart/form-data의 키값이다.

 

복수 파일은 동일한 키 이름으로 올리면 된다.

 

# 복합적인 Multipart 받기

간혹 Request DTO에 문자열과, 파일을 동시에 받아서 처리하고 싶은 경우가 있다. 이럴땐 DTO를 이렇게 제작한다.

data class AdminImageRequest(
    var where: String,
    var file: MultipartFile,
)

이때 변수이름 (여기서는 file)이 multipart/form-data의 키값이 된다.

 

그리고 컨트롤러 단에서는 @ModelAttribute를 이용해서 받아준다.

@PostMapping("/image")
fun updateOthers(@ModelAttribute form: AdminImageRequest){
	// ... 비즈니스 로직
}

 

서버는 이렇게 받으면 되고, 클라이언트 단에서는 Multipart 종류에는 Text 와 File 두개가 있는데, 문자열은 Text로, File은 파일로 넣어서 보내면 된다.

 

포스트맨 예제는 다음과 같다.

KEY 에 Text, File을 설정할 수 있다.

 

# Multipart 비어있음 검사

Multipart를 꼭 첨부하고 싶지 않을 수도 있다. 이런 경우 

data class AdminImageRequest(
    var where: String,
    var file: MultipartFile? = null,
)

이런식으로 받을 수 있을 것 같지만, 스프링에서는 Multipart가 비어있어도, 한번 객체로 감싸서 보내준다.

즉, 위 코드로 null 체크를 시도하면 동작하지 않는다.

 

Multipart를 꼭 첨부하고 싶지 않다는 말은 포스트맨 예제로 보면 아래와 같다.

 

구체적으로 KEY는 있는데 파일이 비어있는 경우를 말한다.

이 경우, Multipart 에서 제공하는 isEmpty() 메서드로 비어있음을 체크할 수 있다.

반응형