[Spring] Quartz 라이브러리를 이용한 스케쥴러 설정

스케줄러

- 주기적으로 매일, 매주, 매월 등 주기적으로 특정한 프로그램을 실행하기 위한 것

- Spring의 경우는 Spring-batch 혹은 Quartz 라이브러리를 이용하면 프로그램이 실행되는 동안 주기적인 스케줄링이 가능하다.

 

Spring에서 Quartz 라이브러리 설정

1. pom.xml

		<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
		<dependency>
		    <groupId>org.quartz-scheduler</groupId>
		    <artifactId>quartz</artifactId>
		    <version>2.3.0</version>
		</dependency>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz-jobs</artifactId>
			<version>2.3.0</version>
		</dependency>

- quartz와 quartz-jobs 디펜던시 등록.

 

2. root-context.xml 의 namepace에서 task 항목을 체크!

	<context:component-scan base-package="org.zerock.task"></context:component-scan>

	<task:annotation-driven />

- task:annotation-driven 태그 추가

- 스케줄러가 실행될 컨트롤러가 속한 패키지를 component-scan 처리한다.

 

3. 스케줄러 클래스 생성

package org.zerock.task;

@Log4j
@Component
public class FileCheckTask {
	//DB에 간다면 Mapper 주입하면되고.
	
	@Scheduled(cron="0 0 2 * * *")  //매일 새벽2시마다 한번씩 실행
	public void task1() throws Exception{
		log.warn("File Check Task run......");
		log.warn(new Date());
	}
    
    @Scheduled(fixedDelay = 1000)  // 매초마다 실행
	public void task2() throws Exception{
		log.warn("File Check Task run......");
		log.warn(new Date());
	}
}

- @Scheduled 어노테이션 지정, cron 속성 지정

- cron 속성은 unix 계열에서 사용되던 이름이지만 워낙 많이 사용되다보니 각종 기술에 라이브러리 형태로 사용된다.

- cron = 초 분 시 일 월 day of week(요일) (선택: 년도)

 -> 위의 속성을 예로 들면, 매 0초, 매 0분, 매 2시(새벽) 마다 checkFiles() 라는 메소드는 실행될 것이다.(프로그램 run 중일때만)

 

4. 왜 스케줄러를 사용하는가?

- 일정한 시각에 특정 작업을 처리해줘야만 할때.

- 제가 사용했던 케이스는 파일 업로드 관련 부분이었는데, 사용자가 파일업로드 하는 도중에 브라우저를 꺼버린 경우 데이터베이스 상 존재하는 파일 목록과 실제 서버 파일목록이 상이하게됨. 

- 그래서 사람이 적은 새벽 2시경에 디비 파일목록과 서버 파일목록을 일치시켜주는 작업이 checkFiles() 메소드임.

- 무언가 주기적으로 반복되는 작업이 필요한 경우에 활용하면 좋을 듯 합니다.

댓글

Designed by JB FACTORY