Scheduled

김덕근·2023년 5월 11일
0

Scheduled

목록 보기
1/1

@Component

특정 시간마다 스프링이 알아서 코드를 수행할 수 있도록 bean 등록

@Scheduled

Spring에서 제공하는 스케줄러 - 스케줄러
시간에 따른 특정 작업(Job)의 순서를 지정하는 방법.

설정 방법

1) servlet-context.xml -> Namespaces 탭 -> task 체크 후 저장
2) servlet-context.xml -> Source 탭 -> <task:annotation-driven/> 추가

@Scheduled 속성

  • fixedDelay(실행시간을 포함한 동기) : 이전 작업이 끝난 시점으로 부터 고정된 시간(ms)을 설정.
  • fixedRate(실행시간을 포함한 비동기) : 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간(ms)을 설정.

예시) @Scheduled(fixedRate = 5000)


cron 속성 : UNIX계열 잡 스케쥴러 표현식으로 작성

cron="초 분 시 일 월 요일 [년도]" - 요일 : 1(SUN) ~ 7(SAT)

  • ex) 2019년 9월 16일 월요일 10시 30분 20초 cron="20 30 10 16 9 2" // 연도 생략 가능
    @Scheduled(cron = "0 * * * * ") // 매 분 0초 마다
    @Scheduled(cron = "0 0
    * * ") // 정시 마다(12:00:00 / 13:00:00)
    @Scheduled(cron = "0 0 12
    * ") // 매일 12시 정각
    @Scheduled(cron = "0 0 12 1,11,21
    ") // 매달 1,11,21 12시 정각마다
    @Scheduled(cron = "0 0 14
    * 2") // 월요일 14시 마다
	 * - 특수문자 
	 * * : 모든 수. 
	 * - : 두 수 사이의 값. ex) 10-15 -> 10이상 15이하 
	 * , : 특정 값 지정. ex) 3,4,7 -> 3,4,7 지정 
	 * / : 값의 증가. ex) 0/5 -> 0부터 시작하여 5마다 
	 * ? : 특별한 값이 없음. (월, 요일만 해당) 
	 * L : 마지막. (월, 요일만 해당)
	 * 

주의사항 - @Scheduled 어노테이션은 매개변수가 없는 메소드에만 적용 가능.


common.scheduling.ImageDeleteScheduling

@Component // bean 등록
public class ImageDeleteScheduling {
	private Logger logger = LoggerFactory.getLogger(ImageDeleteScheduling.class);
	
	// BOARD_IMG 테이블에서 삭제 되었으나
	// 서버/resources/image/board 폴더에는 존재하는
	// 이미지 파일을 정시마다 삭제
	
	// 1) BOARD_IMG에 존재하는 모든 이미지 목록 조회
	// 2) /resource/images/board 폴더에 존재하는 모든 이미지 파일 목록 조회
	// 3) 두 목록을 비교해서 일치하지 않는 이미지 파일을 삭제
	// (DB에는 없는데 서버 폴더에 있으면 삭제)
	
	@Autowired
	private BoardService service;
	
	@Autowired
	private ServletContext application; // application scope 객체 -> 서버 폴더 경로 얻어오기에 사용
	
	// 스케줄링에 사용되는 메서드는 무조건 public void 메서드명()
	@Scheduled(cron = "0 * * * * *") // 매 분마다(테스트용)
	public void serverImageDelete() {
		
		// 1) BOARD_IMG에 존재하는 모든 이미지 목록 조회
		List<String> dbList = service.selectDBList();
		
		// 2) /resource/images/board 폴더에 존재하는 모든 이미지 파일 목록 조회
		String folderPath = application.getRealPath("/resources/images/board");
		
		File path = new File(folderPath); // /resource/images/board 폴더를 참조하는 객체
		
		File[] arr = path.listFiles(); // path가 참조하는 폴더에 있는 모든 파일을 얻어와 File 배열 반환
	
		List<File> serverList = Arrays.asList(arr); // arr을 List로 변환
		
		// 3) 두 목록을 비교해서 일치하지 않는 이미지 파일을 삭제
		// (DB에는 없는데 서버 폴더에 있으면 삭제)
		if(!serverList.isEmpty()) { // 서버에 이미지 파일이 있을 때 비교/삭제 진행
			
			// server : \resources\images\board\sample2.jpg
			// DB : /resources/images/board/sample2.jpg
			
			
			for(File serverImage : serverList) {
				String name = "/resources/images/board/" + serverImage.getName(); // 파일명만 얻어오기
			
				if(dbList.indexOf(name) == -1) {// List에 value와 같은 값이 있으면 인덱스 반환/ 없으면 -1 반환
					
					// dbList에는 없는데 serverList에만 파일이 존재하는 경우
					logger.info(serverImage.getName() + "삭제");
					serverImage.delete(); // 파일 삭제
				}
			}
			logger.info("----------- 서버 이미지 삭제 완료 ----------");
		}
		
	}
}
profile
안녕하세요!

0개의 댓글