[Spring] Spring Scheduler VS Quartz Scheduler

동긔·2024년 12월 12일

Spring

목록 보기
6/6

1. 스케줄러 (Scheduler)란?

스케줄러(Scheduler)는 특정 작업(Job)을 미리 정의된 시간이나 간격에 따라 실행하는 소프트웨어 또는 프레임워크입니다. 이는 시스템 자동화를 위한 중요한 도구로, 반복적인 작업, 특정 시간에 수행해야 할 작업 등을 간편하게 처리할 수 있도록 도와줍니다.

주요 사례로는 다음과 같습니다.

  • 시스템 유지보수: 로그 정리, 데이터 백업, 캐시 초기화
  • 비즈니스 프로세스: 정기 보고서 생성, 배치 작업 처리
  • 파일 처리: 특정 디렉토리 감시 및 파일 업로드 작업
  • 알림 발송: 특정 이벤트에 대한 알림 스케줄링

1.1 Spring Scheduler란?

Spring Scheduler는 Spring 프레임워크가 제공하는 기본적인 스케줄링 도구로, Java의 ScheduledExecutorService와 Cron 표현식을 활용하여 작업 스케줄링을 처리합니다. Spring Boot와 자연스럽게 통합되며, 간단한 주기적 작업에서 많이 사용됩니다.

1) Spring Scheduler의 주요 특징

  1. 경량 스케줄러
    • Spring Boot 환경에서 별도의 의존성 없이 바로 사용 가능
    • 어노테이션 기반(@Scheduled)으로 간단한 작업 처리에 적합
  2. 주요 스케줄링 방식
    • fixedRate: 작업 시작 시점부터 지정한 간격으로 실행
    • fixedDelay: 이전 작업이 끝난 후 지정한 간격으로 실행
    • cron: Cron 표현식을 사용하여 복잡한 스케줄 지정 가능
  3. 멀티스레드 지원
    • 기본적으로 단일 스레드에서 실행되지만, 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());
    }
}

2) Spring Scheduler 장점

  • 빠르고 간단하게 설정 가능
  • 추가 의존성 필요 없음
  • Spring Boot 환경에서 기본 지원

3) Spring Scheduler 단점

  • 동적 작업 추가가 어려움
  • 클러스터링과 같은 고급 기능 부재
  • 복잡한 트리거 설정 제한

1.2 Quartz Scheduler란?

Quartz Scheduler는 Java 기반의 고급 스케줄링 라이브러리로, 복잡하고 세밀한 스케줄링 요구사항을 처리할 수 있습니다. Quartz는 다양한 트리거 설정, 동적 작업 관리, 클러스터링 등을 지원하여 엔터프라이즈 환경에서 자주 사용됩니다.

1) Quartz Scheduler 주요 특징

  1. 유연한 트리거
    • SimpleTrigger: 고정된 시간 간격으로 실행
    • CronTrigger: Cron 표현식 기반 복잡한 일정 지원
    • CalendarIntervalTrigger: 특정 날짜나 시간 간격 기반 실행
  2. 클러스터링 및 분산 환경 지원
    • Quartz는 DB 기반 클러스터링을 통해 여러 서비스 노드 간에 작업 실행을 관리
    • 클러스터링 설정 시 하나의 작업이 중복 실행되지 않도록 보장
  3. 작업 실패 처리 (Misfire Handling)
    • 스케줄링 실패(예: 리소스 부족) 시 후속 처리 규칙 정의 가능
  4. 작업 상태 저장
    • Quartz는 작업(Job)과 트리거(Trigger)를 메모리(RAM) 또는 DB에 저장 가능
    • DB 저장소(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();
    }
}

2. Spring Scheduler VS Quartz Scheduler 비교

기능 항목Spring SchedulerQuartz Scheduler
간단한 설정어노테이션 기반으로 간단히 설정 가능XML 또는 Java Config를 통한 복잡한 설정 필요
동적 작업 추가/제거미지원동적 작업 추가 및 제거 가능
복잡한 트리거 지원크론 표현식 정도만 지원CronTrigger, CalendarIntervalTrigger 등 다양
클러스터링미지원DB 기반 클러스터링 지원
작업 상태 저장미지원RAM 또는 DB를 통해 작업 상태 저장 가능
작업 실패 처리미지원Misfire Handling 기능 제공
성능경량, 단순 작업에 적합고급 기능 제공, 상대적으로 무거움
의존성 추가 필요 여부추가 의존성 불필요spring-boot-starter-quartz 필요
확장성제한적매우 우수

3. Quartz Scheduler의 고급 기능

3.1 클러스터링

  • Quartz는 DB 기반 클러스터링을 통해 여러 노드 간에 스케줄링 상태를 공유하며, 단일 노드에서만 작업이 실행되도록 보장합니다.
  • Spring Scheduler는 클러스터링 기능이 없으므로, 단일 애플리케이션 환경에서만 적합합니다.

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

3.2 작업 실패 처리 (Misfire Instructions)

Quartz는 작업 실패 시 Misfire Instructions를 통해 후속 처리 방법을 정의할 수 있습니다.

  • 예: 트리거가 지연되었을 때 즉시 실행 또는 스케줄 재조정 가능

예시 코드

SimpleScheduleBuilder builder = SimpleScheduleBuilder.simpleSchedule()
    .withIntervalInSeconds(10)
    .repeatForever()
    .withMisfireHandlingInstructionFireNow(); // 실패 시 즉시 실행

4. 추천 시나리오

추천 시나리오Spring SchedulerQuartz Scheduler
단순 주기적 작업크론 표현식이나 고정 간격으로 간단한 작업 처리불필요 (Spring Scheduler가 더 적합)
동적 작업 추가/제거 필요불가능동적 작업 추가 및 제거 가능
여러 노드에서 작업 관리불가능클러스터링을 통해 노드 간 작업 상태 공유 가능
작업 실패 복구기본적으로 미지원Misfire Handling을 통해 후속 조치 가능
복잡한 트리거 설정 필요복잡한 스케줄에 부적합다양한 트리거 제공 (CronTrigger, CalendarIntervalTrigger 등)
확장성소규모 프로젝트나 단순 작업 스케줄링엔터프라이즈 환경, 복잡한 요구사항 처리

5. 결론

  1. Spring Scheduler를 선택해야 하는 경우
    • 단순하고 빠르게 주기적인 작업을 설정해야 할 때
    • 클러스터링이 필요하지 않으며, 작업 실패 복구가 중요하지 않을 때
    • Spring Boot 환경에서 별도의 설정 없이 간단히 스케줄링을 구현하고자 할 때
  2. Quartz Scheduler를 선택해야 하는 경우
    • 동적 작업 추가/제거가 필요한 경우
    • 복잡한 트리거 설정 및 작업 실패 복구가 요구되는 경우
    • 여러 서비스 노드 간에 스케줄링 작업을 클러스터링하여 관리해야 할 때
profile
배우고 느낀점들을 기록합니다. 열정 넘치는 백엔드 개발자로 남고싶습니다.

0개의 댓글