메모와일기장 2022. 1. 14. 22:43

스프링 스케쥴러 : 스프링이 알아서 때에 맞춰 코드 수행해 줌

-> 코드를 수행하려면 해당 클래스가 객체 형대로 존재해야함

-> 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();
				}
			}
		}