n8n 한국어 교재 · Ch.4

노드 구조와 데이터 흐름

Ch.3 에서 만든 워크플로가 왜 작동하는지 한 단계 깊이 — n8n 안의 모든 데이터는 JSON 배열이고, 노드는 그 배열을 받아 새 배열을 내놓는 박스입니다.

두 노드 사이를 흐르는 JSON 데이터 — { json: {...} } 형태의 items 배열이 화살표로 연결된 그림

Ch.3 에서 Set 노드에 ={{ $json.datetime }} 라고 쓴 게 그냥 동작했죠. 왜 동작했는지, 그리고 그 표현식 안의 $json 이 정확히 뭘 가리키는지를 이번에 짚습니다. 이걸 알면 어떤 노드의 결과에서도 원하는 값을 정확히 꺼낼 수 있어요.

n8n 의 모든 데이터는 JSON 배열

화면에 어떤 노드가 떠 있든 — Manual Trigger, HTTP Request, Slack, Postgres, OpenAI — 그 노드의 입력과 출력은 예외 없이 같은 모양입니다: items 라는 JSON 배열.

[ { "json": { ... 실제 데이터 ... }, "binary": { ... 파일 데이터, 있을 때만 ... } }, { "json": { ... }, ... }, ... ]

이 통일된 형태가 n8n 의 비밀입니다. 모든 노드가 같은 입출력 규칙을 따르니까 어떤 두 노드든 자유롭게 연결할 수 있어요. Slack 출력을 그대로 Postgres 입력으로? 가능. OpenAI 응답을 Google Sheets 행으로? 가능. 전제는 — 각 노드가 받는 게 항상 items 배열, 내보내는 것도 items 배열.

한 줄 정리 — n8n 의 모든 노드는 "items 배열을 받아 items 배열을 내놓는 함수" 입니다. JSON 모양만 통일돼 있으면 1,300개 노드를 자유롭게 짜맞출 수 있어요.

한 item 안에서 값을 꺼내는 법

Ch.3 에서 쓴 ={{ $json.datetime }} 의 의미를 분해해보면:

= # "여기는 표현식이다" 시작 표시 {{ # JavaScript 코드 시작 $json # 현재 item 의 json 부분 (이전 노드 결과) .datetime # 그 안의 datetime 필드 }} # 코드 끝

$json"지금 이 노드가 처리 중인 한 item 의 json 부분" 을 가리킵니다. 이전 노드의 출력이 [{json: {datetime: "2026-05-18T..."}}] 였다면 $json.datetime 이 "2026-05-18T..." 문자열이 되는 거죠.

중첩이 더 깊을 때도 같은 방식:

# 이전 노드 출력 { "user": { "name": "박준성", "emails": ["[email protected]", "[email protected]"] } } # 표현식 {{ $json.user.name }} → "박준성" {{ $json.user.emails[0] }} → "[email protected]" {{ $json.user.emails.length }} → 2

표현식에서 쓸 수 있는 변수 5종

실무에서 자주 쓰는 다섯 가지. 외울 필요 없고 이 표만 한 번 봐두면 필요할 때 떠올라요.

변수가리키는 것예시
$json바로 이전 노드의 현재 item 의 json{{ $json.email }}
$input현재 노드의 전체 입력 (items 배열 접근){{ $input.all().length }}
$node특정 이름의 노드 결과 직접 참조{{ $node["HTTP Request"].json.id }}
$now현재 시간 (Luxon DateTime){{ $now.toFormat("yyyy-MM-dd") }}
$workflow워크플로 메타 (id, name, active){{ $workflow.name }}

가장 많이 쓰는 건 $json. 95% 의 경우 직전 노드의 데이터를 받는 거고, 그게 $json. $node["이름"] 은 흐름이 분기됐다가 다시 만났을 때, 또는 멀리 떨어진 노드의 값이 필요할 때.

흔한 실수 — $json.email 인데 $json["email"] 라고 따옴표로 감싸도 됩니다. 단 필드명에 점·하이픈·공백이 들어있으면("first-name") 반드시 대괄호 + 따옴표: $json["first-name"].

데이터 보는 3가지 뷰 — Table · JSON · Schema

노드 패널의 OUTPUT 영역 우측 상단에 세 버튼이 있어요. 각각 같은 데이터를 다른 모양으로 보여줍니다.

n8n 캔버스 화면 (참조용)
실제 화면에서 노드 클릭 시 우측에 OUTPUT 패널이 열리고 거기서 뷰 전환.
언제 좋은가
Tableitems 가 여러 개일 때 표 형태로 한눈에. 행 = item, 열 = 필드.
JSON중첩 구조가 깊을 때. 전체 구조 그대로 확인.
Schema필드 이름·타입만 빠르게 훑고 싶을 때. 어떤 필드를 표현식에 쓸 수 있는지 카탈로그.

표현식 작성 시 핵심 기능 — JSON 뷰에서 어떤 값을 우클릭하면 "Copy expression" 옵션이 떠요. 그 표현식을 다음 노드에 그대로 붙여넣으면 정확한 경로가 자동 입력. 손으로 $json.user.profile.email 같은 긴 경로 안 쳐도 됩니다.

items 가 여러 개일 때 — 한 번 vs 각각

이전 노드가 items 100개를 내보냈다면 이 노드는 어떻게 실행될까? 두 모드가 있어요.

① Run Once For Each Item (기본)
items 100개 → 노드가 100번 실행 → 각 실행마다 $json 은 그 item 하나만 가리킴. Set·HTTP Request·Slack 등 거의 모든 노드의 기본 동작.
② Run Once For All Items
items 100개 → 노드가 1번 실행 → $input.all() 로 전체 100개 배열을 한 번에 접근. Code 노드에서 평균·합계 같은 집계 작업 할 때.

실제 예 — 사용자 목록 100명에게 각자 다른 메일을 보내려면 ①(기본 모드). 100명의 평균 가입일을 계산하려면 ②(전체 한 번). Code 노드에서 명시적으로 모드 선택, 다른 노드는 거의 항상 ①.

왜 헷갈리는가 — "내가 만든 워크플로가 100번 실행됐다" 가 아니라 "이 노드 하나가 100번 실행됐다" 입니다. 워크플로 자체는 한 번 실행이고, 각 노드가 안에서 items 만큼 반복.

다음 Ch.5 에서는 표현식 {{ }} 안에 쓸 수 있는 JavaScript 패턴 — 문자열 자르기·날짜 포맷·조건문·배열 메서드 — 를 실전 예제로 정리합니다. 이걸 알면 Code 노드 없이도 Set 노드만으로 거의 모든 변환을 처리할 수 있어요.

n8n 한국어 교재 · Ch.4 완료

다음 편 → Ch.5 Expression 문법 마스터 — 자주 쓰는 패턴 10가지

전체 시리즈 보기

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