Schedule Trigger + Cron 표현식 — 시간이 자동화를 깨운다

Schedule Trigger + Cron 표현식 — 시간이 자동화를 깨운다

자동화의 50%는 "언제 실행할 것인가?" 에서 시작된다. Schedule Trigger와 Cron 표현식은 시간 기반 자동화의 핵심이다.

Schedule Trigger 기본

Schedule Trigger는 정해진 시간에 워크플로우를 자동으로 시작하는 트리거 노드다.

두 가지 모드

모드 설명 적합한 경우
Interval N분/N시간/N일마다 실행 단순 반복
Cron Cron 표현식으로 정밀 스케줄링 "매주 월/수/금 오전 9시" 같은 복잡한 일정

Interval 모드

가장 간단한 스케줄링. "N마다 실행"을 설정한다.

설정 옵션 예시
Seconds N초마다 30초마다 헬스체크
Minutes N분마다 5분마다 API 폴링
Hours N시간마다 1시간마다 데이터 수집
Days N일마다 + 시각 지정 매일 오전 8시
Weeks N주마다 + 요일/시각 매주 월요일 오전 9시
Months N개월마다 + 일자/시각 매월 1일 자정

예시 설정

매일 오전 9시:

Trigger Interval: Days
Days Between Triggers: 1
Trigger at Hour: 9
Trigger at Minute: 0

매시간:

Trigger Interval: Hours
Hours Between Triggers: 1

Cron 표현식 완전 해부

더 정밀한 스케줄링이 필요하면 Cron 모드를 사용한다.

Cron 표현식 구조

┌─────── 분 (0-59)
│ ┌───── 시 (0-23)
│ │ ┌─── 일 (1-31)
│ │ │ ┌─ 월 (1-12)
│ │ │ │ ┌ 요일 (0-7, 0과 7은 일요일)
│ │ │ │ │
* * * * *

특수 문자

문자 의미 예시
* 모든 값 매분, 매시, 매일...
, 여러 값 1,3,5 (1, 3, 5)
- 범위 9-17 (9~17)
/ 간격 */5 (5마다)

실전 Cron 예제

일정 Cron 표현식 설명
매분 * * * * * 1분마다
매시간 정각 0 * * * * 00분에
매일 오전 9시 0 9 * * * 9:00
매일 오전 9시, 오후 6시 0 9,18 * * * 두 번
평일 오전 9시 0 9 * * 1-5 월~금
매주 월요일 오전 9시 0 9 * * 1 월요일만
매월 1일 자정 0 0 1 * * 1일 00:00
매월 1, 15일 오전 10시 0 10 1,15 * * 반월마다
5분마다 */5 * * * * 00, 05, 10, 15...
업무시간에만 30분마다 */30 9-17 * * 1-5 평일 9~17시

Cron 해독 연습

0 9 * * 1-5
│ │ │ │ └── 요일: 1-5 (월~금)
│ │ │ └──── 월: * (매월)
│ │ └────── 일: * (매일)
│ └──────── 시: 9 (오전 9시)
└────────── 분: 0 (정각)

= "평일 오전 9시 정각"
*/15 8-20 * * *
│    │    │ │ │
│    │    │ │ └── 모든 요일
│    │    │ └──── 매월
│    │    └────── 매일
│    └─────────── 8시~20시
└──────────────── 15분마다

= "매일 오전 8시~오후 8시, 15분마다"

타임존 주의사항

Schedule Trigger의 시간 기준은 n8n 서버의 타임존이다.

타임존 설정

# docker-compose.yml
environment:
  - GENERIC_TIMEZONE=Asia/Seoul
  - TZ=Asia/Seoul

이 설정이 없으면 기본 UTC(협정 세계시)로 동작한다. 한국(KST)은 UTC+9이므로, 오전 9시를 의도했는데 오후 6시에 실행되는 문제가 생길 수 있다.

워크플로우별 타임존

글로벌 서비스라면 워크플로우마다 다른 타임존이 필요할 수 있다.

워크플로우 Settings → Timezone 에서 개별 설정 가능.


Manual Trigger — 테스트의 동반자

Schedule Trigger로 만든 워크플로우를 테스트하려면 매번 예정 시간까지 기다려야 할까? 아니다.

방법 1: Manual Execute

에디터에서 Ctrl+Enter를 누르면 Schedule Trigger의 시간과 무관하게 즉시 실행된다.

방법 2: Manual Trigger 병행

[Manual Trigger] ──┐
                   ├──▶ [나머지 워크플로우]
[Schedule Trigger]─┘

Manual Trigger와 Schedule Trigger를 같은 노드에 연결하면: - 개발 중에는 Manual로 테스트 - 배포 후에는 Schedule이 자동 실행


실전 예제 모음

예제 1: 일일 보고서

[Schedule: 매일 오전 9시] → [DB 조회] → [Code: 집계] → [Email 발송]
Cron: 0 9 * * *

예제 2: 주간 백업

[Schedule: 매주 일요일 새벽 3시] → [DB Dump] → [Google Drive 업로드] → [Slack 알림]
Cron: 0 3 * * 0

예제 3: 영업시간 모니터링

[Schedule: 평일 9-18시 5분마다] → [HTTP: 헬스체크] → [IF: 실패?] → [Slack #ops 채널]
Cron: */5 9-18 * * 1-5

예제 4: 월말 정산

[Schedule: 매일 자정] → [Code: 오늘이 월말?] → [IF] → [정산 처리]

Code 노드에서 월말 체크:

const now = new Date();
const lastDay = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();
const isLastDay = now.getDate() === lastDay;

return { json: { isLastDay, date: now.toISOString() } };

여러 트리거 조합

하나의 워크플로우에 여러 트리거를 설정할 수 있다.

[Schedule: 매일 9시] ──────┐
                           ├──▶ [처리 로직]
[Webhook: 수동 실행 API] ──┘
  • 평소에는 매일 9시에 자동 실행
  • 긴급할 때는 Webhook으로 즉시 실행

Schedule 설계 가이드

고려사항 권장
너무 잦은 실행 API 호출 비용 확인. 1분마다 호출하면 하루 1,440회
서버 부하 새벽 시간대에 무거운 작업 배치
중복 실행 이전 실행이 끝나기 전에 다음 실행이 시작되지 않도록 주의
실패 시 재시도 Error Workflow + 수동 재실행 URL 제공
타임존 반드시 GENERIC_TIMEZONE 설정 확인

📝 정리

  • [x] Schedule Trigger: 시간 기반 자동 실행 트리거. Interval(간단) / Cron(정밀) 모드
  • [x] Cron 구조: 분 시 일 월 요일 5개 필드. *(전체), ,(나열), -(범위), /(간격)
  • [x] 타임존: GENERIC_TIMEZONE=Asia/Seoul 반드시 설정
  • [x] 테스트: Manual Trigger 병행 또는 Ctrl+Enter로 즉시 실행
  • [x] 설계 원칙: API 비용, 서버 부하, 중복 실행, 타임존 고려

다음 편 예고

13편: Gmail + Google Sheets — 이메일 자동화의 기본

Part 3 시작! 이제부터 실제 서비스를 연동한다. Gmail에서 이메일을 자동으로 읽고, Google Sheets에 기록하고, 조건에 따라 알림을 보내는 실전 워크플로우를 만들자.