2021-06-19
- 사전 준비
● pom.xml 추가 코드
<!-- 파일 입출력 라이브러리 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
스프링을 사용함에 있어 파일 업로드 라이브러리를 사전에 준비해 두어야 한다. 사용 라이브러리는 commons-io를 사용했으며, 해당 라이브러리 기준으로 설명한다.
● servlet-context.xml 추가 코드
<!-- MultipartResolver 설정 -->
<!-- 파일업로드 요청(multipart/form-data)을 처리하는 클래스(빈) -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 메모리에서 파일을 처리하는 최대 사이즈 제한 : 1MB -->
<beans:property name="maxInMemorySize" value="1048576"></beans:property>
<!-- 파일업로드 허용 최대 사이즈 제한 : 10MB -->
<beans:property name="maxUploadSize" value="10485760"></beans:property>
<!-- 파일업로드된 파일 당 최대 사이지 제한 : 5MB -->
<beans:property name="maxUploadSizePerFile" value="5242880"></beans:property>
<beans:property name="defaultEncoding" value="UTF-8" />
</beans:bean>
빈으로 CommonsMultipartResolver도 기본적으로 등록되어 있다는 전제가 필요하다. ( 위의 두 코드는 해당 파일에 붙여 넣기 하면 된다.)
- 로직 처리
아마 게시판이 삭제되면서 이미지를 제거해야 하거나 사용자 프로필 사진 삭제에 따른 디렉터리 내에서 해당 파일을 지워야 될 경우 이러한 고민을 하게 된다.
방법은 간단하다. 코드를 살펴보자.
//파일 경로 지정
String path = ServletContext.getRealPath("저장된 파일 경로");
//현재 게시판에 존재하는 파일객체를 만듬
File file = new File(path + "\\" + "저장된 파일 이름");
if(file.exists()) { // 파일이 존재하면
file.delete(); // 파일 삭제
}
우선 파일이 저장된 경로를 ServletContext를 통해서 지정해 준다. 이미 파일 업로드가 지정되었다면 해당 파일 업로드된 저장 폴더를 경로로 지정하면 될 것이다. 이후 file 객체를 만들어주는데, 지정된 경로와 해당 경로에서의 파일 이름을 넣어주면 file은 삭제하고자 하는 정보를 담고 있게 되고 이후 조건문을 통해 만약에 해당 파일이 존재하면 delete 메서드를 사용해 삭제해주면 된다.
지정된 파일 경로 ex) : "upload" , "file", "files"
저장된 파일 이름 ex): "hello.jpg", boardImg.getStoredName(), fileImg.getFileName
저장된 파일 이름은 문자열(String)로 저장되었다면, DTO 객체로 불러와도 가능하다.
DB데이터를 먼저 삭제할지 아니면 파일을 먼저 삭제할지 고민할 수도 있는데, DB 데이터를 먼저 지우면 저장된 이름을 가져오기 위해 따로 저장을 해두어야 하기 때문에 파일을 먼저 제거하고 DB데이터를 지우는 것을 추천한다.
메인 이미지 출처 : Photo by Fakurian Design on Unsplash