1. 개요

주기적으로 어떤 일을 돌려야 할 때 어떻게 해야 할까?

운영체제 단에서는 cron이라는 기능을 사용하여 일을 시킬 수 있다. crontab이라는 곳에 등록을 해두면 된다.

그러면 응용 프로그램에서는 어떻게 해야 할까?

만약 스프링 프레임워크를 사용하면 손쉽게 가능하다. 바로 Quartz라는 스케쥴러 모듈을 이용하는 것이다. 물론 Quartz는 그 자체가 오픈 소스이므로 그냥 별도로 사용하셔도 된다.

Quartz 자체에 대해서는 http://www.quartz-scheduler.org/에 접속해서 도큐멘트를 읽어보시길 바란다.


2. 구성요소

Quartz를 구성하는 요소에 대해 알아보자.

2.1. Job

Job은 돌릴 작업을 정의하는 인터페이스이다. 아래 설명할 Trigger를 이용하여 스케쥴링한다.

2.2. JobDetail

JobDetail은 Job에 대한 보다 상세한 내용을 정의하는 것이다. 작업 이름이나 작업 그룹 같은 것들이 해당된다.

스프링은 JobDetail 빈 생성을 위해서 JobDetailBean을 제공하고 있다.

2.3. Trigger

Trigger는 앞에서 설명한 것과 같이 Job을 스케쥴링하는 것이다. 바로 아래의 Scheduler에게 Job을 언제 돌려야 할지 알려준다.

Trigger에는 SimpleTrigger와 CronTriiger가 있다.

SimpleTrigger는 그 이름처럼 간단하다. 인터벌, 딜레이, 반복횟수 등을 정의하면 된다.

 Trigger trigger = newTrigger()
          .withIdentity("trigger1","group1")
          .startNow()
          .withSchedule(simpleSchedule()
              .withIntervalInSeconds(5)
              .repeatForever())
          .build();

혹은 이렇게도 된다.

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobDetailBean" />
        <!-- 즉시 시작 -->
<property name="startDelay" value="0" />
    <!-- 매 10초마다 실행 -->
<property name="repeatInterval" value="10000" />
</bean>

한편 CronTrigger는 앞서 말한 유닉스계의 cron과 비슷하다. cron 문법은 "분 시 일 달 요일 년" 순이다.

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetailFactoryBean" />
    <!-- 매 10초마다 실행 -->
    <property name="cronExpression" value="*/10 * * * * ?" />
</bean>

ddayTrigger는 특정 시험에 실행하는 것이다. 

2.4. Scheduler

Scheduler는 Quartz 실행 환경을 관리한다.


3. 구현

그럼 좀 더 구체적으로 어떻게 구현해야 하는지 알아보자.

먼저 Job을 생성해야겠다. Job은 QuartzJobBean을 상속해야 한다.

public class MyJob extends QuartzJobBean {

  // 내용

}

그리고 이렇게 만든 Job을 실행해야겠다. Job 실행은 SchedulerFactortyBean을 주입해야 합니다...

이러한 실행 결과는 리스너를 통해 남길 수 있다.

파일 혹은 데이터베이스에 남길 수 있고 시작/종료시간, 수행횟수, 성공/실패횟수 등을 남길 수 있다.

오늘은 아니고 기회가 닿으면 실제 예제 코드를 가지고 셜명을 해보겠다.