크론(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
'Development > Etc' 카테고리의 다른 글
[펌] 완벽주의 - 엔지니어링 산업에서 생산성을 가장 크게 저하시키는 요인 중 하나 (0) | 2024.08.23 |
---|---|
[펌] 자바는 요즘에도 여전히 중요한가? (2) | 2024.08.20 |
[VIM] VIM 기본 사용법 (0) | 2020.05.23 |
[RegExp] 정규표현식 주요 수정자 (0) | 2018.11.28 |
[RegExp] 정규식 연습 및 테스트 사이트 (0) | 2018.11.17 |