G: 안녕하세요, 자동화와 효율성을 사랑하는 여러분! 🚀 오늘은 n8n 워크플로우를 더욱 강력하게 만들어 줄 핵심 노드 중 하나인 Merge 노드에 대해 심층적으로 알아보는 시간을 가지려 합니다. 데이터 통합은 모든 자동화의 꽃이라고 할 수 있는데요, 이 Merge 노드야말로 흩어진 데이터를 하나로 엮어 강력한 인사이트를 도출하거나, 다음 작업을 위한 완벽한 형태로 재구성하는 마법과 같은 역할을 합니다.
단순히 데이터를 합치는 것을 넘어, 어떤 모드를 사용하느냐에 따라 전혀 다른 결과를 만들어내는 Merge 노드의 매력에 빠져볼 준비가 되셨나요? 이 글에서는 Merge 노드의 기본 개념부터 시작하여, 실전에서 바로 활용할 수 있는 10가지 예시를 통해 여러분의 n8n 활용 능력을 한 단계 업그레이드 시켜드리겠습니다!
💡 n8n Merge 노드, 왜 중요할까요?
n8n은 다양한 시스템과 데이터를 연결하고 자동화하는 강력한 도구입니다. 하지만 실제 워크플로우에서는 여러 갈래로 흩어진 데이터를 다시 한곳으로 모아야 하는 경우가 비일비재합니다. 예를 들어:
- 여러 API에서 가져온 사용자 정보를 하나의 프로필로 통합해야 할 때 🤝
- 특정 조건에 따라 분기된 워크플로우의 결과를 다시 합쳐서 최종 보고서를 생성해야 할 때 📈
- 두 가지 데이터 목록을 특정 키를 기준으로 결합하여 새로운 정보를 만들어야 할 때 🔗
이 모든 상황에서 빛을 발하는 것이 바로 Merge 노드입니다. Merge 노드는 서로 다른 입력(Input)을 받아 지정된 규칙에 따라 새로운 출력(Output)을 생성해줍니다. 마치 여러 개의 물줄기가 합쳐져 하나의 거대한 강을 이루는 것과 같죠! 🌊
🧩 Merge 노드의 4가지 핵심 모드 파헤치기
Merge 노드에는 크게 네 가지 모드가 있으며, 각 모드는 데이터를 합치는 방식이 다릅니다. 이 모드들을 정확히 이해하는 것이 Merge 노드 마스터의 첫걸음입니다.
1. Append (추가하기) ➕
가장 간단한 모드입니다. 두 개 이상의 입력(Input)을 받아 단순히 모든 아이템(Item)을 순서대로 하나의 리스트로 합쳐줍니다. 마치 배열에 새로운 요소를 추가하는 것과 같습니다.
- 언제 사용할까요? 서로 다른 소스에서 온 목록들을 한데 모아 처리할 때 유용합니다.
- 예시: “오늘 할 일 목록”과 “내일 할 일 목록”을 합쳐 “전체 할 일 목록”을 만들 때.
// Input 1
[
{ "id": 1, "task": "보고서 작성" }
]
// Input 2
[
{ "id": 2, "task": "회의 준비" }
]
// Output (Append 모드)
[
{ "id": 1, "task": "보고서 작성" },
{ "id": 2, "task": "회의 준비" }
]
2. Combine (결합하기) 🧩
두 입력(Input 1, Input 2)을 받아, 지정된 ‘키(Key)’를 기준으로 아이템들을 1대1로 결합합니다. Input 1의 각 아이템과 Input 2에서 해당 키와 일치하는 아이템을 찾아 합칩니다.
- 언제 사용할까요? 기준이 되는 데이터(Input 1)에 다른 데이터(Input 2)를 추가하여 정보를 풍부하게 만들 때.
- 예시: 사용자 ID를 기준으로 “기본 사용자 정보”에 “구독 정보”를 결합할 때.
// Input 1 (사용자 기본 정보)
[
{ "userId": "a1", "name": "김철수" }
]
// Input 2 (사용자 구독 정보)
[
{ "userId": "a1", "plan": "프리미엄", "status": "활성" }
]
// Output (Combine 모드, onKey: userId)
[
{ "userId": "a1", "name": "김철수", "plan": "프리미엄", "status": "활성" }
]
주의! onKey
필드에 입력하는 키는 JSON 경로입니다. 예를 들어, json.userId
와 같이 입력해야 합니다.
3. Multiply (곱하기) ✖️
두 입력(Input 1, Input 2)을 받아, 지정된 ‘키(Key)’를 기준으로 아이템들을 결합하지만, Combine 모드와 달리 Input 1의 각 아이템에 대해 Input 2에서 일치하는 모든 아이템을 배열 형태로 추가합니다. 1대N 또는 N대M 관계에 적합합니다.
- 언제 사용할까요? 하나의 주문에 여러 개의 상품이 포함되어 있거나, 하나의 제품에 여러 개의 리뷰가 있는 경우처럼 부모-자식 관계의 데이터를 결합할 때.
- 예시: 주문 번호를 기준으로 “주문 정보”에 “주문 상품 목록”을 결합할 때.
// Input 1 (주문 정보)
[
{ "orderId": "O001", "customer": "박영희" }
]
// Input 2 (주문 상품)
[
{ "orderId": "O001", "product": "신발", "qty": 1 },
{ "orderId": "O001", "product": "양말", "qty": 2 }
]
// Output (Multiply 모드, onKey: orderId)
[
{
"orderId": "O001",
"customer": "박영희",
"merged": [ // 'merged'는 기본 프로퍼티명, 설정 가능
{ "orderId": "O001", "product": "신발", "qty": 1 },
{ "orderId": "O001", "product": "양말", "qty": 2 }
]
}
]
merged
라는 이름은 기본적으로 사용되는 프로퍼티 이름이며, Merge 노드의 설정에서 Property Name for Matched Items
를 통해 변경할 수 있습니다.
4. Custom (사용자 정의) ✍️
가장 유연하고 강력한 모드입니다. JavaScript 코드를 사용하여 두 입력(Input 1, Input 2)의 데이터를 원하는 방식으로 결합할 수 있습니다. onKey
와 같은 특정 기준이 아닌, 복잡한 로직이나 조건부 결합이 필요할 때 사용됩니다.
- 언제 사용할까요? 특정 조건에 따라 데이터를 필터링하면서 합치거나, 여러 입력에서 특정 필드만 선택적으로 가져와 새로운 구조를 만들 때.
- 예시: Input 1의 데이터와 Input 2의 데이터를 비교하여 중복을 제거하고 합치거나, 특정 조건에 맞는 데이터만 선택적으로 가져올 때.
// 코드 에디터 내에서 접근 가능:
// $node.Input.item[0].json => Input 1의 첫 번째 아이템 데이터
// $node.Input.item[1].json => Input 2의 첫 번째 아이템 데이터
// $node.Input.getAllItems() => 모든 Input의 모든 아이템을 배열로 반환
// 예시: Input 1의 각 아이템에 Input 2의 모든 아이템을 'additional_data'로 추가
const output = [];
const input1Items = $node.Input.item[0].json; // Input 1의 아이템들 (배열)
const input2Items = $node.Input.item[1].json; // Input 2의 아이템들 (배열)
for (const item1 of input1Items) {
output.push({
...item1,
additional_data: input2Items // Input 2의 모든 데이터를 통째로 추가
});
}
return output;
returnAllInput
옵션을 체크하면 Custom 모드에서 모든 Input을 $node.Input.getAllItems()
등으로 접근할 수 있어 훨씬 유연한 코딩이 가능합니다.
✨ n8n Merge 노드, 10가지 실전 예시로 완벽 마스터하기!
이제 이론을 바탕으로 실제 시나리오에 Merge 노드를 어떻게 적용할 수 있는지 10가지 예시를 통해 자세히 알아보겠습니다. 각 예시마다 어떤 모드를 사용하며, 왜 해당 모드가 적합한지 설명해 드릴게요.
1. 간단한 할 일 목록 합치기 (Append) 📋
- 시나리오: “오늘 할 일” 목록과 “내일 할 일” 목록이 각각 다른 소스(예: Notion 페이지, Google Sheets)에서 들어왔을 때, 이 두 목록을 하나의 통합된 할 일 목록으로 만들고 싶습니다.
- 왜 Merge? 단순히 두 개의 목록을 순서대로 이어 붙이면 되므로
Append
모드가 가장 적합합니다. - n8n 설정 (개념):
Node 1 (Set/Notion/Google Sheets)
: 오늘 할 일 목록 데이터를 생성/가져옵니다.Node 2 (Set/Notion/Google Sheets)
: 내일 할 일 목록 데이터를 생성/가져옵니다.Merge Node
:Node 1
과Node 2
를 Input으로 받아Append
모드로 설정합니다.
- 예상 출력:
[ { "task": "보고서 작성", "date": "오늘" }, { "task": "회의 준비", "date": "오늘" }, { "task": "이메일 회신", "date": "내일" }, { "task": "자료 정리", "date": "내일" } ]
2. 사용자 정보와 구독 정보 결합하기 (Combine) 👤🔑
- 시나리오: CRM 시스템에서 가져온 사용자 기본 정보(이름, 이메일)와 결제 시스템에서 가져온 사용자 구독 정보(플랜, 만료일)가 각각 있습니다.
userId
를 기준으로 이 두 정보를 합쳐 완전한 사용자 프로필을 만들고 싶습니다. - 왜 Merge?
userId
라는 공통된 키를 기준으로 1대1 매칭이 필요하므로Combine
모드를 사용합니다. - n8n 설정 (개념):
Node 1 (CRM API)
: 사용자 기본 정보 (userId, name, email)Node 2 (Payment API)
: 사용자 구독 정보 (userId, plan, expiryDate)Merge Node
:Node 1
과Node 2
를 Input으로 받아Combine
모드로 설정하고,onKey
를json.userId
로 설정합니다.
- 예상 출력:
[ { "userId": "user123", "name": "홍길동", "email": "hong@example.com", "plan": "Premium", "expiryDate": "2024-12-31" } ]
3. 주문 정보에 상품 목록 연결하기 (Multiply) 🛍️🛒
- 시나리오: 하나의 주문에는 여러 개의 상품이 포함될 수 있습니다. “주문 헤더 정보”(주문 번호, 고객명)와 “주문 상품 목록”(상품 ID, 수량, 가격)이 별도로 존재할 때, 주문 번호를 기준으로 각 주문에 해당 상품들을 연결하여 하나의 구조로 만들고 싶습니다.
- 왜 Merge? 하나의 주문에 여러 상품이 매칭되는 1대N 관계이므로
Multiply
모드를 사용합니다. - n8n 설정 (개념):
Node 1 (Order API)
: 주문 헤더 정보 (orderId, customerName)Node 2 (Order Line Items API)
: 주문 상품 목록 (orderId, productId, qty, price)Merge Node
:Node 1
과Node 2
를 Input으로 받아Multiply
모드로 설정하고,onKey
를json.orderId
로 설정합니다.Property Name for Matched Items
를lineItems
등으로 변경하여 출력 구조를 명확히 할 수 있습니다.
- 예상 출력:
[ { "orderId": "ORD001", "customerName": "이순신", "lineItems": [ { "orderId": "ORD001", "productId": "P001", "qty": 1, "price": 10000 }, { "orderId": "ORD001", "productId": "P002", "qty": 2, "price": 5000 } ] } ]
4. 동적 조건으로 데이터 통합하기 (Custom) 🔍➕
- 시나리오: Input 1에는 “제품 목록”(id, name)이 있고, Input 2에는 “재고 정보”(productId, stock)가 있습니다. 재고 정보가 있는 제품에 대해서만 재고 정보를 제품 목록에 추가하고 싶습니다. (단순히
Combine
모드로 하면 재고 정보가 없는 제품은 결과에서 사라질 수 있음) - 왜 Merge? 조건부로 데이터를 연결해야 하므로
Custom
모드를 사용합니다.Combine
은 매칭되는 경우만 출력하지만,Custom
은 매칭되지 않아도 Input 1의 데이터를 유지하면서 조건에 따라 데이터를 추가할 수 있습니다. - n8n 설정 (개념):
Node 1 (Product DB)
: 제품 목록 (id, name)Node 2 (Inventory API)
: 재고 정보 (productId, stock)Merge Node
:Node 1
과Node 2
를 Input으로 받아Custom
모드로 설정합니다.returnAllInputs
를 체크하여 모든 입력에 접근할 수 있도록 합니다.
-
Custom 모드 코드 예시:
const products = $node.Input.item[0].json; const inventories = $node.Input.item[1].json; const output = []; for (const product of products) { const matchingInventory = inventories.find(inv => inv.productId === product.id); output.push({ ...product, stock: matchingInventory ? matchingInventory.stock : 0 // 재고가 없으면 0으로 표시 }); } return output;
- 예상 출력:
[ { "id": "P1", "name": "노트북", "stock": 10 }, { "id": "P2", "name": "마우스", "stock": 50 }, { "id": "P3", "name": "키보드", "stock": 0 } // 재고 정보 없는 아이템도 유지 ]
5. 병렬 처리 결과 한데 모으기 (Append) ↔️➡️
- 시나리오: n8n 워크플로우에서 여러 개의 API 호출이나 데이터 처리 로직이 병렬적으로 실행된 후, 각 결과들을 한데 모아 최종적으로 하나의 알림(Slack, Email 등)을 보내거나 로그를 기록하고 싶습니다.
- 왜 Merge? 각 병렬 브랜치의 결과들이 독립적인 아이템이므로, 단순히 모두 합쳐야 할 때는
Append
모드가 가장 적합합니다. - n8n 설정 (개념):
Node A (API Call 1)
: 첫 번째 API 호출 결과Node B (API Call 2)
: 두 번째 API 호출 결과 (Node A와 병렬로 실행)Node C (API Call 3)
: 세 번째 API 호출 결과 (Node A, B와 병렬로 실행)Merge Node
:Node A
,Node B
,Node C
를 Input으로 받아Append
모드로 설정합니다.Node D (Slack/Email)
: Merge된 데이터를 바탕으로 알림을 보냅니다.
- 예상 출력:
[ { "source": "API1", "status": "성공", "data": "..." }, { "source": "API2", "status": "실패", "error": "..." }, { "source": "API3", "status": "성공", "data": "..." } ]
6. 월별 보고서 데이터 통합하기 (Combine) 📊📅
- 시나리오: 월간 보고서 작성을 위해 웹사이트 트래픽 데이터(날짜, 방문자 수)와 광고 캠페인 비용 데이터(날짜, 지출액)를 통합해야 합니다. 두 데이터 모두 날짜 필드를 가지고 있으며, 매일의 데이터를 합치고 싶습니다.
- 왜 Merge?
날짜
라는 공통 키를 기준으로 1대1 매칭이 필요하며, 누락되는 데이터 없이 정보를 결합해야 하므로Combine
모드를 사용합니다. - n8n 설정 (개념):
Node 1 (Google Analytics)
: 날짜별 트래픽 데이터 (date, visitors)Node 2 (Ad Platform API)
: 날짜별 광고 비용 데이터 (date, spend)Merge Node
:Node 1
과Node 2
를 Input으로 받아Combine
모드로 설정하고,onKey
를json.date
로 설정합니다.
- 예상 출력:
[ { "date": "2024-03-01", "visitors": 1500, "spend": 200 }, { "date": "2024-03-02", "visitors": 1800, "spend": 250 } // ... ]
7. 제품과 모든 관련 리뷰 연결하기 (Multiply) ⭐💬
- 시나리오: 특정 쇼핑몰의 제품 정보(제품 ID, 이름, 가격)와 해당 제품에 달린 모든 고객 리뷰(리뷰 ID, 제품 ID, 평점, 내용)를 통합하여 제품별 상세 페이지 데이터를 만들고 싶습니다. 하나의 제품에 여러 개의 리뷰가 있을 수 있습니다.
- 왜 Merge? 하나의 제품에 여러 리뷰가 매칭되는 1대N 관계이므로
Multiply
모드가 적합합니다. - n8n 설정 (개념):
Node 1 (Product DB)
: 제품 정보 (productId, name, price)Node 2 (Review DB)
: 리뷰 정보 (reviewId, productId, rating, comment)Merge Node
:Node 1
과Node 2
를 Input으로 받아Multiply
모드로 설정하고,onKey
를json.productId
로 설정합니다. 매칭된 아이템의 프로퍼티 이름을reviews
로 설정합니다.
- 예상 출력:
[ { "productId": "PROD001", "name": "스마트워치", "price": 250000, "reviews": [ { "reviewId": "R001", "productId": "PROD001", "rating": 5, "comment": "최고예요!" }, { "reviewId": "R002", "productId": "PROD001", "rating": 4, "comment": "배송이 빨라요." } ] } ]
8. 이메일 발송 후 성공/실패 기록 병합하기 (Custom) ✉️✅❌
- 시나리오: 대량의 이메일을 발송하고, 각 이메일 발송 결과(성공/실패 및 오류 메시지)를 기록하여 최종적으로 하나의 보고서로 만들고 싶습니다. 발송 과정 중 실패한 이메일만 따로 리스트업하고 싶을 수도 있습니다.
- 왜 Merge? 모든 발송 시도에 대한 성공/실패 여부를 통합하면서, 필요에 따라 특정 조건(실패)에 맞는 데이터만 추출하거나 별도의 로직을 적용해야 하므로
Custom
모드가 유연합니다. - n8n 설정 (개념):
Node 1 (Email List)
: 발송할 이메일 주소 목록 (email, name)Node 2 (Email Send Node)
: Node 1의 각 이메일 주소로 이메일 발송.Continue On Fail
을 설정하여 실패하더라도 워크플로우가 멈추지 않도록 합니다. 이 노드의 출력은 발송 성공/실패 여부와 원본 이메일 정보입니다.Merge Node
:Node 1
과Node 2
를 Input으로 받아Custom
모드로 설정하고returnAllInputs
를 체크합니다.
-
Custom 모드 코드 예시:
const initialEmails = $node.Input.item[0].json; // 원본 이메일 리스트 const sendResults = $node.Input.item[1].json; // 이메일 발송 결과 const combinedResults = []; for (const emailData of initialEmails) { const result = sendResults.find(r => r.email === emailData.email); combinedResults.push({ ...emailData, status: result ? result.status : "미발송", // 발송 결과가 없는 경우 처리 error: result && result.error ? result.error : null }); } // 실패한 이메일만 따로 추출하여 추가할 수도 있습니다. const failedEmails = combinedResults.filter(item => item.status === "실패"); return combinedResults; // 또는 return failedEmails;
- 예상 출력:
[ { "email": "a@example.com", "name": "A", "status": "성공", "error": null }, { "email": "b@example.com", "name": "B", "status": "실패", "error": "SMTP 오류" }, { "email": "c@example.com", "name": "C", "status": "성공", "error": null } ]
9. 여러 웹훅 이벤트 통합 처리 (Append) 🔗🌐
- 시나리오: 서로 다른 웹 서비스(예: GitHub, Slack, Trello)에서 들어오는 여러 웹훅 이벤트들을 한곳에 모아 중앙 로깅 시스템에 기록하거나, 이후 통합된 방식으로 처리하고 싶습니다.
- 왜 Merge? 각 웹훅은 독립적인 이벤트이므로, 단순히 시간 순서대로 또는 도착 순서대로 합치는 것이 목표일 때
Append
모드가 효율적입니다. - n8n 설정 (개념):
Webhook 1 (GitHub)
: GitHub 이벤트 수신Webhook 2 (Slack)
: Slack 이벤트 수신Webhook 3 (Trello)
: Trello 이벤트 수신Merge Node
:Webhook 1
,Webhook 2
,Webhook 3
을 Input으로 받아Append
모드로 설정합니다.Node (Logger/Database)
: 통합된 이벤트를 기록합니다.
- 예상 출력:
[ { "source": "github", "event": "push", "repo": "my-repo" }, { "source": "slack", "event": "message", "channel": "#general" }, { "source": "trello", "event": "card_updated", "cardId": "..." } ]
10. 마스터 데이터 관리 시스템 통합 (Combine) 🤝🌟
- 시나리오: 고객 데이터가 두 개의 분리된 시스템(예: CRM 시스템의 연락처 정보, ERP 시스템의 구매 이력)에 저장되어 있습니다. 각 시스템의
customerId
를 기준으로 데이터를 결합하여 마스터 고객 프로필을 만들고 싶습니다. 이때, 한 시스템에만 존재하는 고객도 결과에 포함되어야 합니다. - 왜 Merge? 특정 키를 기준으로 데이터를 결합하지만, 일치하는 데이터가 없는 경우에도 Input 1의 데이터를 유지하고 싶다면
Combine
모드의Return All For Input 1
옵션을 활용하거나,Custom
모드를 사용해야 합니다. 여기서는Combine
모드의 유연성을 강조합니다. - n8n 설정 (개념):
Node 1 (CRM)
: 고객 연락처 (customerId, name, email)Node 2 (ERP)
: 고객 구매 이력 (customerId, totalPurchases, lastPurchaseDate)Merge Node
:Node 1
을 Input 1,Node 2
를 Input 2로 받아Combine
모드로 설정합니다.onKey
를json.customerId
로 설정하고,Return All For Input 1
옵션을 체크합니다.
- 예상 출력:
[ { "customerId": "C001", "name": "김영희", "email": "kim@example.com", "totalPurchases": 12, "lastPurchaseDate": "2024-02-15" }, { "customerId": "C002", "name": "최민수", "email": "choi@example.com", "totalPurchases": null, // ERP에 없는 고객 "lastPurchaseDate": null } ]
(
Return All For Input 1
옵션을 체크하면 Input 1에 있는 모든 아이템이 결과에 포함되며, Input 2와 매칭되는 데이터가 없으면 해당 필드는null
또는undefined
로 남게 됩니다.)
💡 Merge 노드 활용 팁!
- 데이터 구조 이해: Merge 노드를 사용하기 전에 각 입력 노드에서 어떤 데이터 구조가 나오는지 정확히 파악하는 것이 중요합니다. 특히
Combine
이나Multiply
모드를 사용할 때는onKey
로 지정할 필드의 경로를 정확히 알아야 합니다. - Set 노드와 함께 사용: Merge 노드에 들어가는 데이터의 구조가 복잡하거나 일관적이지 않을 경우,
Set
노드를 사용하여 데이터를 표준화하거나 필요한 필드만 추출한 후 Merge 노드에 연결하면 워크플로우를 더욱 깔끔하게 관리할 수 있습니다. - Item Lists 노드와의 차이점:
Item Lists
노드도 데이터를 합치는 기능이 있지만, 주로 목록 내의 아이템들을 조작하거나 그룹화할 때 사용됩니다. 반면Merge
노드는 서로 다른 “입력 흐름”에서 오는 데이터 자체를 통합하는 데 중점을 둡니다. 두 노드의 차이점을 이해하고 적절히 활용하는 것이 중요합니다. - 테스트 또 테스트! 특히
Custom
모드나 복잡한Combine
/Multiply
시나리오에서는 실제 데이터를 넣어보고 예상한 출력이 나오는지 충분히 테스트해야 합니다.
🎉 마무리하며
n8n의 Merge 노드는 단순히 데이터를 합치는 기능을 넘어, 복잡한 데이터 통합 시나리오를 해결할 수 있는 강력한 도구입니다. Append
, Combine
, Multiply
, Custom
각 모드의 특성을 이해하고 10가지 실전 예시를 통해 그 활용법을 익히셨다면, 여러분의 n8n 워크플로우는 한 단계 더 진화할 것입니다!
이제 이 지식을 바탕으로 여러분만의 멋진 데이터 통합 자동화를 만들어 보세요. 궁금한 점이 있다면 언제든지 n8n 커뮤니티나 관련 자료를 찾아보시는 것을 추천합니다. 여러분의 자동화 여정을 응원합니다! 💪✨
다음 단계는 무엇인가요?
- 이 글에서 다룬 예시들을 직접 n8n 워크플로우로 구현해보세요.
- 자신이 해결하고 싶은 데이터 통합 문제를 Merge 노드로 해결할 수 있는지 고민해보세요.
- n8n 공식 문서에서 Merge 노드에 대한 더 깊은 내용을 탐색해보세요.
Happy Automating! 🤖