IF / Switch / Merge — 워크플로우에 두뇌를 달자
지금까지의 워크플로우는 일직선이었다. A → B → C. 하지만 현실의 자동화에는 "만약 ~이라면?" 이 필수다. IF, Switch, Merge — 이 세 노드가 n8n에 두뇌를 달아준다.
IF 노드 — 양갈래 분기
가장 기본적인 조건 분기. 참(true) 과 거짓(false) 두 갈래로 나뉜다.
┌─ true ──▶ [처리 A]
[이전 노드] ──▶ [IF] ─┤
└─ false ─▶ [처리 B]
IF 노드 설정
| 설정 | 설명 |
|---|---|
| Value 1 | 비교할 첫 번째 값 (Expression 가능) |
| Operation | 비교 연산자 |
| Value 2 | 비교할 두 번째 값 |
| Combine | 여러 조건의 조합 방식 (AND / OR) |
비교 연산자
| 연산자 | 설명 | 예시 |
|---|---|---|
| Equals | 같다 | status = "active" |
| Not Equals | 같지 않다 | status ≠ "deleted" |
| Greater Than | 크다 | price > 10000 |
| Less Than | 작다 | age < 18 |
| Greater Than or Equal | 크거나 같다 | score >= 80 |
| Contains | 포함한다 | email contains "@gmail.com" |
| Not Contains | 포함하지 않는다 | name not contains "test" |
| Starts With | ~로 시작한다 | phone starts with "010" |
| Ends With | ~로 끝난다 | file ends with ".pdf" |
| Is Empty | 비어있다 | description is empty |
| Is Not Empty | 비어있지 않다 | email is not empty |
| Regex Match | 정규식 일치 | email regex "^[\w.]+@" |
실전 예제: 결제 금액별 처리
[결제 Webhook] ──▶ [IF: 금액 ≥ 100만원?]
│
true ─┼─▶ [관리자 알림] ──▶ [VIP 처리]
│
false ─┴─▶ [자동 승인] ──▶ [일반 처리]
IF 설정:
Value 1: {{ $json.amount }}
Operation: Greater Than or Equal
Value 2: 1000000
여러 조건 조합 (AND / OR)
"Add Condition" 버튼으로 조건을 추가하고, Combine 설정으로 조합한다.
AND (모두 만족해야 true):
조건 1: status = "active"
AND
조건 2: age >= 18
AND
조건 3: email is not empty
→ 세 조건 모두 참이어야 true
OR (하나라도 만족하면 true):
조건 1: role = "admin"
OR
조건 2: role = "manager"
→ 둘 중 하나만 참이면 true
Filter 노드 — 조건에 맞는 아이템만 통과
IF 노드가 워크플로우(흐름)를 분기한다면, Filter 노드는 아이템(데이터)을 걸러낸다.
입력: [아이템 A, 아이템 B, 아이템 C, 아이템 D]
│
[Filter: price > 100]
│
출력: [아이템 A, 아이템 C] (조건을 만족하는 것만)
IF vs Filter 차이
| 특징 | IF 노드 | Filter 노드 |
|---|---|---|
| 분기 | true/false 두 갈래 | 한 갈래 (통과/제거) |
| 처리 단위 | 아이템별 → 경로 분류 | 아이템별 → 탈락 제거 |
| 출력 | 2개 출력 포트 | 1개 출력 포트 |
| 용도 | 다른 처리가 필요할 때 | 불필요한 데이터 제거 |
💡 판단 기준: "조건에 따라 다른 동작을 해야 한다" → IF. "조건에 안 맞는 것을 버리기만 한다" → Filter.
Switch 노드 — 다중 분기
2개가 아닌 3개 이상의 갈래가 필요할 때 Switch 노드를 사용한다.
┌─ output 0 ──▶ [한국어 처리]
│
[데이터] ──▶ [Switch] ─┼─ output 1 ──▶ [영어 처리]
│
├─ output 2 ──▶ [일본어 처리]
│
└─ fallback ──▶ [기타 처리]
Switch 설정
| 설정 | 설명 |
|---|---|
| Mode | Rules (조건별) 또는 Expression (값 매칭) |
| Rules | 각 출력 포트에 대한 조건 설정 |
| Fallback Output | 어떤 조건에도 맞지 않을 때의 출력 |
Rules 모드
Rule 0: {{ $json.lang }} equals "ko" → Output 0
Rule 1: {{ $json.lang }} equals "en" → Output 1
Rule 2: {{ $json.lang }} equals "ja" → Output 2
Fallback: → Output 3 (기타)
Expression 모드
값 하나를 기준으로 여러 케이스로 분기:
Routing Expression: {{ $json.status }}
Outputs:
- "pending" → Output 0
- "active" → Output 1
- "cancelled" → Output 2
Fallback → Output 3
IF vs Switch 선택
| 상황 | 추천 |
|---|---|
| 예/아니오 2가지 | IF |
| 3가지 이상 분기 | Switch |
| 범위 조건 (>, < 등) | IF 중첩 또는 Switch Rules |
| 정확한 값 매칭 | Switch Expression |
Merge 노드 — 갈라진 길을 합친다
분기된 여러 흐름을 하나로 합치는 노드다. Merge 노드에는 여러 모드가 있다.
Merge 모드
| 모드 | 설명 | 비유 |
|---|---|---|
| Append | 모든 입력의 아이템을 순서대로 이어붙인다 | 두 줄을 한 줄로 |
| Combine: By Position | 같은 위치의 아이템끼리 합친다 | 엑셀 VLOOKUP (순서 기준) |
| Combine: By Field | 특정 필드 값이 같은 아이템끼리 합친다 | SQL JOIN |
| Combine: Multiplex | 모든 조합을 만든다 | 데카르트 곱 |
| Choose Branch | 특정 입력만 통과시킨다 | IF/Switch로 나뉜 후 재합류 |
Append (이어붙이기)
입력 A: [사과, 바나나]
입력 B: [포도, 딸기, 수박]
결과: [사과, 바나나, 포도, 딸기, 수박]
용도: 여러 소스에서 가져온 데이터를 하나의 목록으로 합칠 때.
Combine By Position (위치별 합치기)
입력 A: [{"name": "홍길동"}, {"name": "김철수"}]
입력 B: [{"age": 30}, {"age": 25}]
결과: [{"name": "홍길동", "age": 30}, {"name": "김철수", "age": 25}]
용도: 두 데이터 소스의 순서가 동일하고, 필드를 합칠 때.
Combine By Field (필드 기준 합치기)
입력 A: [{"id": 1, "name": "홍길동"}, {"id": 2, "name": "김철수"}]
입력 B: [{"id": 2, "score": 90}, {"id": 1, "score": 85}]
Merge Field: "id"
결과: [{"id": 1, "name": "홍길동", "score": 85},
{"id": 2, "name": "김철수", "score": 90}]
용도: 공통 키(ID 등)를 기준으로 다른 데이터를 합칠 때. SQL의 JOIN과 동일한 개념.
Choose Branch (분기 합류)
IF 또는 Switch로 나뉜 후, 결과를 다시 합쳐야 할 때:
┌─ true ──▶ [처리 A] ──┐
[Data] ──▶ [IF] ──┤ ├──▶ [Merge: Choose] ──▶ [다음]
└─ false ─▶ [처리 B] ──┘
실전 패턴 5가지
패턴 1: 결제 상태별 처리
[결제 Webhook] ──▶ [Switch: status]
│
"success" ──▶ [DB 업데이트] ──▶ [영수증 전송]
│
"failed" ──▶ [재시도 알림] ──▶ [로그 저장]
│
"refunded" ──▶ [환불 처리] ──▶ [환불 알림]
패턴 2: 이메일 자동 분류
[Gmail Trigger] ──▶ [IF: 제목에 "긴급" 포함?]
│
true ─┼─▶ [Slack #urgent 채널]
│
false ─┴─▶ [IF: 발신자 = VIP?]
│
true ─┼─▶ [Slack #vip 채널]
│
false ─┴─▶ [Google Sheets 기록]
패턴 3: 다중 API 호출 → 합치기
┌──▶ [날씨 API] ──┐
[Trigger] ──▶ [뉴스 API] ──▶ [Merge: Append] ──▶ [일일 리포트]
└──▶ [환율 API] ──┘
패턴 4: A/B 테스트 라우팅
[Webhook] ──▶ [Code: 50% 확률 랜덤]
│
"A" ─┼─▶ [버전 A 처리]
│
"B" ─┴─▶ [버전 B 처리]
Code 노드:
return {
json: {
...$input.item.json,
variant: Math.random() < 0.5 ? 'A' : 'B'
}
};
패턴 5: 데이터 보강 (Enrichment)
[고객 목록] ──▶ [Merge: By Field]
▲
[주문 내역 API] ────────┘ (customer_id로 합치기)
결과: 각 고객에 주문 내역이 합쳐진 데이터.
주의사항과 팁
1. IF 중첩 최소화
IF를 3단 이상 중첩하면 워크플로우가 복잡해진다.
❌ 나쁜 예: IF → IF → IF → IF (스파게티)
✅ 좋은 예: Switch 노드 하나로 정리
2. Merge 타이밍
Merge 노드는 모든 입력이 도착해야 실행된다. 한쪽 경로에서 에러가 발생하면 Merge가 영원히 대기할 수 있다.
해결: 에러가 발생할 수 있는 경로에는 On Error: Continue on Fail 설정을 추가하자.
3. 데이터 손실 방지
IF 분기 후 true/false 각각에서 다른 필드를 추가했을 때, Merge로 합치면 필드가 달라질 수 있다.
해결: 양쪽 경로의 Edit Fields에서 동일한 출력 구조를 맞춰주자.
📝 정리
- [x] IF 노드: 조건에 따라 true/false 두 갈래로 분기
- [x] Filter 노드: 조건에 맞는 아이템만 통과, 나머지 제거
- [x] Switch 노드: 3개 이상 다중 분기 (Rules 또는 Expression 모드)
- [x] Merge 노드: 분기된 흐름을 합침 (Append, By Position, By Field, Choose Branch)
- [x] 설계 원칙: IF 중첩 최소화, Switch 활용, Merge 전 출력 구조 통일
다음 편 예고
10편: Set / Edit Fields / Split In Batches — 데이터 정제의 기술
데이터를 원하는 형태로 가공하는 핵심 기술. 필드 추가·제거, 대량 데이터 분할 처리, 배열 펼치기와 합치기까지.