java, spring

[Spring] 잘못 업로드된 파일 삭제 2 [Quartz, cron, @EnableScheduling, @Scheduled]

isaac.kim 2021. 9. 4. 13:11
728x90
반응형

[Spring] 잘못 업로드된 파일 삭제 2 [Quartz, cron, @EnableScheduling, @Scheduled]

이전 글

2021.09.04 - [Spring] - [Spring] 잘못 업로드된 파일 삭제 1 [Quartz, cron, @EnableScheduling, @Scheduled]

 

이 글은 이전 글 내용에 이어서 작성한 글입니다.


잘못 업로드된 파일 삭제

파일 목록 처리

 

작업 순서

1. 데이터베이스에서 어제 사용된 파일의 목록을 얻어오고

2. 해당 폴더의 파일 목록에서 데이터베이스에 없는 파일을 찾습니다.

3. 데이터베이스에 없는 파일을 삭제합니다.

 

FileCheckTask 클래스

package com.project.task;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.project.domain.BoardAttachVO;
import com.project.mapper.BoardAttachMapper;


import lombok.Setter;
import lombok.extern.log4j.Log4j;

@Log4j
@Component
public class FileCheckTask {
	
	@Setter(onMethod_ = { @Autowired} )
	private BoardAttachMapper attachMapper;
	
	private String getFolderYesterday() { 
		SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		String str = sdf.format(cal.getTime());
		return str.replace("-", File.separator);
	}
	
	@Scheduled(cron="0 0 2 * * *")
	//@Scheduled(cron="0,5,10,15,20,25,30,35,40,45,50 * * * * *")
	public void checkFiles() throws Exception{
		log.warn("File Check Task run .....");
		log.warn(new Date());
		// file list in database
		List<BoardAttachVO> fileList = attachMapper.getOldFiles();
		
		// ready for check file in directory with database file list
		List<Path> fileListPaths = fileList.stream()
				.map(vo->Paths.get("C:\\storage", 
						vo.getUploadPath(),vo.getUuid()+"_"+vo.getFileName()))
				.collect(Collectors.toList());

		// image file has thumnail file
		fileList.stream().filter(vo -> vo.isFileType() == true)
			.map(vo->Paths.get("C:\\storage",vo.getUploadPath(),"s_"+vo.getUuid()+"_"+vo.getFileName()))
			.forEach(p->fileListPaths.add(p));
		log.warn("==============================");
		fileListPaths.forEach(p->log.warn(p));
		
		//files in yeserday directory
		File targetDir = Paths.get("C:\\storage", getFolderYesterday()).toFile();
		File[] removeFiles = 
				targetDir.listFiles(file->fileListPaths.contains(file.toPath())==false);
		log.warn("------------------------------");
		for(File file : removeFiles) {
			log.warn(file.getAbsolutePath());
			file.delete();
		}
		
	}
}

 

FileCheckTask의 checkFiles( )는 매일 새벽 2시에 동작합니다.

attachMapper를 이용해 어제 날짜로 보관되는 모든 파일 목록을 가져옵니다. DB에서 가져온 파일 목록은 BoardAttachVO 타입 객체이므로, 나중에 비교를 위해서 java.nio.Paths의 목록으로 변환합니다. 이때 이미지 파일의 경우 썸네일 파일 목록도 필요하기 때문에 별도로 처리해서 해당 일의 예상 파일 목록을 완성합니다. 코드에서는 fileListPaths라는 이름의 변수로 처리합니다.

 

DB에 있는 파일들의 준비가 끝나면 실제 폴더에 있는 파일의 목록에서 DB에 없는 파일들을 찾아서 목록으로 준비합니다. 이 결과는 removeFiles 변수에 담아 처리합니다. 최종적으로는 삭제 대상이 되는 파일들을 삭제합니다.


테스트 과정

위 코드를 이용해서 당일 날짜 기준의 파일 목록과 데이터베이스 파일 목록을 비교해서 삭제하는 작업을 해보려고 합니다. 실제 사용은 위 코드를 사용해서 하루 전 날 파일 목록과 DB 목록을 비교해서 처리하는 것으로 사용합니다. 당일 처리 작업은 테스트를 위한 것입니다.

 

먼저 파일 목록을 제대로 불러오는지 확인합니다.

데이터베이스에 있는 파일 목록

게시물에도 2개의 파일이 등록되어 있습니다. 실제 파일 경로에는 삭제 테스트를 위한 불필요한 파일을 넣어두었습니다.

코드를 수정/추가 해서 이미지 파일인 경우 썸네일 파일까지 목록으로 구합니다. 실제로 이미지 파일은 2개의 파일이 생성되도록 작업했었습니다.

썸네일을 포함한 3개의 데이터를 불러온 것을 확인할 수 있습니다.

 

 

당일 폴더에 있는 파일 목록과 위에서 추출한 실제 사용하는 파일 목록(fileListPaths)을 비교해서 실제 사용 파일들이 포함되지 않은 파일들은 removeFiles 변수에 담아서 파일을 삭제합니다.

파일 삭제 진행

임의로 넣어둔 불필요한 파일들이 삭제된 것을 확인할 수 있습니다.


오늘은 스프링에서 배치를 사용해서 잘못 업로드된 파일을 삭제하는 방법에 대해 알아보았습니다.

728x90
반응형