노드 구조와 데이터 흐름
Ch.3 에서 만든 워크플로가 왜 작동하는지 한 단계 깊이 — n8n 안의 모든 데이터는 JSON 배열이고, 노드는 그 배열을 받아 새 배열을 내놓는 박스입니다.
Ch.3 에서 Set 노드에 ={{ $json.datetime }} 라고 쓴 게 그냥 동작했죠. 왜 동작했는지, 그리고 그 표현식 안의 $json 이 정확히 뭘 가리키는지를 이번에 짚습니다. 이걸 알면 어떤 노드의 결과에서도 원하는 값을 정확히 꺼낼 수 있어요.
n8n 의 모든 데이터는 JSON 배열
화면에 어떤 노드가 떠 있든 — Manual Trigger, HTTP Request, Slack, Postgres, OpenAI — 그 노드의 입력과 출력은 예외 없이 같은 모양입니다: items 라는 JSON 배열.
이 통일된 형태가 n8n 의 비밀입니다. 모든 노드가 같은 입출력 규칙을 따르니까 어떤 두 노드든 자유롭게 연결할 수 있어요. Slack 출력을 그대로 Postgres 입력으로? 가능. OpenAI 응답을 Google Sheets 행으로? 가능. 전제는 — 각 노드가 받는 게 항상 items 배열, 내보내는 것도 items 배열.
한 item 안에서 값을 꺼내는 법
Ch.3 에서 쓴 ={{ $json.datetime }} 의 의미를 분해해보면:
즉 $json 은 "지금 이 노드가 처리 중인 한 item 의 json 부분" 을 가리킵니다. 이전 노드의 출력이 [{json: {datetime: "2026-05-18T..."}}] 였다면 $json.datetime 이 "2026-05-18T..." 문자열이 되는 거죠.
중첩이 더 깊을 때도 같은 방식:
표현식에서 쓸 수 있는 변수 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 영역 우측 상단에 세 버튼이 있어요. 각각 같은 데이터를 다른 모양으로 보여줍니다.
| 뷰 | 언제 좋은가 |
|---|---|
| Table | items 가 여러 개일 때 표 형태로 한눈에. 행 = item, 열 = 필드. |
| JSON | 중첩 구조가 깊을 때. 전체 구조 그대로 확인. |
| Schema | 필드 이름·타입만 빠르게 훑고 싶을 때. 어떤 필드를 표현식에 쓸 수 있는지 카탈로그. |
표현식 작성 시 핵심 기능 — JSON 뷰에서 어떤 값을 우클릭하면 "Copy expression" 옵션이 떠요. 그 표현식을 다음 노드에 그대로 붙여넣으면 정확한 경로가 자동 입력. 손으로 $json.user.profile.email 같은 긴 경로 안 쳐도 됩니다.
items 가 여러 개일 때 — 한 번 vs 각각
이전 노드가 items 100개를 내보냈다면 이 노드는 어떻게 실행될까? 두 모드가 있어요.
items 100개 → 노드가 100번 실행 → 각 실행마다
$json 은 그 item 하나만 가리킴. Set·HTTP Request·Slack 등 거의 모든 노드의 기본 동작.
items 100개 → 노드가 1번 실행 →
$input.all() 로 전체 100개 배열을 한 번에 접근. Code 노드에서 평균·합계 같은 집계 작업 할 때.
실제 예 — 사용자 목록 100명에게 각자 다른 메일을 보내려면 ①(기본 모드). 100명의 평균 가입일을 계산하려면 ②(전체 한 번). Code 노드에서 명시적으로 모드 선택, 다른 노드는 거의 항상 ①.
다음 Ch.5 에서는 표현식 {{ }} 안에 쓸 수 있는 JavaScript 패턴 — 문자열 자르기·날짜 포맷·조건문·배열 메서드 — 를 실전 예제로 정리합니다. 이걸 알면 Code 노드 없이도 Set 노드만으로 거의 모든 변환을 처리할 수 있어요.