배치와 스케줄러는 동등한 비교 대상이 아님!
단순한 Scheduling에 따른 작업이 필요하다면
→ Spring Scheduler
좀 더 Scheduling의 세밀한 제어가 필요할 때
만들어야 하는 Scheduling 서비스 노드가 멀티이기 때문이 클러스팅이 필요할 때
→ Spring Quartz
서비스 노드가 멀티 : 서비스를 제공하는 노드가 여러 대 (다수의 서버 또는 인스턴스)로 구성되어 있다는 말
클러스터링 : 여러 컴퓨터 또는 서버가 네트워크로 연결되어 하나의 시스템처럼 동작하도록 구성되는 컴퓨팅 환경.
결론 : 스프링 쿼츠는 서버가 여러개인 서비스에서 적당하다 !
SpringBoot Starter에 기본 제공됨 (별도의 의존성 추가 필요 없음)
사용하기
@EnableScheduling
어노테이션을 붙인다.@EnablingScheduling
@SpringBootApplication
public class Application() {
public static void main(String[] args) {
SpringApplication.run(Application.class, args)
}
}
스케줄링을 원하는 메소드에 @Scheduled
어노테이션을 붙여주면 된다.
스케줄링을 할 메서드는 아래 두개의 조건을 만족해야 한다.
return type이 void일 것
parameter가 없을 것
public class Scheduler() {
@Scheduled(fixedDelay = 1000) // scheduler 끝나는 시간 기준으로 1000ms 간격으로 실행)
public void scheduleFixedDelayTask() {
System.out.println(
"Fixed delay task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(fixedRate = 1000) // scheduler 시작하는 시간 기준으로 1000 간격으로 실행
public void scheduleFixedRateTask() {
System.out.println(
"Fixed rate task - " + System.currentTimeMillis() / 1000);
}
@Scheduled(cron = "0 15 10 15 * ?") // 매일 일정한 시간에 실행 가능. cron에 따라 실행.
public void scheduleTaskUsingCronExpression() {
long now = System.currentTimeMilllis() / 1000;
System.out.println(
"schedule tasks using cron jobs - " + now);
@Scheduled(cron = "0 15 10 15 * ?", zone = "Europe/Paris") // cron에 TimeZone 설정 추가
💡Cron 표현법
@EnableAsync
어노테이션을 이용