티스토리 뷰
Quartz Scheduler란?
Quartz Scheduler는 자바 기반의 오픈소스 스케줄링 라이브러리로, 특정 시간에 작업(작업(Job)이라고 함)을 실행할 수 있도록 도와줍니다. 단순한 예약 작업부터 복잡한 일정 관리까지 다양한 기능을 제공하며, Spring Boot와 통합하여 많이 사용됩니다.
1. Quartz Scheduler의 주요 특징
- 정확한 일정 관리: Cron 표현식 및 SimpleTrigger를 사용하여 일정 설정이 가능합니다.
- 분산 환경 지원: 여러 개의 Quartz 인스턴스를 클러스터로 구성할 수 있습니다.
- 다양한 트리거 제공: 일정한 간격으로 실행(SimpleTrigger), 특정 시간에 실행(CronTrigger) 등을 지원합니다.
- 작업의 영속성 지원: H2, MySQL 등 데이터베이스를 활용하여 작업 정보를 저장할 수 있습니다.
- Spring과의 통합 가능: Spring Boot와 쉽게 통합하여 사용할 수 있습니다.
2. Quartz의 주요 개념
Quartz의 핵심 요소는 다음과 같습니다.
개념 설명
Scheduler | 작업을 스케줄링하고 실행하는 핵심 객체 |
Job | 실행할 실제 작업(비즈니스 로직) |
JobDetail | Job의 정의(이름, 클래스 정보 등 포함) |
Trigger | Job이 언제 실행될지 결정 |
JobStore | Job의 실행 정보를 저장하는 데이터 저장소(RAM, DB 지원) |
3. Quartz Scheduler 사용 방법
1) Quartz 의존성 추가 (Spring Boot 기준)
Gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-quartz'
}
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2) Job 클래스 작성
Quartz에서 실행할 작업(Job)은 Job 인터페이스를 구현해야 합니다.
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
@Component
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Quartz Job 실행: " + System.currentTimeMillis());
}
}
설명:
- execute(JobExecutionContext context): Quartz가 실행할 작업의 로직을 작성합니다.
- System.out.println()을 통해 작업이 실행될 때마다 로그를 출력하도록 설정했습니다.
3) JobDetail 및 Trigger 설정
Quartz에서 Job을 실행하기 위해 JobDetail과 Trigger를 설정해야 합니다.
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob") // Job 이름 설정
.storeDurably()
.build();
}
@Bean
public Trigger sampleJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10) // 10초마다 실행
.repeatForever(); // 무한 반복
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("sampleTrigger") // Trigger 이름 설정
.withSchedule(scheduleBuilder)
.build();
}
}
설명:
- JobDetail: SampleJob을 실행할 JobDetail을 생성합니다.
- Trigger: 10초마다 SampleJob을 실행하도록 설정합니다.
4) CronTrigger를 활용한 실행
Cron 표현식을 사용하여 특정 시간마다 실행하는 작업을 설정할 수도 있습니다.
@Bean
public Trigger cronJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("cronTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) // 매분 0초에 실행
.build();
}
설명:
- "0 0/1 * * * ?" → 매분 0초에 실행하는 표현식입니다.
- Cron 표현식 형식: 초 분 시 일 월 요일 [년도]
표현식 실행 주기
"0/10 * * * * ?" | 10초마다 실행 |
"0 0 12 * * ?" | 매일 정오(12:00)에 실행 |
"0 0 0 * * ?" | 매일 자정(00:00)에 실행 |
4. Quartz의 Job 데이터를 활용하는 방법
Job 실행 시 외부 데이터를 전달해야 하는 경우가 있습니다.
import org.quartz.*;
public class ParameterizedJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String message = dataMap.getString("message");
System.out.println("전달받은 메시지: " + message);
}
}
Job 실행 시 데이터 전달 방법
@Bean
public JobDetail parameterizedJobDetail() {
return JobBuilder.newJob(ParameterizedJob.class)
.withIdentity("paramJob")
.usingJobData("message", "Quartz Job 실행 중")
.storeDurably()
.build();
}
설명:
- JobDataMap을 사용하면 Job 실행 시 추가적인 데이터를 전달할 수 있습니다.
5. Quartz의 Job 저장 방식 (JobStore)
Quartz는 Job의 실행 정보를 저장하는 방식을 여러 가지 제공합니다.
JobStore 방식 설명
RAMJobStore | 메모리에만 Job 정보를 저장 (기본 설정) |
JDBCJobStore | 데이터베이스에 Job 정보를 저장 (재부팅 후에도 유지) |
JDBCJobStore 사용 방법
- application.properties 설정
spring.quartz.job-store-type=jdbc
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
- Quartz 테이블 생성 (H2, MySQL 등)
CREATE TABLE QRTZ_TRIGGERS (...);
CREATE TABLE QRTZ_JOB_DETAILS (...);
설명:
- RAMJobStore는 서버가 재시작되면 Job 정보가 사라지지만, JDBCJobStore는 DB에 저장되므로 유지됩니다.
6. Quartz Scheduler 종료 방법
Quartz 인스턴스를 종료하려면 다음과 같이 호출하면 됩니다.
import org.quartz.Scheduler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class ShutdownQuartz {
@Autowired
private Scheduler scheduler;
public void shutdown() throws Exception {
scheduler.shutdown();
}
}
설명:
- scheduler.shutdown();을 호출하면 Quartz가 종료됩니다.
- 클러스터 환경에서는 개별 노드의 스케줄링을 조정해야 합니다.
7. 결론
- Quartz Scheduler는 강력한 작업 스케줄링 기능을 제공하며, Spring Boot와 쉽게 통합할 수 있습니다.
- SimpleTrigger와 CronTrigger를 활용하여 다양한 일정 관리가 가능합니다.
- RAMJobStore와 JDBCJobStore를 선택하여 Job 정보를 저장하는 방식도 조정할 수 있습니다.
- JobDataMap을 활용하여 외부 데이터를 전달할 수 있으며, 분산 환경에서도 안정적으로 동작합니다.