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에 기록하고, 조건에 따라 알림을 보내는 실전 워크플로우를 만들자.