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

- 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 변수에 담아서 처리
'Spring > 커뮤니티 사이트' 카테고리의 다른 글
| [Spring][커뮤니티 사이트]게시판 상세보기 에서 이미지 보기 (0) | 2022.12.13 |
|---|---|
| [Spring][커뮤니티 사이트]이미지 등록 (0) | 2022.12.13 |
| [Spring][커뮤니티 사이트]파일 업로드 처리 -1 (0) | 2022.12.13 |
| [Spring][커뮤니티 사이트]게시판 페이징 만들기 (0) | 2022.12.13 |
| [Spring][커뮤니티 사이트]다중 게시판 - 수정 & 삭제 (0) | 2022.12.13 |