현재 진행 중인 서버의 images 파일에는 board 파일과 member파일이 있고 위의 폴더에는 사진이 게시글 사진과 프로필 사진이 각각 저장되어 있다.
그러나, 게시글 목록과 프로필이미지에서 사진을 수정 삭제 할 경우에 DB에는 변경된 사항들이 UPDATE와 DELETE을 통해 변경이 되지만 서버에는 변경 되지 않고 그대로 남아 있는 모습을 보인다.
202308145419_31115.png , 202308145419_95983.png
이 두 파일은 DB에 없는 사진 파일이다!
그런데 서버에는 존재하고 board파일에 쌓이는 중..^^
재거해 보자!
🚩 @Schedulrd
Spring에서 제공하는 스케줄러로 시간에 따른 특정 작업의 순서를 저장하는 방법이다!
@Scheduling 사용하기 위해서는 아래와 같이 설정하는 과정
이 필요하다
package edu.kh.project.common.scheduling;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import edu.kh.project.board.model.service.BoardService;
// 스프링이 일정 시간 마다 해당 객체를 이용해서 코드를 수행
// == 스프링이 해당 클래스를 만들어서 관리를 해야한다
// == Bean으로 등록
@Component // @Controller, @Service, @Repository의 부모 어노테이션
// Bean 등록을 하겠다고 명시하는 어노테이션
public class ImageDeleteScheduling {
@Autowired
private ServletContext servletContext;
@Autowired
private BoardService service;
//@Scheduled(fixedDelay = 10000) // ms단위
// 일(5초) -> 10초 대기 -> 일(5초) -> 10초 대기
//@Scheduled(fixedRate = 10000)
// 일(5초)
// 대기(10초)
//cron ="초 분 시 일 월 요일 [년도]"
//@Scheduled(cron ="0,30 * * * * *")
@Scheduled(cron = "0 0 * * * *") // 매 정시 (*시 0분 0초)
public void test() {
//System.out.println("스케줄러가 일정시간마자 자동으로 출력");
System.out.println("----------게시판 DB, 서버가 불일치하는 파일 제거------------");
// 서버에 저장된 파일 목록을 조회해서
// DB에 저장된 파일 목록과 비교하여
// 매칭되지 않는 서버 파일 제거
// 1) 서버에 저장된 파일 목록 조회
// -> application객체를 이용해서
// /resources/images/board의 실제 서버 경로를 얻어옴
String filePath= servletContext.getRealPath("/resources/images/board");
// C:\workspace\6_Framework\boardProject\src\main\webapp\resources\images\board
// 2)filePath네 저장된 모든 파일 경로 읽어오기
File path = new File(filePath);
File[] imageArr = path.listFiles();
// 배열 -> List로 변환
List<File> serverImageList = Arrays.asList(imageArr);
/* // 확인(임시)
for(File f :serverImageList) {
System.out.println(f.toString());
}*/
// 3) DB 파일 목록 비교
List<String> dbImageList = service.selectImageList();
/*// 확인(임시)
for(String s :dbImageList) {
System.out.println(s);
}*/
// 4) 서버에 파일 목록이 있을 경우에 비교 시작
if(!serverImageList.isEmpty()) {
// 5) 서버 파일 목록 순차접근
for(File server : serverImageList) {
// 6) 서버에서 존재하는 파일이
// DB(dbImageList)에 없다면 삭제
//String[] temp = server.toString().split("\\");
//String s = temp[temp.length-1];
//System.out.println(s);
// C:\workspace\6_Framework\boardProject\src\main\webapp\resources\images\board\20230821141913_00001.png
// getName() - spilt을 쓰지 않아도
// System.out.println(server.getName());
//List.indexOf(객체) = 객체가 List에 있으면 인덱스 반환
// 없으면 -1반환
if(dbImageList.indexOf(server.getName()) == -1){
//db파일 목록 서버 파일 이름
System.out.println(server.getName() + "삭제");
server.delete(); //File.delete() : 파일 삭제
}
} // for문 종료
System.out.println("-----------이미지 파일 삭제 스케줄러 종료----------------");
}
}
}
일정시간이 지나면 알아서 사진 파일 업뎃하고 삭제한다!