본문 바로가기

Development/Etc

[JAVA, UNIX] Cron 표현식

728x90

크론(Cron) 표현식에 대해서 정리하고자 합니다.

 

Spring의 스케줄링을 하기 위해서는 여러가지 방법 중 가장 많은 방법으로 활용되고 있는 것이 Cron 표현식입니다.

스케줄링이란 수동으로 처리해야 하는 반복적인 작업을 특정 시간에 자동화하는 것을 말합니다.

스케줄링은 기본적으로 각 OS에도 존재하며 각 언어에서도 존재합니다.

Java에서는 Quartz 라이브러리와 Spring 프레임워크의 @Scheduled 주석을 사용하여 작업을 쉽게 스케줄링 할 수 있습니다.

그럼 Cron 표현식에 대해서 간단하게 알아보겠습니다.

 

Quartz에서의 Cron 표현식

Quartz에서의 Cron 표현식은 공백으로 구분된 최대 7개의 필드로 구성된 문자열을 나타내며, 각각은 특정 날짜 및 시간 단위를 나타냅니다.

필드 필수/선택 허용값 허용 특수 문자
필수 0-59 , - * /
필수 0-59 , - * /
시간 필수 0-23 , - * /
일자 필수 1-31 , - * / ? L W
필수 0-11 (또는 JAN-DEC) , - * /
요일 필수 1-7 (또는 SUN-SAT) , - * / ? L C #
년도 선택 1970-2099 (또는 생략) , - * /

필드 허용 값 설명

  • 초, 분 - 0-59 : 0초~59초 의미
  • 시간 - 0-23 : 0시~ 23시 의미
  • 일자 - 1-31 : 1일~31일 의미
  • 월 - 0-11(JAN-DEC) : 1월~12월 의미
    1월: 0, JAN | 12월: 11, DEC)
    영문표기시 3문자로 구성된것을 사용
  • 요일 - 1-7(SUN-SAT) : 일요일~토요일 의미
    일요일: 1, SUN | 토요일: 7, SAT
    영문표기시 3문자로 구성된것을 사용
  • 년도 - 4자리수 년도를 사용

Quartz에서는 년도를 제외하고 모든 필드는 반드시 알려줘야 하는 값들 입니다. 만약 년도를 생략하지 않았다면 매년마다 실행하는 것을 의미합니다.

Unix에서의 Cron 표현식

앞서 Quartz에서의 Cron식과는 조금 다릅니다.

필드 필수/선택 허용값 허용 특수 문자
필수 0-59 , - * /
시간 필수 0-23 , - * /
일자 필수 1-31 , - * /
필수 1-12 (또는 JAN-DEC) , - * /
요일 필수 0-6 (또는 SUN-SAT) , - * /

필드 값 설명

  • 분 - 0-59 : 0초~59초 의미
  • 시간 - 0-23 : 0시~ 23시 의미
  • 일자 - 1-31 : 1일~31일 의미
  • 월 - 1-12(JAN-DEC) : 1월~12월 의미
    1월: 1, JAN | 12월: 12, DEC)
    영문표기시 3문자로 구성된것을 사용
  • 요일 - 0-6(SUN-SAT) : 일요일~토요일 의미
    일요일: 0, SUN | 토요일: 6, SAT
    영문표기시 3문자로 구성된것을 사용

Unix의 Cron 표현식은 5개의 필드로 구성되며, 그 뒤에 실행하고 싶은 명령을 사용합니다.

Quartz와 달리 초와 연도를 지정할 수 있는 특정 필드가 없습니다. 따라서 현재 연도의 작업 스케줄링에 초점을 맞춥니다.

Cron 표현식에서의 ?

Quartz와 Unix의 Cron 표현식에서 필드 말고도 허용 특수 문자가 다릅니다.

대표적으로 Quartz에서는 물음표 기호(?) 가 있지만 Unix에서는 사용 할 수 없습니다.

Quartz에서 "?"는 특정 값을 나타내지 않는 것을 말합니다.

Quartz의 Cron 표식에서는 날짜와 요일을 지정하는 필드 내에서만 사용 할 수 있는데요.

월의 일과 요일 필드는 상호 배타적인 점을 볼때, 같은 표현식에서 두 필드에 대한 값을 지정할 수 없습니다.

0 30 10 1 OCT 2 2023

 

위 예제는 오류를 발생시킵니다. Cron 표현식을 보기 쉽게 표로 구성하면 다음과 같습니다.

시간 일자 요일 년도
0 30 10 1 OCT 2 2023

 

달력에서 살펴보면 2023년 10월 1일은 일요일입니다. 그런데 요일은 월요일입니다. 따라서 유효하지 않게 됩니다.

설령 올바른 요일에 해당하는 날짜를 사용하더라도 Cron 표현식은 유효하지 않습니다.

0 30 10 30 OCT 2 2023

위의 값은 2023년 10월 30일 월요일로 겹치도록 설정하였지만 작동되지 않습니다.

 

일과 요일 두 필드는 모두 필수적으로 필요한 필드이므로 값을 반드시 넣어야 합니다. 이때 값이 설정되지 않았음을 나타내기 위해 물음표(?) 기호를 넣어주면 해당 필드는 무시하게 됩니다.

0 0 0 30 OCT ?

위의 Cron 표현식은 매년 10월 30일 자정에 실행됩니다.

 

또한 " ? " 기호는 Cron표현식에서 단 한 번만 사용할 수 있습니다. 만약 두 값을 모두 ?로 설정하면 오류가 발생합니다.

0 30 * ? OCT ?

Cron 표현식의 *

반면에 Cron 표현식의 별표(*) 기호는 모든 값을 의미합니다. 즉 " * "로 표현되 필드는 정의 된 모든 값을 설정하는데 사용한다는 뜻입니다.

또한 물음표(?) 기호와 다르게 모든 필드에서 " * "를 사용할 수 있습니다.

모든 시간을 포함하는 설정을 Cron 표현식의 예제는 다음과 같습니다.

0 30 * 1 OCT ?
시간 일자 요일 년도
0 30 * 1 OCT ?  

이 작업은 10월 1일 매시 30분 0초에 실행되는 것을 의미합니다.

또한 " * "를 여러 필드에서 사용 가능합니다.

* * * * OCT ?

이 작업은 10월 매일, 매초 실행되는 것을 의미합니다.

Linux Cron의 일자 및 요일

Linux에서의 Cron 표현식의 일자 및 요일 필드는 Quartz의 것과 다르게 동작합니다.

첫째, 상호 배타적이지 않습니다.  즉 우리는 두 값을 같은 cron 표현식에 설정할 수 있습니다.

둘째, 두 필드 모두 별표 이외의 값을 포함하는 경우 이들은 합집합을 형성합니다.

30 10 1 10 5

위의 예시에서 작업은 10월 1일과 매주 금요일 오전 10시 30분에 실행됩니다.

셋째, 값 중 하나가 별표로 시작하면 교집합을 형성합니다.

30 10 */1 * 1

이 경우 작업은 월요일 경우에만 매일 10:30에 실행됩니다.

* 와 ? 의 비교

마지막으로 Cron 표현식에서 별표(*)와 물음표(?) 기호의 차이점을 살펴보자.

" * " 상징물 " ? " 상징물
특정 필드의 모든 허용 값을 의미한다. 특정 값이 없음을 의미한다.
모든 분야에서 활용 가능 일자 및 요일 필드에서만 사용 가능하다.
필드의 모든 값을 지정하는 데 사용된다. 빈 값을 설정하는 데 사용한다.
동일한 표현에 여러 번 나타날 수 있다. 표현식 당 하나만 존재할 수 있다.

 

 

Cron 표현식은 유사하지만 사이트마다 다름을 알 수 있다.

먼저 자주 사용하고 있는 분야에서의 Cron 표현식을 익히고 점차 범위를 늘려간다면 효과적으로 사용할 수 있을 것이라 본다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처: https://www.baeldung.com/java-cron-expressions-wildcards-diff

 

 

 

728x90
반응형