spring Quartz

BackEnd_Ash.log·2022년 5월 2일
2

✅ Quartz 란 ?

Quartz 는 다양한 Java 어플리케이션에 통합 될 수 있는 작업 스케쥴링 라이브러리 이다.

Spring 에서는 두가지 방식이 존재한다.

  • Spring Scheduler
  • Spring Quartz

📌 Spring Scheduler

Spring Scheduler 는 spring boot starter 에서 기본적으로 포함된 라이브러리이다.
별도의 추가적인 의존성이 필요하지 않습니다.
Spring Boot starter 에 기본적인 의존성으로 제공된다.

그래서 비교적 간단히 사용 할 수가 있다.

  1. Application 클래스에 @EnableScheuling 을 붙인다.
@EnableScheduling
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}
  1. 스케쥴링 하고싶은 메서드에 @Scheduled 어노테이션 메서드를 붙인다.
    해당 어노테이션의 내부 값에는 scheduler 가 실행 될 타이밍을 정 할 수 있다.
   @Scheduled(fixedDelay = 30000)
    @GetMapping("/imageDetails")
    public List<ImageDetail> getImageDetails() {
        log.info("getImageDetails - spring scheduler");
        List<ImageDetail> data = ConditionService.getImageDetails(buildClient());
        ConditionService.saveImageDetails(data);
        return data;
    }

cron : cron표현식을 지원한다. "초 분 시 일 월 요일 (년)"으로 표현한다. cron표현식에 쓸 수 있는 것들(특수문자 활용 포함)이 많은데 해당 내용이 핵심이 아니므로 다른 블로그에서 확인해보기를 바란다.

fixedDelay : milliseconds 단위로, 이전 작업이 끝난 시점으로 부터 고정된 시간을 설정한다. ex) fixedDelay = 5000

fixedDelayString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedDelay = "5000"

fixedRate : milliseconds 단위로, 이전 작업이 수행되기 시작한 시점으로 부터 고정된 시간을 설정한다. ex) fixedRate = 3000

fixedRateString : fixedDelay와 같은데 property의 value만 문자열로 넣는 것이다. ex) fixedRate = "3000"

initialDelay : 스케줄러에서 메서드가 등록되자마자 수행하는 것이 아닌 초기 지연시간을 설정하는 것이다.

initialDelayString : 위와 마찬가지로 문자열로 값을 표현하겠다는 의미다.

zone : cron표현식을 사용했을 때 사용할 time zone으로 따로 설정하지 않으면 기본적으로 서버의 time

📌 Spring Quartz

Spring QuartzSpring Scheduler 와 달리 해당 라이브러리의 의존성을 추가해야한다.

Spring 에서는 의존성을 build.gradle 에서 설정하면 된다.

implementation "org.springframework.boot:spring-boot-starter-quartz"

Quartz 에는 몇가지 필수적으로 구현해야 할 요소와 옵셔널하게 선택적으로
구현할 수 있는 요소가 몇가지 있다.

Job - 실제 작업을 수행하는 객체
JobDetail - 잡에 대한 상세 정보
Trigger - job을 수행하기 위한 조건을 정의한 객체(수행 주기, 수행 기간 등)
Listener - 작업의 시작, 중간, 끝, 에러 처리

JOB

실제로 실행되는 로직
Quartz에서 interface로 제공하며 해당 interface를 구현하면 된다.

@Configuration
public class CollectJob implements Job {

  private final CollectService collectService;

  public CollectJob(CollectService collectService) {
    this.collectService = collectService;
  }

  @Override
  public void execute(JobExecutionContext context) throws JobExecutionException {
    System.out.println("[Collect] collect Job Start...");
  }
}

JobDetail

Job을 실행시키기 위한 구체적인 정보를 가지고 있는 인스턴스이다.
JobBuilder API를 통해 만들 수 있다.
Job 에 대한 설명 Job 의 ID 등을 설정 할 수 있다.

@Bean
public JobDetail tistoryJobDetail() {
return JobBuilder.newJob().ofType(CollectJob.class)
    .storeDurably()
    .withIdentity("job_detail")
    .withDescription("Job service...")
    .build();
}

Trigger

Trigger 는 Job이 실행되는 실행 조건을 가지고 있는 인스턴스이다.
TriggerBuilder API를 통해 만들 수 있다.

@Bean
public Trigger tistoryTrigger(@Qualifier("tistoryJobDetail") JobDetail job) {
return TriggerBuilder.newTrigger().forJob(job)
    .withIdentity("tistory_job_trigger")
    .withSchedule(cronSchedule("0 0 9 * * ?")
        .inTimeZone(TimeZone.getTimeZone("Asia/Seoul")))
    .build();
}

spring:
  quartz:
    job-store-type: memory

✅ 결론

세밀한 작업이 필요하다 생각이 들면, Quartz 사용하면 되고 ,
그게 아니라면 Scheduling 을 사용하면 될것같다.

profile
꾸준함이란 ... ?

0개의 댓글