[Spring] Quartz 스케줄러

김동욱·2023년 9월 17일
0

Spring

목록 보기
1/3
post-thumbnail

Quartz 스케줄러란?

쿼츠란 자바에서 사용할 수 있는 오픈 Job Scheduling 라이브러리입니다.
쿼츠를 통해 작업을 정의하고 스케줄을 설정하는 기능을 제공합니다.

Batch와 Scheduler

Spring Batch와 개념이 혼동될 수 있지만 둘은 비슷하면서 다른 동작을 합니다.
Batch는 대량의 데이터를 일괄적으로 처리하는 방식을 말하며, Scheduler는 특정 작업이 언제 처리되는지를 관리합니다.

예를 들어, Batch는 매일 밤 사용자가 없는 시간대에 정해진 무엇인가를(대체로 대량의 데이터) 처리하는 일을 하고 스케줄러는 매일 밤 10시 특정 데이터를 백업하는 작업을 하는 등 언제 데이터를 처리하는지를 다룹니다.

왜 Quartz를 사용할까요?

스프링에는 @Scheduled 어노테이션을 사용한 스케줄러가 있지만 왜 쿼츠 스케줄러를 사용할까요??

  1. 클러스터링(Clustering) : 여러 서버에 동일한 작업을 실행하는 클러스터 환경을 지원합니다.
  2. cron 표현식 이외에도 다양한 트리거 설정을 통해 복잡한 표현식을 나타낼 수 있습니다.
  3. in-memory job scheduler

Quartz 구성 요소

  1. Job : 스케줄링을 통해 실행될 작업을 정의하는 인터페이스로 execute() 메소드로 실제 구현을 정의합니다.
  2. JobDetail: job의 인스턴스에 대한 세부 정보를 유지합니다.
  3. Trigger: 작업이 실행되는 주기를 결정합니다. simpleTrigger, Crontrigger 등 여러 트리거가 있습니다.
  4. Scheduler:: job과 trigger를 사용하여 실제 작업 스케줄링을 합니다.

사용법

예를 들어, 게시글을 작성 1시간 후 자동삭제되는 게시판을 만든다고 해봅시다.

  1. job : 1시간 후 삭제될 deleteBoard라는 작업이 필요합니다. 해당 클래스는 job 인터페이스를 구현하여 작성되고 실제 게시물 삭제 처리를 진행합니다.

  2. trigger: 게시글 작성 1시간 후 라는 트리거가 필요합니다.

  3. Scheduler 등록: 해당 trigger와 job을 스케줄러에게 등록해줍니다.

  • gradle 추가
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-quartz', version: '2.3.2.RELEASE'
  • Job 정의 ( DeleteBoardJob)
public class DeleteBoardJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
    }
}
  • Trigger 생성
private Trigger buildTrigger(String postId, LocalDateTime postTime) {
    LocalDateTime deleteTime = postTime.plusHours(1);

    return TriggerBuilder.newTrigger()
            .withIdentity("trigger_" + postId, "postGroup")
       .startAt(Date.from(deleteTime.atZone(ZoneId.systemDefault()).toInstant()))
       .withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
            .build();
}
  • Scheduler 에 등록
public void scheduleDeletePost(String postId, LocalDateTime postTime) {
    JobDetail jobDetail = buildJobDetail(postId);
    Trigger trigger = buildTrigger(postId, postTime);

    try {
        scheduler.scheduleJob(jobDetail, trigger);
    } catch (SchedulerException e) {
        log.error("Error scheduling job for post {}", postId);
        throw new RuntimeException(e);
    }
}

private JobDetail buildJobDetail(String postId) {
  return JobBuilder.newJob(DeleteBoardJob.class)
          .withIdentity("deletePostJob_" + postId)
          .usingJobData("postId", postId)
          .build();
}
profile
안녕하세요. 공부해요

0개의 댓글