Sub-Workflow (Execute Workflow) — 워크플로우 모듈화
워크플로우가 10개, 20개로 늘어나면 같은 로직이 반복된다. "Slack 알림" 로직이 5개 워크플로우에 있다면? 하나의 모듈로 분리하자.
Sub-Workflow란?
Sub-Workflow는 워크플로우 안에서 다른 워크플로우를 호출하는 패턴이다. 프로그래밍의 함수 호출과 같다.
메인 워크플로우:
[Trigger] → [처리] → [Execute Workflow: "알림 모듈"] → [계속]
│
Sub-Workflow:
[Execute Workflow Trigger] → [Slack 전송] → [결과 반환]
왜 모듈화하는가?
| 문제 | 모듈화 후 |
|---|---|
| 같은 Slack 알림 코드가 5곳에 중복 | 1곳에서 관리, 5곳에서 호출 |
| 알림 형식 변경 시 5곳 수정 | 모듈 1곳만 수정 |
| 워크플로우가 100개 노드로 비대 | 역할별 분리로 가독성 향상 |
| 에러 원인 추적이 어려움 | 모듈별 독립 테스트 가능 |
Sub-Workflow 만들기
호출되는 워크플로우 (모듈)
- 새 워크플로우 생성: "📦 알림 모듈"
- Execute Workflow Trigger 노드 추가 (일반 Trigger가 아님!)
- 로직 구성:
[Execute Workflow Trigger] → [Edit Fields: 메시지 구성] → [Slack: 전송]
Execute Workflow Trigger는 호출 시 전달된 데이터를 $json으로 받는다.
호출하는 워크플로우 (메인)
- Execute Workflow 노드 추가
- 설정:
| 설정 | 설명 |
|---|---|
| Source | Database ID (저장된 워크플로우 선택) |
| Workflow | "📦 알림 모듈" 선택 |
| Mode | Each Item / Once with All Items |
파라미터 전달
메인 워크플로우에서 보내는 데이터:
{
"channel": "#alerts",
"title": "서버 알림",
"message": "API 서버 응답 시간 초과",
"severity": "high"
}
모듈에서 받는 데이터:
{{ $json.channel }} → "#alerts"
{{ $json.title }} → "서버 알림"
{{ $json.message }} → "API 서버 응답 시간 초과"
{{ $json.severity }} → "high"
결과 반환
모듈 워크플로우의 마지막 노드 출력이 메인 워크플로우로 자동 반환된다.
모듈 마지막 노드 출력:
{ "status": "sent", "messageId": "msg_123" }
메인 워크플로우의 Execute Workflow 노드 출력:
{{ $json.status }} → "sent"
{{ $json.messageId }} → "msg_123"
실전 모듈 설계
모듈 1: 통합 알림 모듈
여러 채널(Slack, Email, Telegram)로 동시에 알림을 보내는 모듈.
[Execute Workflow Trigger]
→ [Switch: channel 타입]
"slack" → [Slack: 메시지 전송]
"email" → [Gmail: 이메일 전송]
"telegram" → [Telegram: 메시지 전송]
"all" → 모든 채널에 병렬 전송
호출 시:
{
"channel": "all",
"title": "배포 완료",
"message": "v2.1.0 프로덕션 배포 완료",
"urgency": "info"
}
모듈 2: DB 조회 + 캐시 모듈
[Execute Workflow Trigger]
→ [IF: 캐시 히트?]
true → [캐시에서 반환]
false → [PostgreSQL: 조회] → [캐시 저장] → [결과 반환]
모듈 3: AI 처리 모듈
[Execute Workflow Trigger]
→ [Switch: task_type]
"summarize" → [GPT-4o-mini: 요약]
"translate" → [GPT-4o-mini: 번역]
"analyze" → [GPT-4o: 분석]
"classify" → [GPT-4o-mini: 분류]
에러 전파
Sub-Workflow에서 에러가 발생하면 메인 워크플로우로 에러가 전파된다.
에러 전파 동작
메인: [A] → [Execute Workflow] → [B]
│
↓
모듈: [Trigger] → [HTTP Request: 에러!]
→ 메인의 [B]는 실행되지 않고, 메인 워크플로우도 에러로 중단
에러 억제
모듈의 에러를 잡고 싶으면 Execute Workflow 노드에서:
Settings → On Error: Continue on Fail
설계 원칙
언제 Sub-Workflow를 쓰는가?
| 기준 | Sub-Workflow 사용 |
|---|---|
| 같은 로직이 3곳 이상 반복 | ✅ |
| 워크플로우가 20노드 이상 비대 | ✅ |
| 독립적으로 테스트하고 싶은 기능 | ✅ |
| 팀원이 재사용할 공통 기능 | ✅ |
| 단순한 1~2노드 작업 | ❌ (과도한 모듈화) |
네이밍 컨벤션
📦 [모듈] 알림 전송
📦 [모듈] DB 조회
📦 [모듈] AI 처리
🔄 [메인] 일일 보고서
🔄 [메인] 고객 문의 처리
📝 정리
- [x] Execute Workflow: 다른 워크플로우를 함수처럼 호출
- [x] Execute Workflow Trigger: 호출받는 워크플로우의 시작점
- [x] 파라미터: 호출 시 JSON 데이터 전달, 마지막 노드 출력이 반환값
- [x] 에러 전파: 모듈 에러가 메인으로 전파됨. Continue on Fail로 억제 가능
- [x] 설계 원칙: 3곳 이상 반복, 20노드 이상 비대, 독립 테스트 필요 시
다음 편 예고
26편: n8n Form Trigger + Wait 노드 — 사람의 승인이 필요한 자동화
완전 자동화가 항상 정답은 아니다. "AI가 초안을 만들고 → 사람이 승인하면 → 실행"하는 Human-in-the-Loop 패턴을 만들자.