Spring Scheduler

스케줄러는 스프링 프레임워크에 포함된 기능입니다. 특정 시간이나 정해진 주기에 따라 작업을 수행하는데 사용하는데 오늘은 이 기능에 대해서 알아봅시다.

 

 

 

사용방법

 

설정

Spring Scheduler를 사용하기 위해서는 @EnableScheduling 어노테이션을 선언해주어야 합니다.

@EnableScheduling
@SpringBootApplication
public class Application {

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

}

 

 

구현

다음은 스케줄을 구현하면되는데 스프링 빈으로 등록되어야지 동작합니다.

@Component
public class TestSchedule {

    @Scheduled(fixedRate = 1000)
    public void test() {
        System.out.println("TestSchedule");
    }

}

 

 

실행해보면 1초간격으로 동작하는것을 확인할 수 있습니다.

 

 

 

@Scheduled 사용법

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
public @interface Scheduled {
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";

    TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

    String scheduler() default "";
}

 

  1. cron
    • 표현식을 이용해 스케줄을 지정할 수 있습니다. 
    • "초 분 시 일 월 요일" 형식으로 작성합니다.
    • 자세한 설명을 글 하단에서 하겠습니다.
  2. zone
    • cron 표현식에서 사용할 시간대를 지정합니다.
    • default 는 서버의 로컬 시간대입니다.
    • "Asia/Seoul", "UTC" 등
  3. fixedDelay, fixedDelayString
    • 이전 작업의 종료시점부터 다음 작업의 시작까지의 지연시간입니다.
    • default fixedDelay = 1000 : 1초 (이전 작업 완료 후 1초 뒤 실행)
    • 단위는 timeUnit에 따라 변경될 수 있습니다.
  4. fixedRate, fixedRateString
    • 이전 작업의 시작지점부터 다음 작업의 시작까지의 시간간격입니다.
    • default fixedRate = 1000 : 1초 (이전 작업 시작으로부터 1초 마다 실행)
    • 단위는 timeUnit에 따라 변경될 수 있습니다.
  5. initialDelay, initalDelayString
    • 애플리케이션 시작 후 첫 작업이 실행되기까지의 지연시간을 지정할 수 있습니다.
    • default는 위와 같습니다.
    • 단위는 timeUnit에 따라 변경될 수 있습니다.
  6. timeUnit
    • fixedDelay, fixedRate, initialDelay의 시간단위를 지정합니다.
    • default TimeUnit.MILLISECONDS
  7. scheduler
    • 스케줄러의 이름을 지정할 수 있습니다.
@Scheduled(cron = "0 0 12 * * ?")  // 매일 12시에 실행
public void test1() {
    // 작업 내용
}

@Scheduled(fixedRate = 5000)  // 5초마다 실행
public void test2() {
    // 작업 내용
}

@Scheduled(fixedDelay = 1000, initialDelay = 5000)  // 시작 5초 후 첫 실행, 이후 1초 간격으로 실행
public void test3() {
    // 작업 내용
}
  •  

 

 

 

cron

cron은 "초 분 시 일 월 요일" 형식으로 된 String 문자열입니다.

필드 허용값
0 - 59
0 - 59
0 - 23
1 - 31
1- 12 | JAN-DEC
요일 0 - 6 | SUN - SAT

 

cron 특수문자

특수문자 설명 예제
* 모든 값  
? 특정한 값이 없음 일, 요일에서만 사용가능
- 범위를 나타냄 1-3 : 1월 ~ 3월
, 값을 여러개 나열 MON,SAT,SUN : 월,토,일
/ 시작시간과 단위 분에서 1/5 : 1분부터 5분단위로
L 마지막 값 일, 요일에서만 사용가능
일에서 사용하면 마지막 일,
요일에서 사용하면 마지막 요일(6)
W 가장 가까운 평일 일 에서만 사용가능
1W : 1일에서 가장 가까운 평일
# 몇째주의 무슨요일 0#3 : 3번째 주 일요일

 

 

 

cron 예제

// 매일 자정에 실행
@Scheduled(cron = "0 0 0 * * ?")

// 평일 오전 9시에 실행
@Scheduled(cron = "0 0 9 * * MON-FRI")

// 매월 1일 오전 3시에 실행
@Scheduled(cron = "0 0 3 1 * ?")

// 매주 일요일 자정에 실행
@Scheduled(cron = "0 0 0 ? * SUN")

// 매월 마지막 날 오후 11시 45분에 실행
@Scheduled(cron = "0 45 23 L * ?")

// 매월 마지막 토요일 오후 10시에 실행
@Scheduled(cron = "0 0 22 ? * 6L")

// 매월 첫번째 화요일 오전 9시에 실행
@Scheduled(cron = "0 0 9 ? * 2#1")

// 매일 오전 9시부터 오후 5시까지 30분마다 실행
@Scheduled(cron = "0 0/30 9-17 * * ?")

// 매일 10시 15분에 실행
@Scheduled(cron = "0 15 10 * * ?")

// 매주 월요일 10시에 실행
@Scheduled(cron = "0 0 10 ? * MON")

// 매주 월,수,금 10시에 실행
@Scheduled(cron = "0 0 10 ? * MON,WED,FRI")

// 15분마다 실행
@Scheduled(cron = "0 0/15 * * * ?")

// 평일 9시-18시 정각마다 실행
@Scheduled(cron = "0 0 9-18 * * MON-FRI")

// 매월 마지막날 12시에 실행
@Scheduled(cron = "0 0 12 L * ?")

// 매월 마지막 평일 12시에 실행
@Scheduled(cron = "0 0 12 LW * ?")

 

 

설정분리

schedule.cron=3 * * * * ?
schedule.enabled=true

application.properties에 설정값을 분리하고

 

@Component
public class TestSchedule {

    @Value("${schedule.enabled}")
    private boolean enabled;

    @Scheduled(cron = "${schedule.cron}")
    public void test() {
        if (enabled) {
            System.out.println("TestSchedule");
        }
    }

}

 

이렇게 작성하면 설정부분과 실행부분을 나눌 수 있어서 좋은것 같습니다.

+ Recent posts