IF / Switch / Merge — 워크플로우에 두뇌를 달자

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 — 데이터 정제의 기술

데이터를 원하는 형태로 가공하는 핵심 기술. 필드 추가·제거, 대량 데이터 분할 처리, 배열 펼치기와 합치기까지.