티스토리 뷰

카테고리 없음

Quartz Scheduler 소개

행복[HappY] 2025. 3. 10. 09:40

Quartz Scheduler란?

Quartz Scheduler자바 기반의 오픈소스 스케줄링 라이브러리로, 특정 시간에 작업(작업(Job)이라고 함)을 실행할 수 있도록 도와줍니다. 단순한 예약 작업부터 복잡한 일정 관리까지 다양한 기능을 제공하며, Spring Boot와 통합하여 많이 사용됩니다.

 

 

 

1. Quartz Scheduler의 주요 특징

  1. 정확한 일정 관리: Cron 표현식 및 SimpleTrigger를 사용하여 일정 설정이 가능합니다.
  2. 분산 환경 지원: 여러 개의 Quartz 인스턴스를 클러스터로 구성할 수 있습니다.
  3. 다양한 트리거 제공: 일정한 간격으로 실행(SimpleTrigger), 특정 시간에 실행(CronTrigger) 등을 지원합니다.
  4. 작업의 영속성 지원: H2, MySQL 등 데이터베이스를 활용하여 작업 정보를 저장할 수 있습니다.
  5. 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 사용 방법

  1. 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=
  1. 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와 쉽게 통합할 수 있습니다.
  • SimpleTriggerCronTrigger를 활용하여 다양한 일정 관리가 가능합니다.
  • RAMJobStoreJDBCJobStore를 선택하여 Job 정보를 저장하는 방식도 조정할 수 있습니다.
  • JobDataMap을 활용하여 외부 데이터를 전달할 수 있으며, 분산 환경에서도 안정적으로 동작합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함