• 이미지 메서드에 대한 셋팅 마지막 부분이며, 잘못 업로드 된 파일 삭제하는 메서드 이다.
  • Ajax를 이용하여 첨부파일을 사용하면 사용자가 게시물을 등록&수정 하기전에 미리 업로드 시킨 파일을 볼 수 있는 장점이 있지만, 비정상적으로 브라우저를 종료하거나 페이지를 빠져나갈 시 문제가 됩니다.
  • 최종적으로 submit 버튼을 누르지 않은 경우 폴더에 파일들은 업로드되지만, DB는 아무변화가 생기지 않는다.
  • 만일 정삭적으로 된다면 DB와 폴더 두 곳다 파일리스트가 생성됩니다.
  • 파일목록을 찾을 때에는 반드시 오늘 날짜가 아닌 파일 대상으로 해야합니다. 왜냐하면 오늘 날짜를 대상으로 해버리면 지금 현재 게시물을 작성하거나 수정하기 위해서 업로드 하고 있는 파일들을 삭제할 가능성이 있기 때문입니다.

 

  • 그리하여 주기적으로 작업이 동작 해야 하므로 스케줄링을 할수 있는  Quartz 라이브러리를 이용합니다.

pom.xml

  • pom.xml에 추가 시켜줍니다.
  • 이 작업은 운영체제의 기능을 이용해서 작업할 수도 있지만, 스프링과 Quartz 라이브러리를 이용하면 간단히 처리 할 수 있습니다.
  • action-mybatis.xml 에  네임스페이스를 추가해줍니다 (DB 관련 설정 xml.. 이름은 다를 수 있습니다.)
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.3.xsd"

 

 

폴더에 저장된 이미지 파일 리스트 메서드 입니다.

  • task 패키지를 만들어서 FileCheckTask라는 클래스를 선언 후 메서드를 추가 시켰습니다.
	private String getFolderYesterDay() {
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DATE, -1);
		
		String str = sdf.format(cal.getTime());
		
		return str.replace("-", File.separator);
	}
  • 우선 날짜에 대한 객체 선언 해주고, Calendar객체를 선언하여 현재 날짜,요일,시간 정보를 가져옵니다
  • 그리고 .add를 사용하여 현재 날짜 에서 -1 을 하여 추가시켜줍니다. 즉, 어제의 날짜를 대입합니다.
  • 어제의 날짜를 넣고 그값을 날짜에 대한 객체'sdf' 에 구분자를 이용해 return 시켜줍니다

DB에 저장된 이미지 리스트 메서드 입니다.

	@Scheduled(cron = "0 0 3 * * *")
	public void checkFiles() throws Exception {

		log.info("File Check Task run.................");
		log.info("date():"+new Date());
		// 우선 DB에 저장된 이미지 파일 리스트를 조회할 객체 선언
		List<BoardAttachVO> fileList = boardAttach.getOldFiles();

		// 폴더에 저장된 이미지 파일 리스트, 
		List<Path> fileListPaths = fileList.stream()
				//.map을 통해 vo변수에 파일 경로 저장
				//.collect 요소들의 가공이 끝났다면 리턴해줄 결과를 collect를 통해 만들어준다.
				.map(vo -> Paths.get("C:\\upload", vo.getUploadPath(), vo.getUuid() + "_" + vo.getFileName()))
				.collect(Collectors.toList());
		
		//DB에 저장된 이미지 파일리스트를 확인합니다
		//filter를 통해 isFileType == true면 걸러내는 작업을 함
		//썸네일에 대한 이미지정보를 map에 담아서 반목문을 통해 폴더에 이미지를 추가 
		fileList.stream().filter(vo -> vo.isFileType() == true)
				.map(vo -> Paths.get("C:\\upload", vo.getUploadPath(), "s_" + vo.getUuid() + "_" + vo.getFileName()))
				.forEach(p -> fileListPaths.add(p));

		log.info("===========================================");

		fileListPaths.forEach(p -> log.info("p:"+p));

		//어제자 폴더에 저장된 이미지에 대한 값을 가져와서 targetDir에 대입
		File targetDir = Paths.get("C:\\upload", getFolderYesterDay()).toFile();
		//listFiles메서드 사용해서 폴더의 파일목록을 file 배열로 반환 후 대상 문자열에 특정 문자열이 포함 되었는지 (경로에) 확인 == false
		//false 면 없는 파일이므로 없는 파일들을 찾아 목록에 추가
		File[] removeFiles = targetDir.listFiles(file -> fileListPaths.contains(file.toPath()) == false);

		log.info("-----------------------------------------");
		//file 변수에 removeFIles 값을 대입시켜서 삭제 시킨다. 즉 썸네일사진 기본사진 둘다 삭제를 시킨다는것
		for (File file : removeFiles) {

			log.info("file:" +file.getAbsolutePath());

			file.delete();

		}
	}
  • 우선 맨위 어노테이션인 @Scheduled(cron = 0 0 3 * * *) 의 사용해서 매일 새벽3시 마다 파일을 체크한다.
  • 어노테이션에 대한 설명@Scheduled
 

[Spring] 스케줄러 Cron 사용하기

스프링 프로젝트를 개발하면서 시스템이 커지고 DB 또는 다양한 서비스를 위해 어떤 모듈들을 주기적으로 실행해야 할 때가 옵니다. 그럴 때 사용하는 것이 스케줄러입니다. 스프링에서 스케줄

wooncloud.tistory.com

  • 우선 DB에 저장된 데이터 대한 이미지 파일을 불러오는 쿼리문을 하나 선언 해야 하기 때문에 새로운 DAO와VO클래스, xml 폴더를 생성

DAO & VO

//BoardAttachVO
@Component
public class BoardAttachVO {
	private String uuid;
	private String uploadPath;
	private String fileName;
	private boolean fileType;	
	private int bno;
	
	public String getUuid() {
		return uuid;
	}
	public void setUuid(String uuid) {
		this.uuid = uuid;
	}
	public String getUploadPath() {
		return uploadPath;
	}
	public void setUploadPath(String uploadPath) {
		this.uploadPath = uploadPath;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public boolean isFileType() {
		return fileType;
	}
	public void setFileType(boolean fileType) {
		this.fileType = fileType;
	}
	public int getBno() {
		return bno;
	}
	public void setBno(int bno) {
		this.bno = bno;
	}
	@Override
	public String toString() {
		return "BoardAttachVO [uuid=" + uuid + ", uploadPath=" + uploadPath + ", fileName=" + fileName + ", fileType="
				+ fileType + ", bno=" + bno + "]";
	}
	
	
	
}
//BoardAttachDAO
@Repository
public class BoardAttachDAOImpl implements BoardAttachDAO{
	@Autowired
	private SqlSession session;

	@Override
	public List<BoardAttachVO> getOldFiles(){
		return session.selectList("mapper.attach.getOldFiles");
	}
}

Mapper.xml(Oracle)

<!-- boardAttach.xml  -->
	<select id="getOldFiles" resultMap="AttachResult">
	<![CDATA[
			select * from board_attach where uploadPath = to_char(sysdate -1 ,'yyyy\mm\dd')
	]]>
	</select>
  • Mapper.xml을 통해 어제 날짜로 보관되는 모든 첨부파일 목록을 가져옵니다.
  • DB에서 가져온 파일 목록은 BoardAttachVO 타입 객체 이므로, 나중에 비교를 위해 Paths의 목록으로 변환 시킵니다.
  • 이때 이미지 파일의 경우에는 썸네일 파일도 목록에 필요하기 때문에 별도로 처리해서 해당 일의 예상 파일 목록을 완성합니다.
  • DB에 있는 파일들의 준비가 끝나면 실제 폴더에 있는 파일들의 목록에서 DB에는 없는 파일들을 찾아 목록으로 준비
  • 결과는 removeFiles 변수에 담아서 처리
복사했습니다!