스프링부트 Quartz 스케줄링 활용하기
1. Quartz란?
Quartz
는 Java 기반 스케줄링 라이브러리로, 복잡한 작업 예약 및 실행을 지원한다.
다음과 같은 특징들을 갖고 있다.
- 작업(Job)과 트리거(Trigger)를 분리한 구조
- Cron 표현식을 사용한 정교한 스케줄링 지원
- 분산 환경에서 클러스터링 지원
- 저장소(예: JDBC, RAM)를 활용한 작업 상태 저장
Quartz 주요 구성 요소
- Scheduler: 작업 및 트리거 관리
- Job: 수행할 작업 정의
- JobDetail: 작업의 세부정보 포함
- Trigger: 작업 실행 조건 정의(CronTrigger, SimpleTrigger 등)
- JobStore: 작업과 트리거의 저장소(JDBC, RAM 등)
2. Spring Quartz
SpringBoot에서는 Quartz를 쉽게 사용할 수 있도록 spring-boot-starter-quartz
라는 라이브러리를 제공한다. 해당 라이브러리를 사용하면 다음과 같은 장점을 갖는다.
- Spring Boot Integration: Quartz와의 통합을 통해 손쉬운 설정 및 관리
- Bean 관리: Quartz 작업 및 트리거를 Spring Bean으로 관리
- 자동 설정 지원:
- Spring Boot Starter를 사용해 최소 설정으로 시작 가능
- @Scheduled와 Quartz를 조합해 복잡한 스케줄링도 처리 가능
- 유연한 데이터베이스 관리:
- H2, MySQL 등 다양한 데이터베이스와 호환
- 클러스터링 지원
- 트랜잭션 통합:
- Spring의 트랜잭션 관리와 자연스럽게 통합 가능
Spring Quartz vs. 기본 Quartz
- Quartz: 독립적으로 설정이 필요하며 XML 또는 Java 코드로 세부 설정 관리
- Spring Quartz: Spring 컨텍스트와 통합되어 간결한 설정 가능
3. Spring Quartz 활용 방식
먼저 spring-boot-starter-quartz
라이브러리를 의존성을 추가한다.
1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
application.yml 또는 application.properties에 기본 설정 추가한다.
1
2
3
4
5
spring:
quartz:
job-store-type: jdbc # 작업 및 트리거를 DB에 저장
jdbc:
initialize-schema: always # 항상 스키마 초기화
Quartz에 사용될 Job 클래스를 작성한다. execute 메서드에 Job이 실행될 내용을 작성한다.
1
2
3
4
5
6
7
8
9
import org.quartz.Job;
import org.quartz.JobExecutionContext;
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext context) {
System.out.println("Quartz Job is executed!");
}
}
Quartz Job에 대한 detail과 trigger 정보를 설정한다. DB에도 해당 정보들이 저장된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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")
.storeDurably() // DB에 저장
.build();
}
@Bean
public Trigger sampleJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("sampleTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) // 5초 간격
.build();
}
}
이후 Spring Boot 애플리케이션을 실행하면 DB에 저장된 Quartz Job이 실행되며, Job에 구현한 execute 메서드가 호출된다.
물론 DB에 저장된 Job 정보를 사용하지 않고 메모리 기반으로 사용할 수도 있지만 데이터 유지 및 세밀한 작업 관리 등의 이유로 DB를 사용하는 것이 일반적이다.
This post is licensed under CC BY 4.0 by the author.