Technical Note/SPRING

Spring Framework는 Scheduling 서비스를 제공하기 위해서 다음과 같이, JDK 1.3이후 제공되는 Timer Scheduler와 Quartz Scheduler( http://www.opensymphony.com/quartz/ )를 제공한다. 

Quartz는 오픈 소스 작업 스케줄링 프레임워크이다. Quartz는 완전히 자바로 작성되어 있으며 매우 유연하고 단순한 구조를 제공하여 간단한 작업은 물론 복잡한 작업 모두에 대한 스케줄링을 작성할 수 있다. 또한 EJB, JavaMail 등을 위한 데이터베이스 지원, 클러스터링, 플러그 인, 미리 내장된 작업들을 포함하고 있다. 

Anyframe Core에서는 JDK의 Timer Scheduler보다 Quartz Scheduler 사용을 추천한다. Quartz Scheduler는 JDK Timer Scheduler보다 더 유동성있고 성능이 좋다. 자세한 내용은 Spring 매뉴얼의 Scheduling 부분 을 참고하도록 한다.

Quartz Scheduler

Quartz는 Job과 Trigger 그리고 JobDetail을 사용하여 스케줄링 기능을 수행한다. Quartz에 대한 자세한 내용은http://www.opensymphony.com/quartz 를 참고한다.
  • Job은 실행해야 할 작업으로, 자동 문자메시지 전송 기능이나 어플리케이션의 자동화된 작업들이 그 예이다. Job은 언제 실행되는지에 대한 정보 없이 실행 작업의 단위로만 작성된다.
    Job은 Spring Framework에서 제공하는 QuartzJobBean을 상속받아서 작성할 수도 있고, 특정 API에 종속되지 않은 POJO 형태의 자바 클래스로 작성할 수 있다. 또한 Stateful한 Job 클래스를 사용하기 위해서 Quartz에서 제공하는 StatefulJob 인터페이스를 구현하여 Job을 작성할 수도 있다. Stateful 인터페이스를 구현하여 작성된 Job 클래스 이외의 모든 Job 클래스는 기본적으로 Stateless한 Job 클래스로 동작한다. Stateful한 Job의 경우에만 반복되는 Job 수행 시 특정 데이터 값을 공유하여 변경할 수 있다.
  • Trigger는 Job을 실행시키기 위한 조건으로 작업 실행 시간, 반복 횟수 그리고 실행 간격 시간 등이 조건에 해당된다. 다수의 Trigger는 동일한 Job을 공유하여 지정할 수 있으나, 하나의 Trigger는 반드시 하나의 Job을 지정해야 한다.
  • JobDetail은 Job을 실행하기 위해 필요한 정보를 가지고 있는, 즉 Job Instance에 대한 상세 속성 정보를 가지고 있는 객체로 Trigger가 JobDetail을 이용하여 Job을 수행시킴으로써 Quartz 기반의 스케줄링 기능이 수행된다.
  • Scheduler는 SchedulerFactory에 의해 생성되는데, JobDetail들과 Trigger들을 관리하며 해당 Trigger에 연관된 Job을 수행시키는 Scheduling 서비스의 핵심 역할을 담당한다.

아래 예제에서는 JobDetailBean, MethodInvokingJobDetailFactoryBean, SimpleTriggerBean, CronTriggerBean, TriggerListener, SchedulerFactoryBean 등을 이용하여 일정한 시간 간격 마다 특정 메소드를 실행시키는 방법을 보여주고 있다.
  • JobDetailBean : Spring Framework은 JobDetailBean이라고 불리는 클래스를 제공하는데, Job을 실행시키기 위해 필요한 정보를 가지고 있다.
  • MethodInvokingJobDetailFactoryBean : Job API에 종속적이지 않게 POJO 형태의 Job 클래스를 작성하여 Scheduler에 따라 해당 클래스의 메소드를 호출할 수 있도록 해주는 역할을 수행한다. 
    Job과 Trigger에 관련된 정보를 DB를 통해 관리하는 경우, 즉 JDBC Job Store 방식을 사용하는 경우에는 MethodInvokingJobDetailFactoryBean이 동작하지 않으므로 사용할 수 없음에 유의하도록 한다.
  • SimpleTriggerBean, CronTriggerBean : Spring Framework에서 Quartz를 손쉽게 사용할 수 있도록 2개의 TriggerBean을 제공한다. SimpleTriggerBean과 CronTriggerBean은 Trigger로써 동작하는 것은 동일하나 CronTriggerBean의 경우, 시간 실행 조건을 cron expression을 이용하여 작성하는 것이 차이점이다. SimpleTrigger보다 상세한 스케줄링 실행 시간 조건을 설정할 수 있으면서도 설정 방법이 복잡하지 않다.
  • TriggerListenerBean : Trigger가 fire->execute->complete 혹은 misfire되는 시점에 특정 일을 수행하고자 할때 Scheduler에 TriggerListener를 설정한다.
  • SchedulerFactoryBean : 사용되는 Trigger를 등록시켜주는 역할을 담당하므로 Trigger들을 triggers 속성의 <list> 태그 하위로 등록시킨다. Trigger에 적용할 Listener 등 여러 속성들을 추가 설정할 수 있다.