본문 바로가기

Language/Spring

[Spring Boot] 정해진 시간마다 동작하는 Scheduler

@Scheduled

  • 일정 시간을 간격 또는 특정 시간마다 코드가 실행되도록 설정하는 어노테이션

 

사용법

  • @Schelduled를 사용하기 위해서는 Application에게 Schedular를 사용하겠다는 것을 알리기 위해 @EnableScheduling을 선언
@EnableScheduling
@SpringBootApplication
public class SchedulerApplication {
	public static void main(String[] args) {
    	SpringApplication.run(DemoApplication.class, args);    
    } 
}

 

스케쥴링을 작업할 클래스 생성

@Service
public class SchedulerService {
    @Scheduled(fixedRate = 1000) // 1초마다 실행
    public void run(){
        System.out.println("Hello Scheduler");
    }
}

주의할 점은 @Component(@Controller, @Service, @Repository)
즉, 스프링 빈에 등록된 클래스만 스케쥴을 사용할 수 있다는 점

 

@Scheduled 규칙

  • 메서드의 반환 타입반드시 void
  • 매개 변수 사용 불가

 

@Scheduled 속성 (milliseconds 단위)

  • fixedDelay : 이전 Task(작업)의 종료 시점을 기준으로 정의된 시간만큼 지난 후 Task(작업)을 실행
@Scheduled(fixedDelay = 1000)
public void run(){
    System.out.println("Hello Scheduler");
}
  • fixedDelayString : fixedDelay와 동일하고, 문자열로 단위를 표기
@Scheduled(fixedDelayString = "1000")
public void run(){
    System.out.println("Hello Scheduler");
}
  • fixedRate : 이전 Task(작업)의 시작 시점을 기준으로 정의된 시간만큼 지난 후 Task(작업)을 실행
@Scheduled(fixedRate = 1000)
public void run(){
    System.out.println("Hello Scheduler");
}
  • fixedRateString : fixedRate와 동일하고, 문자열로 단위를 표기
@Scheduled(fixedRateString = "1000")
public void run(){
    System.out.println("Hello Scheduler");
}
  • cron : cron 표현식을 사용하여 작업을 예약
@Scheduled(cron = "* * * * * *")
public void run(){
    System.out.println("Hello Scheduler");
}

 

첫 번째 별(*)부터 마지막 별(*)까지 의미

초(0-59) / 분(0-59) / 시(0-23) / 일(1-31) / 월(1-12) / 요일(0-6)

  • 요일 → 0 : 일, 1 : 월, 2 : 화, ... , 6 : 토

 

Cron 표현식

  • * : 모든 조건을 의미
    • 매초, 매시, 매분, 매일, 매월 등
  • ? : 설정값 없음
    • 날짜와 요일에서만 사용 가능
  • - : 범위를 지정할 때 사용
  • , : 여러 값을 지정할 때 사용
  • / : 증분값
    → 즉, 초기값과 증가치 설정에 사용
  • L : 마지막
    → 지정할 수 있는 범위의 마지막 값 설정 시 사용
    • 날짜와 요일에서만 사용 가능
  • W : 가장 가까운 평일을 설정할 때 사용
    • Ex) 10W
    • 10일평일일 경우 → 10일에 실행
    • 10일토요일일 경우 → 가장 가까운 평일인 9일(금요일)에 실행
    • 10일일요일일 경우 → 가장 가까운 평일인 11일(월요일)에 실행
  • # : N번째 주 특정 요일을 설정할 때 사용
    • 요일에서만 사용 가능
    • Ex) 4#2 → 둘째주 목요일에 실행
  • zone : cron 표현식을 사용할 때의 time zone으로 설정하지 않으면 기본적으로 Local의 Time zone
@Scheduled(cron = "* * * * * *", zone = "Asia/Seoul")
public void run(){
    System.out.println("Hello Scheduler");
}

 

Cron 사용 예시

@Scheduled(cron = "0 0 18 * * *", zone = "Asia/Seoul")
public void execute1(){
    System.out.println("Hello Scheduler");
}

// 매월 10일, 20일 14시에 실행
@Scheduled(cron = "0 0 14 10,20 * ?", zone = "Asia/Seoul")
public void execute2(){
    System.out.println("Hello Scheduler");
}

// 매월 마지막날 22시에 실행
@Scheduled(cron = "0 0 22 L * ?", zone = "Asia/Seoul")
public void execute3(){
    System.out.println("Hello Scheduler");
}

// 1시간 마다 실행
@Scheduled(cron = "0 0 0/1 * * *", zone = "Asia/Seoul")
public void execute4(){
    System.out.println("Hello Scheduler");
}

// 매일 9:00 ~ 9:55, 18:00 ~ 18:55 사이에 5분 간격 실행
@Scheduled(cron = "0 0/5 9,18 * * *", zone = "Asia/Seoul")
public void execute5(){
    System.out.println("Hello Scheduler");
}


// 매일 09:00 ~ 18:55 사이에 5붠 간격 실행
@Scheduled(cron = "0 0/5 9-18 * * *", zone = "Asia/Seoul")
public void execute6(){
    System.out.println("Hello Scheduler");
}

// 매달 1일 10시 30분에 실행
@Scheduled(cron = "0 30 10 1 * *", zone = "Asia/Seoul")
public void execute7(){
    System.out.println("Hello Scheduler");
}

// 매년 3월, 월~금 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? 3 1-5", zone = "Asia/Seoul")
public void execute8(){
    System.out.println("Hello Scheduler");
}

// 매월 마지막 토요일 10시 30분에 실행
@Scheduled(cron = "0 30 10 ? * 6L", zone = "Asia/Seoul")
public void execute9(){
    System.out.println("Hello Scheduler");
}