스케줄러(Scheduler)는 특정 작업(Job)을 미리 정의된 시간이나 간격에 따라 실행하는 소프트웨어 또는 프레임워크입니다. 이는 시스템 자동화를 위한 중요한 도구로, 반복적인 작업, 특정 시간에 수행해야 할 작업 등을 간편하게 처리할 수 있도록 도와줍니다.
주요 사례로는 다음과 같습니다.
Spring Scheduler는 Spring 프레임워크가 제공하는 기본적인 스케줄링 도구로, Java의 ScheduledExecutorService와 Cron 표현식을 활용하여 작업 스케줄링을 처리합니다. Spring Boot와 자연스럽게 통합되며, 간단한 주기적 작업에서 많이 사용됩니다.
@Scheduled)으로 간단한 작업 처리에 적합fixedRate: 작업 시작 시점부터 지정한 간격으로 실행fixedDelay: 이전 작업이 끝난 후 지정한 간격으로 실행cron: Cron 표현식을 사용하여 복잡한 스케줄 지정 가능TaskScheduler를 설정하면 멀티스레드 처리가 가능Spring Scheduler 예시 코드
@Slf4j
@Component
public class SimpleScheduler {
@Scheduled(fixedRate = 5000) // 5초마다 실행
public void runTaskWithFixedRate() {
log.info("Fixed Rate Task: {}", System.currentTimeMillis());
}
@Scheduled(cron = "0 0/1 * * * ?") // 매 분마다 실행
public void runTaskWithCron() {
log.info("Cron Task: {}", System.currentTimeMillis());
}
}
Quartz Scheduler는 Java 기반의 고급 스케줄링 라이브러리로, 복잡하고 세밀한 스케줄링 요구사항을 처리할 수 있습니다. Quartz는 다양한 트리거 설정, 동적 작업 관리, 클러스터링 등을 지원하여 엔터프라이즈 환경에서 자주 사용됩니다.
JobStoreTX)를 통해 영구 작업 관리 가능Quartz Scheduler 예시 코드
@Slf4j
@Component
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("Executing Sample Job at: {}", System.currentTimeMillis());
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob", "group1")
.storeDurably()
.build();
}
@Bean
public Trigger sampleJobTrigger(JobDetail jobDetail) {
return TriggerBuilder.newTrigger()
.forJob(jobDetail)
.withIdentity("sampleTrigger", "group1")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10) // 10초 간격
.repeatForever())
.build();
}
}
| 기능 항목 | Spring Scheduler | Quartz Scheduler |
|---|---|---|
| 간단한 설정 | 어노테이션 기반으로 간단히 설정 가능 | XML 또는 Java Config를 통한 복잡한 설정 필요 |
| 동적 작업 추가/제거 | 미지원 | 동적 작업 추가 및 제거 가능 |
| 복잡한 트리거 지원 | 크론 표현식 정도만 지원 | CronTrigger, CalendarIntervalTrigger 등 다양 |
| 클러스터링 | 미지원 | DB 기반 클러스터링 지원 |
| 작업 상태 저장 | 미지원 | RAM 또는 DB를 통해 작업 상태 저장 가능 |
| 작업 실패 처리 | 미지원 | Misfire Handling 기능 제공 |
| 성능 | 경량, 단순 작업에 적합 | 고급 기능 제공, 상대적으로 무거움 |
| 의존성 추가 필요 여부 | 추가 의존성 불필요 | spring-boot-starter-quartz 필요 |
| 확장성 | 제한적 | 매우 우수 |
Quartz 클러스터링 설정 예시
org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.dataSource=myDataSource
org.quartz.jobStore.isClustered=true
org.quartz.jobStore.clusterCheckinInterval=20000
Quartz는 작업 실패 시 Misfire Instructions를 통해 후속 처리 방법을 정의할 수 있습니다.
예시 코드
SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever()
.withMisfireHandlingInstructionFireNow(); // 실패 시 즉시 실행
| 추천 시나리오 | Spring Scheduler | Quartz Scheduler |
|---|---|---|
| 단순 주기적 작업 | 크론 표현식이나 고정 간격으로 간단한 작업 처리 | 불필요 (Spring Scheduler가 더 적합) |
| 동적 작업 추가/제거 필요 | 불가능 | 동적 작업 추가 및 제거 가능 |
| 여러 노드에서 작업 관리 | 불가능 | 클러스터링을 통해 노드 간 작업 상태 공유 가능 |
| 작업 실패 복구 | 기본적으로 미지원 | Misfire Handling을 통해 후속 조치 가능 |
| 복잡한 트리거 설정 필요 | 복잡한 스케줄에 부적합 | 다양한 트리거 제공 (CronTrigger, CalendarIntervalTrigger 등) |
| 확장성 | 소규모 프로젝트나 단순 작업 스케줄링 | 엔터프라이즈 환경, 복잡한 요구사항 처리 |