Spring 스케쥴링 (@scheduled 어노테이션) 및 Cron표현식

 프로젝트를 진행하다보면 일정시간마다 작동해야하는 서비스가 존재할 수 있다.

 

 처음에는 어떻게 구현해야할지 몰라서

스레드를 통해서 구현할까 생각도 했었는데 스레드를 사용하게되면 스레드에서 원하는 시간조건을 sleep 통해 걸어줘야하고 조건을 걸기가 좀 귀찮은 측면이 존재한다.

 

하지만 스프링에서 지원하는 scheduler를 사용하면 간편하게 구현할 수 있다.

 

시간조건 또한 Cron 표현식을 통해서 어렵지 않게 작성할 수 있다.

이를 사용하기위해선 servlet.xml 설정을 해야하는데 이는 생략한다.

 

클래스파일을 등록하는 것은 간단하다. 클래스에 @Component 어노테이션을 달아주고

메소드 앞에 스케쥴 어노테이션을 작성해주면된다.

@Component
public class Scheduler {
	
	/**
	 * 1. 매월 1일 새벽 2시에 자동으로 결재완료하는 스케쥴러
	 */
	// * 을 입력할경우 모두(항상)으로 설정함.
	//                 초  분  시  일  월  요일
	@Scheduled(cron = "0 14 14 * * *")
	public void autoUpdate(){
		System.out.println("오후 02:14:00에 호출이 됩니다 ");
	}
	
}

- Cron 표현식

기본적인 표현식의 의미는 다음과 같다.

초 | 분 | 시 | 일 | 월 | 요일 | 연도

0~59 | 0~59 | 0~23 | 1~31 | 1~12 | 0~6 | 생략가능

필드 값의 허용 범위  허용된 특수문자 
초 (Seconds) 0 ~ 59 , - * /
분 (Minutes) 0 ~ 59 , - * /
시 (Hours) 0 ~ 23 , - * /
일 (Day) 1 ~ 31 , - * ? / L W
월 (Month) 1 ~ 12 or JAN ~ DEC , - * /
요일 (Week) 0 ~ 6 or SUN ~ SAT , - * ? / L #
연도 (Year) empty or 1970 ~ 2099 , - * /

 

 Cron 표현식 - 특수문자

 각 특수문자의 의미

  * : 모든 값

  ? : 특정한 값이 없음

  - : 범위 (예) 월요일에서 수요일까지는 MON-WED로 표현

  , : 특별한 값일 때만 동작 (예) 월,수,금 MON,WED,FRI 

  / : 시작시간 / 단위  (예) 0분부터 매 5분 0/5

  L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)

  W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음

  # : 몇째주의 무슨 요일을 표현 (예) 3#2 : 2번째주 수요일

 

 크론식은 유닉스 계열 운영체제의 작업 스케쥴러인데 이를 Java에서도 사용할 수 있도록 스프링프레임워크에서

라이브러리를 포함하고 있는 것이다.

 

그렇기 때문에 원래 크론표현식에서 지원하는 표현식 몇몇 지원하지 않는 표현식이 있다.

 

그중 하나가 일과 요일에 사용할 수 있는 특수문자에 L 이다.

L은 마지막 일, 요일을 의미하는 특수문자인데 이를 스프링 스케쥴러 라이브러리에서는 지원하고 있지 않고 있다.

따라서 매년 매년 12월 말일 23시 59분 59초 실행에 실행해야하는 서비스가 있다면 

 

@Scheduled(cron = "59 59 23 L 12 ?") 이 아니라 @Scheduled(cron = "59 59 23 28-31 12 ?") 이렇게 작성해준다.