[꼼꼼한 개발자] 꼼코더

24. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller 파일 업로드 처리(commons-fileupload 라이브러리) 본문

Spring/코드로 배우는 스프링 웹 프로젝트

24. 코드로 배우는 스프링 웹 프로젝트 - [스프링 MVC의 Controller] - Controller 파일 업로드 처리(commons-fileupload 라이브러리)

꼼코더 2023. 1. 5. 01:44
반응형
 

🗳 파일 업로드 처리

Controller의 많은 작업을 스프링 MVC가 처리하기 때문에 개발자는 해야 하는 역할에만 집중할 수 있지만.

조금 신경써야 하는 부분이 파일 업로드 처리이다.

 

파일 업로드를 위해서는 전달되는 파일 데이터를 분석해야 한다

Servlet 3.0 이후(Tomcat 7.0)에는 별도에 추가 라이브러리가 필요하지 않는다

 

하지만 ‘Spring Legacy Project’로 생성되는 프로젝트는 Servlet 2.5를 기준으로 생성되므로

일반적으로 많이 사용하는 commons-fileupload 라이브러리를 추가하여 예제를 작성하겠다.


👨🏻‍💻 파일 업로드 실습( commons-fileupload 라이브러리 사용)

👨🏻‍💻 pom.xml 추가

이후 파일이 임시로 업로드될 폴더를 upload/tmp로 작성한다.

 

👨🏻‍💻 servlet-context.xml 설정

servlet-context.xml은 스프링 MVC의 특정한 객체(빈)를 설정해서 파일을 처리한다.

다른 객체(Bean)를 설정하는 것과 달리 파일 업로드의 경우에는 반드시 id 속성의 값을

‘multipartResolver’로 정확하게 지정해야 하므로 주의가 필요하다.

  • maxUploadSize : 한 번의 Request로 전달될 수 있는 최대의 크기를 의미.
  • maxUploadSizePerFile : 하나의 파일 최대 크기
  • maxInMemorySize : 메모리상에서 유지하는 최대의 크기를 의미
  • defaultEncoding : 업로드 하는 파일의 이름이 한글일 경우 깨지는 문제를 처리

 

👨🏻‍💻 SampleController 추가

SampleController에서는 get방식으로 파일을 업로드할 화면을 처리한다.

 

👨🏻‍💻 exUpload.jsp 추가

파일을 업로드 해볼 exUpload.jsp파일을 작성한다.

exUpload.jsp는 여러 개의 파일을 한꺼번에 업로드하는 예제이다.

 

💁🏻‍♂️ 결과

호출 : http://localhost:8080/sample/exUpload

exUpload.jsp의 action 속성값은 ‘sample/exUploadPost’로 작성되었으므로

이에 맞는 메서드를 SampleController에 추가한다.

 

👨🏻‍💻 SampleController 수정(추가)

스프링 MVC는 전달되는 파라미터가 동일한 이름으로 여러 개 존재하면 배열로 처리가 가능하므로

파라미터를 MultipartFile의 배열 타입으로 작성한다.

💁🏻‍♂️ 결과

호출 : http://localhost:8080/sample/exUpload -> 파일 선택 -> 제출

실제로 파일을 업로드 하면 아래와 같은 결과를 볼 수 있다.

현재 설정은 한 파일당 최대 크기가 2MB이므로 그보다 작은 크기의 파일을 업로드하여 테스트한다.

 
 

위의 그림에서 중간에 보이는 로그는 SampleController에서 업로드 정보가 올바르게 처리되는 것을 보여주고 있다.

최종 업로드를 하려면 byte []를 처리해야 하는데 예제는 아직 처리하지 않는 상태이다


☕️ Java 설정을 이용하는 경우

@Bean을 이용해서 처리하기는 하지만, id 속성을 같이 부여한다.

servlet-context.xml과 관련된 설정이므로 ServletConfig 클래스를 이용해서 처리한다.


🧹 최종 정리

  • 파일 업로드를 위해서는 전달되는 파일 데이터를 분석해야 한다
  • 다른 객체(Bean) 설정과 달리 파일 업로드의 경우 반드시 id 속성의 값을 ‘multipartResolver’로 정확하게 지정한다.
  • 스프링 MVC는 전달되는 파라미터가 동일한 이름으로 여러 개 존재하면 배열로 처리가 가능하다.
  • 위에 예제는 리턴 타입이 void이기 때문에 경로와 같은 jsp를 찾아 보여준다.

 

 

 
 
Comments