개발이좋아

[Spring] 게시판 파일 업로드 본문

카테고리 없음

[Spring] 게시판 파일 업로드

noobdev 2020. 2. 15. 16:36

스프링에서는 파일 업로드 기능 구현을 매우 간단하게 처리할 수 있다.

 

파일 업로드 기능을 구현을 하기 위한 순서는 아래와 같다.

  1. JSP파일에서 form태그로 업로드 기능 구현
  2. VO클래스 수정
  3. FileUpload 라이브라리 추가
  4. MultipartResolver <Bean> 등록
  5. 파일 업로드 처리

 


(1) JSP파일에서 form태그로 업로드 기능 구현

게시판에서 파일을 업로드하는 첫 부분을 구현하는 단계이다.

input 태그의 파일 속성으로 파일을 업로드할 버튼을 만든다.

See the Pen BaNKBKZ by ParkChanYang (@dudwk814) on CodePen.

이 때 주의해야 할 점은 form 태그의 enctype 속성을 추가하고 속성 값은 multipart/form-data로 지정해야 한다.

 


(2) VO클래스 수정

두 번째로 할 일은 커맨드 객체인 VO클래스를 수정하는 일이다.

첫 단계에서 파일 업로드 버튼을 만들 때 사용한 input 태그의 name 값과 같은 이름으로 VO 객체의 속성을 추가한다.

이때 중요한 점은 변수의 타입은 MultipartFile 타입이 여야 한다.

변수를 선언했다면 setter/getter 메서드를 추가해주면 된다.

 

setter 메서드를 추가했다면 사용자 요청이 들어왔을 때 VO객체가 커맨드 객체이기 때문에 스프링 컨테이너에서 자동으로 setter 메서드를 호출하여 VO객체에 값을 세팅한다.

 


(3) FileUpload 라이브러리 추가

pom.xml에 Apache에서 제공하는 Common FileUpload 라이브러리를 추가한다.

<!-- 파일업로드 -->
<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3.1</version>
</dependency>

라이브러리를 추가 후 Maven Dependencies에 라이브러리(commons-fileupload-1.31.jar , commons-io-2.2.jar)가 잘 추가되었는지 확인한다.

 


(4) MultipartResolver <Bean> 등록

라이브러리까지 추가했다면 스프링 설정 파일에 MultipartResolver를 빈으로 등록하는 작업을 해야 한다.

MultipartResolver를 빈으로 등록하는 이유는 위에서 VO클래스에 선언한 MultipartFile타입의 변수에 대한 setter 메서드 때문인데 VO객체는 커맨드 객체이므로 스프링에서 생성하고 비즈니스 메서드의 매개변수로 넘겨준다.

이때 MultipartFile 타입의 setter 메서드를 호출하기 위해서는 MultipartFile의 객체가 먼저 생성이 되어 있어야 한다.

그리고 스프링은 MultipartResolver 객체가 없다면 MultipartFile 객체를 생성하지 못하기 때문에 스프링 설정 파일에 MultipartResolver를 빈으로 등록해 주어야 한다.

 

<!-- 파일 업로드 설정 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<property name="maxUploadSize" value="100000" />
</bean>

빈으로 등록 시 주의할 점은 다른 빈 등록과는 다르게 CommonsMultipartResolver의 id값이 정해져 있다는 것이다.

이는 DispatcherServlet이 특정 id값을 CommonsMultipartResolver 클래스로 인식하기 때문이다.

 

대부분의 Resolver로 끝나는 객체는 id값이 정해져 있다.

 

또 한 property 태그로 설정된 maxUploadSize는 업로드할 파일의 최대 크기를 정하는 속성으로 이 속성을 따로 지정해주지 않는다면 기본 값이 -1이 된다.

-1은 파일의 크기를 무제한으로 하라는 의미이다.

 

 


(5) 파일 업로드 처리

위의 설정까지 완료했다면 비즈니스 로직에서 파일 업로드 처리를 할 차례이다.

위에서 VO객체에 jsp에서 넘겨주는 값을 저장하기 위한 변수의 타입을 MultipartFile로 지정했다.

이 MultipartFile로 파일의 업로드 로직을 구현하며 주요 메서드는 아래와 같다.

 

※ MultipartFile의 주요 메서드

메서드 설명
String getOriginalFilename( ) 업로드한 파일명을 문자열로 리턴
void transferTo(File destFile) 업로드한 파일을 destFile에 저장
boolean isEmpty( ) 업로드한 파일 존재 여부 (없으면 true 리턴)

위의 3가지의 메서드로 파일 업로드를 구현할 수 있다.

 

	// 글 등록
	@RequestMapping("/insertBoard.do")
	public String insertBoard(BoardVO vo) throws IOException{
		// 파일 업로드 처리
		MultipartFile uploadFile = vo.getUploadFile();
		if(!uploadFile.isEmpty()) {
			String fileName = uploadFile.getOriginalFilename();
			uploadFile.transferTo(new File("D:/" + fileName));
		}
        
        // 비즈니스 로직 처리
		boardService.insertBoard(vo);
		return "getBoardList.do";
	}

위의 코드는 MultipartFile 타입의 uploadFile에 커맨드 객체인 vo에 설정된 업로드 파일의 정보를 저장한 후,

업로드한 파일이 있다면 transferTo( ) 메서드를 이용해 업로드하는 코드이다.

 

위의 코드까지 적용했다면 파일 업로드 구현은 끝이다.

JSP 화면에서 업로드할 파일을 선택하고 submit 버튼을 클릭하면 transferTo( ) 메서드에 지정한 경로에 파일이 업로드된 것을 확인할 수 있다.

 

 

 

본 포스팅은 필자가 공부한 내용을 정리한 것으로 오류가 존재할 수 있습니다.
참고 : 스프링 퀵 스타트
Comments