n8n 워크플로우를 처음 만들 때 거의 모두가 겪는 좌절이 있습니다. 트리거를 놓고, 다음 노드를 연결하고, 실행 버튼을 눌렀는데 두 번째 노드가 빨간 에러를 뱉거나 결과가 텅 비어 나오는 순간이죠. 분명히 선은 이어져 있는데 데이터는 넘어가지 않습니다. 튜토리얼을 따라 첫 자동화는 만들었어도, 막상 내 상황에 맞게 노드를 바꾸면 어김없이 여기서 막힙니다. 결론부터 말하면, 이건 노드 설정 실수라기보다 n8n이 데이터를 어떤 모양으로 주고받는지를 모르고 지나친 탓인 경우가 대부분입니다. 이 글에서는 n8n 워크플로우에서 데이터가 노드 사이를 어떻게 흐르는지, 그 구조 하나만 이해하면 왜 대부분의 에러가 풀리는지를 정리합니다.
왜 노드는 연결됐는데 데이터가 안 넘어갈까
핵심은 단 하나입니다. n8n에서 노드와 노드 사이를 흐르는 데이터는 항상 "객체들의 배열(array of items)" 형태이고, 각 항목은 json이라는 키로 감싸여 있습니다. 공식 문서에 정리된 표준 구조는 이렇게 생겼습니다(n8n 공식 문서 — How n8n structures data).
[
{ "json": { "name": "김철수", "city": "서울" } },
{ "json": { "name": "이영희", "city": "부산" } }
]
여기서 두 가지가 보입니다. 첫째, 데이터는 여러 개의 항목(item)이 줄지어 선 배열이라는 점. 둘째, 실제 값은 json 키 안쪽에 들어 있다는 점입니다. 노드는 이 배열을 받아 항목 하나하나를 반복 처리합니다. 즉 항목이 3개면 그 다음 노드의 동작도 3번 일어납니다. "메일이 한 통만 갈 줄 알았는데 5통이 갔다" 같은 일이 벌어지는 이유가 바로 이 항목 반복 구조입니다.
데이터가 안 넘어가는 전형적인 상황도 여기서 갈립니다. 이전 노드가 값을 json 키로 감싸지 않은 채 넘기거나, 내가 기대한 키 이름과 실제 키 이름이 다를 때, 다음 노드는 "참조할 데이터가 없다"고 판단해 빈 결과를 냅니다. 선이 연결돼 있어도 n8n이 약속한 모양(배열 + json 키)에 맞지 않으면 흐르지 않는 겁니다. 참고로 Code 노드(구 Function 노드)에서는 결과를 직접 다룰 때 json 키로 감싸 반환해야 한다는 점도 같은 맥락입니다.
이전 노드의 데이터를 불러오는 표현식 읽는 법
구조를 이해했다면, 다음은 그 데이터를 꺼내 쓰는 문법입니다. n8n에서는 노드 입력칸에 {{ }} 중괄호 두 개를 쓰면 그 안에 자바스크립트와 비슷한 표현식(expression)을 넣을 수 있습니다. 자주 쓰는 두 가지만 익히면 대부분 해결됩니다.
{{ $json.city }}— 바로 직전 노드가 넘긴 현재 항목의 값.$json은 "지금 처리 중인 항목의 json"을 뜻합니다.{{ $('노드이름').item.json.city }}— 특정 이전 노드의 데이터를 콕 집어 가져오기. 중간에 노드를 여러 개 거친 뒤에도 앞쪽 노드 값을 직접 참조할 때 씁니다.
n8n 공식 문서도 이 두 가지를 가장 기본적인 접근법으로 안내합니다(n8n 공식 문서 — Referencing previous nodes). $json은 현재 입력 항목의 데이터를, $('노드 이름').item.json은 연결된 이전 노드의 항목 데이터를 가져오는 용도입니다. 흔한 실수 하나는 노드 이름을 바꾼 뒤 표현식 속 이름을 그대로 둬서 참조가 깨지는 경우입니다. 표현식 안의 노드 이름은 화면에 보이는 노드 이름과 글자 하나까지 정확히 같아야 합니다.
표현식이 [undefined]로 뜰 때
표현식 결과가 undefined로 나온다면 십중팔구 키 경로(path)가 틀린 것입니다. $json.city라고 썼는데 실제 데이터는 $json.body.city처럼 한 단계 더 들어가 있는 식이죠. 이때 추측으로 경로를 고치지 말고, 다음 단락에서 설명할 입력 패널을 직접 보면서 실제 키 구조를 확인하는 편이 훨씬 빠릅니다. 한 가지 더, n8n은 버전 업데이트가 잦아 이전에 쓰던 표현식 문법이 새 버전에서 다르게 동작하는 경우도 있으니, 막힐 때는 사용 중인 버전의 공식 문서를 함께 확인하는 습관이 안전합니다.
막힐 때 바로 쓰는 n8n 워크플로우 실용 팁
구조와 문법을 알아도 매번 손으로 표현식을 타이핑하면 오타가 납니다. n8n에는 이 과정을 줄여주는 장치가 마련돼 있습니다.
- 드래그 앤 드롭 매핑: 노드를 열면 왼쪽에 이전 노드의 결과를 보여주는 INPUT 패널이 있습니다. 거기서 원하는 값을 끌어다 입력칸에 놓으면 n8n이 올바른 표현식을 자동으로 만들어 줍니다. 경로를 외울 필요가 없어집니다(n8n 공식 문서 — Data mapping).
- 스키마(Schema) 보기: 입력 패널을 표(Table)나 JSON 대신 스키마 모드로 보면 키 이름과 중첩 구조가 한눈에 정리됩니다.
$json.body.city같은 깊은 경로를 정확히 짚을 수 있습니다. - 데이터 피닝(Pin data): 한 번 실행해서 받은 노드 출력을 고정해 두는 기능입니다. 고정하면 다음 실행부터는 외부 API를 다시 호출하지 않고 그 데이터를 재사용하므로, 뒤쪽 노드를 고치며 테스트할 때 매번 새로 호출하느라 기다릴 필요가 없습니다. 고정 상태에서는 출력 패널 위에 안내 배너가 뜨고, 풀고 싶으면 그 배너의 Unpin 링크를 누르면 됩니다.
특히 데이터 피닝은 외부 서비스 호출 횟수에 제한이 있거나 응답이 느린 API를 다룰 때 체감 효과가 큽니다. 고정해 둔 입력 데이터를 직접 편집해 가며 "이런 값이 들어오면 어떻게 될까" 같은 예외 상황을 테스트할 수도 있어, 매번 실제 데이터를 흘려보내지 않고도 워크플로우를 점검할 수 있습니다.
증상별 빠른 점검표
| 증상 | 흔한 원인 | 먼저 해볼 것 |
|---|---|---|
| 다음 노드 결과가 비어 있음 | 키 이름·경로 불일치 | INPUT 패널을 스키마 모드로 보고 실제 키 확인 |
| 표현식이 undefined | 중첩 경로 누락(body 등) | 값을 드래그 앤 드롭해 정확한 경로 자동 생성 |
| 같은 동작이 여러 번 실행 | 입력 항목이 여러 개 | 이전 노드 출력의 항목 수(배열 길이) 확인 |
| 특정 노드 참조가 깨짐 | 노드 이름 변경 후 표현식 미수정 | 표현식 속 노드 이름을 현재 이름과 일치시키기 |
결론: 구조 먼저, 문법은 그다음
n8n 워크플로우에서 데이터가 안 넘어가는 문제의 대부분은 "배열 + json 키"라는 데이터 모양과, $json·$('노드이름') 두 표현식만 이해하면 풀립니다. 더 멋진 노드를 추가하기 전에, 막히는 그 노드의 INPUT 패널을 열어 실제 데이터가 어떤 모양으로 들어오는지부터 확인해 보세요. 구조가 눈에 들어오는 순간, 빨간 에러가 더 이상 막막하지 않을 겁니다. 오늘 만들다 멈춰 둔 워크플로우가 있다면, 그 노드의 입력 패널부터 다시 열어보는 것으로 시작해보세요.
※ 본 글의 기능 설명과 표현식 문법은 작성 시점(2026년 6월) 기준 n8n 공식 문서를 바탕으로 합니다. n8n은 버전 업데이트가 잦아 일부 표현식 문법이 달라질 수 있으니, 실제 사용 중인 버전의 공식 문서를 함께 참고하시길 권합니다.
라벨: n8n, n8n 워크플로우, 워크플로우 자동화, 노코드 자동화, 데이터 구조, 표현식, 데이터 피닝, AI도구, 업무 자동화
댓글 없음:
댓글 쓰기