viewer.csslab.dev

Spring cron 표현식 해석기

Spring @Scheduled 표현식을 말로 옮긴다 — 여섯 필드, 초가 앞에.

Spring @Scheduled 는 무엇을 기대하나?

Spring 의 @Scheduled 는 여섯 필드를 받는다 — 초·분·시·일·월·요일. 사람들이 걸리는 지점은 맨 앞의 초 필드다. 다섯 필드짜리 crontab 줄을 @Scheduled 에 붙여넣으면 애플리케이션이 아예 뜨지 않거나, 더 나쁘게는 의도와 전혀 다른 일정으로 등록된다.

Spring 의 파서는 Quartz 것도 crontab 것도 아닌 제 것이다. 일 필드에서 ? 를 요구하는 대신 * 의 동의어로 받고, 요일에서 L 과 # 을 지원하며, @daily·@hourly 같은 매크로를 더한다. 이 페이지는 표현식을 말로 되돌려 배포 전에 일정을 확인하게 한다.

The pattern is a list of six single space-separated fields: representing second, minute, hour, day, month, weekday.
Spring Framework — CronExpression

기능

여섯 필드에 이름을
초를 맨 앞에 두고 필드마다 이름을 붙인다. 실수로 붙여넣은 crontab 줄이 한 필드 모자란 것으로 바로 드러난다.
Spring 의 일 규칙을 읽는다
Spring 은 ? 를 일 필드 중 하나에 반드시 넣으라고 요구하지 않고 * 와 같게 본다. Quartz 문서에서 복사한 표현식이 어긋나는 자리가 여기다.
말로 옮긴 출력
표현식을 문장으로 보여준다. 예약 작업을 검토하는 일이 필드 순서를 외우고 있는 사람에게 달려 있지 않게 된다.
믿을 수 있을 때만 실행 시각을
L 이나 # 을 쓴 표현식에는 다음 실행 시각을 붙이지 않는다 — 쓸 수 있는 파서가 그것을 Spring 과 다르게 읽어서, 여기서 틀린 시각을 보여주는 것이 없느니만 못하다.

사용법

  1. 1

    애너테이션에서 표현식을 복사한다

    @Scheduled(cron = "...") 안의 문자열을 가져온다.

  2. 2

    여기에 붙여넣는다

    초가 앞에 오는 여섯 필드. @daily 같은 매크로도 읽는다.

  3. 3

    문장과 필드를 읽는다

    일정이 요청받은 것과 같은지, 어느 필드가 엉뚱한 자리에 있지 않은지 확인한다.

  4. 4

    시간대를 기억한다

    @Scheduled 는 애너테이션에 지정하지 않으면 JVM 기본 시간대로 돈다. 컨테이너는 대개 UTC 로 뜬다.

자주 묻는 질문

crontab 표현식이 @Scheduled 에서 왜 실패하나?

Spring 은 초가 앞에 오는 여섯 필드를 기대하는데 crontab 은 다섯이다. 다섯 필드짜리는 시작할 때 검증에서 실패하거나, 모든 필드가 한 칸씩 밀려 읽혀 전혀 다른 일정으로 등록된다.

Spring 에서 ? 는 무슨 뜻인가?

* 와 같다. Quartz 와 달리 Spring 은 일 필드 중 정확히 하나에 ? 를 요구하지 않고 동의어로 받는다. 그래서 Quartz 문서에서 복사한 표현식은 대개 동작하지만, 반대는 성립하지 않는다.

@daily 나 @hourly 를 쓸 수 있나?

쓸 수 있다. Spring 은 @yearly·@monthly·@weekly·@daily·@hourly 매크로를 지원하고, 각각 대응하는 여섯 필드 표현식으로 펼쳐진다. @reboot 는 시각이 아니라 시작으로 촉발되므로 대응이 없다.

@Scheduled 는 어느 시간대를 쓰나?

애너테이션에 zone 을 지정하지 않으면 JVM 기본값이다. 컨테이너는 대개 UTC 로 도는데 개발자는 현지 시각으로 생각하므로, 예상한 자리에서 아홉 시간 떨어져 도는 작업이 여기서 자주 나온다.

일곱 번째 연도 필드도 되나?

안 된다. Quartz 는 뒤에 연도 필드를 선택으로 허용하지만 Spring 의 파서는 받지 않으므로 일곱 필드짜리 Quartz 표현식은 검증을 통과하지 못한다.

여기서 막힌다면

이 도구가 따르는 규격

함께 쓰는 도구