n8n 교재 · 중급 16편

n8n Sub-Workflow · Execute Workflow

같은 로직을 5개 워크플로에 복붙하는 짓 그만. 함수처럼 호출하는 재사용 모듈로 정리.

부모 워크플로 안에 자식 워크플로가 중첩되어 연결된 일러스트 — Sub-Workflow 모듈 컨셉

n8n 을 몇 달 쓰면 자연스럽게 같은 패턴이 여러 워크플로에 나타난다. "Slack 알림", "이메일 발송", "에러 로깅" — 매번 같은 노드 4-5개를 복붙. 그러다 알림 채널을 한 번 바꾸려면 5개 워크플로를 다 손봐야 하는 지옥이 시작된다.

답은 Sub-Workflow. 프로그래밍의 함수와 같은 개념을 n8n 캔버스로 옮겨놓은 것. 이번 16편에서는 Sub-Workflow 가 언제 필요한지, 어떻게 입출력을 정의하는지, 그리고 19편 AI Agent 가 Sub-Workflow 를 Tool 로 부르는 패턴까지 정리한다.

1. Sub-Workflow 두 노드 — Trigger 와 Caller

Sub-Workflow 한 쌍은 항상 두 워크플로로 나뉜다. 호출되는 쪽 (Sub)호출하는 쪽 (Parent). 각자 다른 트리거 노드를 쓴다.

역할노드위치
Sub-Workflow 입구Execute Sub-workflow Trigger (Manual·Webhook 대신 이걸 트리거로)호출되는 워크플로의 첫 노드
Sub-Workflow 호출Execute Workflow (또는 Execute Workflow Tool for AI Agent)호출하는 워크플로의 본문 중간

흐름: Parent 의 Execute Workflow 노드가 Sub 의 Execute Sub-workflow Trigger 를 깨움 → Sub 의 본문 실행 → 마지막 노드의 출력이 Parent 의 Execute Workflow 노드 출력으로 돌아옴. 함수 호출과 정확히 동일.

흔한 혼동 — "Execute Workflow Trigger" 와 "Webhook Trigger" 가 비슷해 보이지만 다르다. Webhook 은 외부 HTTP 요청을 받는 공개 endpoint, Execute Workflow Trigger 는 같은 n8n 인스턴스 내부 호출 전용. 보안·성능 둘 다 후자가 우위.

2. 입력·출력 정의 — 함수 시그니처 박기

Sub-Workflow 가 함수처럼 재사용 가능하려면 명확한 입출력 스키마가 필요하다. n8n 은 "Workflow Inputs" 패널에서 입력 필드를 미리 선언할 수 있다.

호출되는 워크플로의 Execute Sub-workflow Trigger 노드 → "Workflow Input Schema" 에 JSON Schema 정의:

{
  "email": {"type": "string", "required": true},
  "subject": {"type": "string", "required": true},
  "html": {"type": "string"}
}

이러면 Parent 의 Execute Workflow 노드가 입력 필드를 자동 인식해서 form 으로 보여줌. 잘못된 타입·필수 누락이면 호출 시점에 에러. 함수 시그니처 + 타입 체크와 같은 효과.

3. 언제 Sub-Workflow 로 빼야 하는가 — 3 신호

"이걸 빼는 게 맞나" 고민될 때 판단 기준 셋. 하나라도 해당하면 분리할 가치.

신호 1 — 같은 노드 묶음이 3 워크플로 이상 반복

Slack 알림 4 노드 (Set 메시지 포맷 + Slack + IF 성공 체크 + Log) 가 신규·결제·에러 워크플로에 모두 들어가 있다면 즉시 분리. Notify Slack 라는 Sub-Workflow 1개 만들어서 3 곳에서 호출.

신호 2 — 그 로직이 독립 테스트 필요

"이메일 발송 로직이 진짜 작동하나" 테스트하려고 메인 워크플로를 다 실행할 필요가 없어야. Sub-Workflow 로 빼면 Manual Trigger 모드로 단독 실행 가능. 독립 테스트 가능성 = 좋은 분리 신호.

신호 3 — 19편 AI Agent 의 Tool 후보

"DB 조회·이메일 발송·검색" 같이 AI Agent 가 자율 호출할 만한 액션이면 Sub-Workflow + Execute Workflow Tool 노드로 묶기. AI Agent 가 description 보고 알아서 부른다. 19편 4 컴포넌트의 ③ Tool 자리가 이걸로 채워진다.

피해야 할 분리 — 한 번만 쓰는 로직, 또는 본문과 강하게 묶인 로직 (예: 메인 트랜잭션 중간 단계) 은 분리하지 말 것. 호출 오버헤드 + 디버깅 복잡도가 재사용 이득보다 크다. "3번 이상" 기준이 그래서 중요.

4. 실전 — 알림 Sub-Workflow 한 개로 5 워크플로 통합

박준성님의 warehouse 운영을 예로. 현재 알림이 필요한 5 시점:

  1. 새 블로그 발행 → Slack
  2. n8n 워크플로 실패 → Slack + Email (17편 Error Workflow)
  3. Replicate 월 예산 80% 도달 → Slack
  4. WordPress DB 연결 끊김 → Slack + SMS
  5. 새 클라이언트 문의 수신 → Slack + Email

5 곳에 같은 Slack 노드 + 메시지 포맷을 박지 말고, "Notify" Sub-Workflow 1개 만든다. 입력 스키마:

{
  "channel": {"type": "string", "required": true},
  "level": {"type": "string", "enum": ["info","warn","critical"]},
  "message": {"type": "string", "required": true},
  "details": {"type": "object"}
}

내부는 IF 분기 — level=critical 이면 Slack + SMS + Email 모두, warn 이면 Slack + Email, info 면 Slack 만. 5 워크플로는 Execute Workflow 노드 하나로 호출 — channel·level·message 만 채워서.

알림 채널이 바뀌어도 (예: Slack → Discord) Sub-Workflow 1 곳만 수정. 17편 Error Workflow 와 결합하면 운영 안정성이 한 단계 올라간다. 20편 Self-host 의 백업·credentials 까지 끝나면 production 완성.

다음 글

n8n 교재 20편 — Self-host 배포. Queue mode · 백업 · Credentials 관리 · Reverse Proxy 로 production 배포 마지막 단계.

© 2026 주나이테크(주) @JUNAITECH