Spring 스케줄러
스프링 스케쥴러 : 스프링이 알아서 때에 맞춰 코드 수행해 줌
-> 코드를 수행하려면 해당 클래스가 객체 형대로 존재해야함
-> Bean 필요 -> @Component
@Scheduled : Spring 에서 제공하는 스케쥴러 : 시간에 따른 특정 잡업의 순서를 지정하는 방법
설정방법
1. servlet-context.xml -> Namespaces 탭 -> task 체크 후 저장
2. servlet-context.xml -> Source 탭 -> <task:annotation-driven/> 추가
@Scheduled 속성
- fixedDelay : 이전 작업이 끝난 시점으로 부터 고정된 시간(ms)을 설정.
- fixedRate : 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간(ms)을 설정.
-cron 속성 : UNIX계열 잡 스케쥴러 표현식으로 작성 - cron="초 분 시 일 월 요일 [년도]" - 요일 : 1(SUN) ~ 7(SAT)
* - 특수문자 * : 모든 수.
* - : 두 수 사이의 값. ex) 10-15 -> 10이상 15이하
* , : 특정 값 지정. ex) 3,4,7 -> 3,4,7 지정
* / : 값의 증가. ex) 0/5 -> 0부터 시작하여 5마다
* ? : 특별한 값이 없음. (월, 요일만 해당)
* L : 마지막. (월, 요일만 해당)
* 주의사항 - @Scheduled 어노테이션은 매개변수가 없는 메소드에만 적용 가능.
@Scheduled(fixedDelay = 3000) : 3초마다
@Scheduled(cron = "0 * * * * *")//모든 년월일시분, 요일 0 초 마다: 매분 0초마다 라는 뜻(매분마다)
@Scheduled(cron ="( 0 0 * * .. == 0분 0초 == 정시 마다)
@Scheduled(cron ="( 0 0 0 * .. == 0시 0분 0초 == 자정 마다)
// +스케쥴러를 이용한 가비지 파일 삭제
String serverPath = servletContext.getRealPath("/resources/images/board");
//이미지가 저장되어있는 실제 경로
//위에서 DI로 ServletConetx를 받아놓는다
File[] imgArr = new File(serverPath).listFiles();
//지정된 경로에 있는 모든 파일 리스트를 File배열로 반환
//File객체 : 파일을 참조할 수 있는 객체
//배열을 리스트로 변환
List<File> serverImgList = Arrays.asList(imgArr);
//이미지가 저장된 폴더에 있는 파일 목록을 잘 가져왔는지 확인
/*
* for(File img : serverImgList) { System.out.println(img); }
*/
//DB에서 파일명 목록 조회
List<String> dbImgList = boardService.selectImgList();
System.out.println(dbImgList);
//serverImgList : 서버에 저장된 파일 목록
//dbImgList : DB에 저장된 파일명 목록
//서버 DB 모두 비어있지 않은 경우
if(!serverImgList.isEmpty() &&!dbImgList.isEmpty() ) {
for(File img : serverImgList) {
String serverImgName =
img.toString().substring(img.toString().lastIndexOf("\\")+1);
//img.toString : 경로 + 파일명
//.substring -> 문자열 시작부터 지정된 index 이전까지 문자열을 모두 삭제
if(dbImgList.indexOf(serverImgName) == -1) {
//DB파일명 목록에 서버 파일명과 같은 이름이 없다면
System.out.println(serverImgName+"삭제");
img.delete();
}
}
}