쿼츠란 자바에서 사용할 수 있는 오픈 Job Scheduling 라이브러리입니다.
쿼츠를 통해 작업을 정의하고 스케줄을 설정하는 기능을 제공합니다.
Spring Batch와 개념이 혼동될 수 있지만 둘은 비슷하면서 다른 동작을 합니다.
Batch는 대량의 데이터를 일괄적으로 처리하는 방식을 말하며, Scheduler는 특정 작업이 언제 처리되는지를 관리합니다.
예를 들어, Batch는 매일 밤 사용자가 없는 시간대에 정해진 무엇인가를(대체로 대량의 데이터) 처리하는 일을 하고 스케줄러는 매일 밤 10시 특정 데이터를 백업하는 작업을 하는 등 언제 데이터를 처리하는지를 다룹니다.
스프링에는 @Scheduled 어노테이션을 사용한 스케줄러가 있지만 왜 쿼츠 스케줄러를 사용할까요??
예를 들어, 게시글을 작성 1시간 후 자동삭제되는 게시판을 만든다고 해봅시다.
job : 1시간 후 삭제될 deleteBoard라는 작업이 필요합니다. 해당 클래스는 job 인터페이스를 구현하여 작성되고 실제 게시물 삭제 처리를 진행합니다.
trigger: 게시글 작성 1시간 후 라는 트리거가 필요합니다.
Scheduler 등록: 해당 trigger와 job을 스케줄러에게 등록해줍니다.
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-quartz', version: '2.3.2.RELEASE'
public class DeleteBoardJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { } }
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(); }
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(); }