진짜 개발자
본문 바로가기

FrameWork/Spring MVC

Spring MVC - 유연한 다중 파일업로드 핸들러 만들기 (Multipart upload)

다중파일

안녕하세요, 이번 포스팅에서는 Spring MVC를 이용해 웹사이트 구축시 다중파일 업로드를 구현해야하는 상황에서, 발생했던 간단한 팁을 알아보려고 합니다.

 

 

 

유연한 다중파일 업로드 핸들러

1. 일반적인 파일 업로드 핸들러

 

일반적인 경우 다중파일 업로드를 위해서 위와 같이 핸들러를 만들게 됩니다. 중요한 점은 RequestParam(key)의 괄호안의 key값과, form을 이용해 파일을 업로드할때의 key값이 일치해야 한다는 점입니다.

 

그러면, @RequestParam의 괄호 안에 적힌 (file1, file2)에 사용자가 form을 통해 업로드하는 파일들이 각각 맵핑됩니다. (Postman을 이용해 form을 제출했습니다.)

 

 

문제점

위에서 구현한 핸들러는 두가제 문제를 안고있습니다.

  1. 업로드할 파일의 수가 변경된다면, 핸들러를 같이 수정해야 합니다.
  2. 업로드하는 사용자가 form에 file key값을 다르게 입력할 시 핸들러에서 파일을 제대로 받지 못하는 에러가 발생할 수 있습니다.

 

 

 

 

 

2. Map을 이용한 유연한 다중파일 업로드 핸들러 구현

앞선 핸들러는 변경에 상당히 취약한 구조를 취하고 있습니다. 그렇다면 변경하는 부분을 캡슐화하여 유연한 핸들러를 만들어야겠죠 ?

 

 

방법은 상당히 간단합니다. Spring에서는 이미 업로드되는 파일의 키, 파일쌍을 Map으로 변환하는 Converter를 구현하고 있기 때문에, 다중 파일 업로드시, @RequestParam에 Maping될 매개변수로 Map<String, MultipartFile>을 사용하면 됩니다.

 

마찬가지로 Postman을 이용해 form제출 테스트를 합니다. 중요한 점은 key값은 클라이언트가 임의대로 해도 된다는점과, file의 수가 몇개든지 핸들러에서 처리가 가능하다는 점입니다.

 

성공입니다.




*3. Client에서 이미지파일을 업로드할때의 규격 (ex . javascript)

{
uri: imageUri
type: 'image/jpg',
name: 'image.png'
}

클라이언트 측에서 요청할때, 업로드한 image를 MultiparFile로 올바르게 맵핑되기 위해서는, 각각의 image가 위의 형식을 준수해야 합니다.


const formData = new FormData();


formData.append("image1": {

uri: imageUri

type: 'image/jpg',
name: 'image.png'

);


fetch(SERVER_URI, {

method: "POST",

body: formData

});

javascript에서 image를 업로드하는 코드입니다.