Sub-Workflow (Execute Workflow) — 워크플로우 모듈화

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 만들기

호출되는 워크플로우 (모듈)

  1. 새 워크플로우 생성: "📦 알림 모듈"
  2. Execute Workflow Trigger 노드 추가 (일반 Trigger가 아님!)
  3. 로직 구성:
[Execute Workflow Trigger] → [Edit Fields: 메시지 구성] → [Slack: 전송]

Execute Workflow Trigger는 호출 시 전달된 데이터를 $json으로 받는다.

호출하는 워크플로우 (메인)

  1. Execute Workflow 노드 추가
  2. 설정:
설정 설명
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 패턴을 만들자.