데이터 흐름과 JSON 구조 이해
n8n에서 데이터 흐름과 JSON 구조를 정확히 이해하는 것은 자동화 워크플로우를 설계하고 데이터를 효과적으로 가공·처리하는 데 필수입니다. 이 장에서는 n8n의 데이터 구조, JSON의 핵심 개념, 데이터 타입, 그리고 실전에서 자주 활용되는 다양한 빌트인 함수까지 정리합니다.
n8n의 데이터 흐름 구조
n8n의 워크플로우에서 노드 간 데이터는 항상 배열(Array) 형태의 객체(Object)로 전달됩니다.
이 배열의 각 요소를 아이템(item)이라고 부르며, 각 노드는 이 아이템을 하나씩 처리합니다.
데이터는 기본적으로 JSON 객체로 구성되며, 각 객체는
json
이라는 키 아래 실제 데이터를 담습니다.예시 구조:
[
{ "json": { "name": "홍길동", "email": "hong@test.com" } },
{ "json": { "name": "김철수", "email": "kim@test.com" } }
]
- 각 노드는 이 배열을 받아 내부 로직을 각 아이템에 반복 적용합니다.
JSON의 핵심: 키-값 쌍과 데이터 타입
JSON(JavaScript Object Notation)은 데이터를 키-값 쌍으로 표현하는 방식입니다.
키는 데이터를 식별하는 이름, 값은 실제 데이터로, 문자열, 숫자, 부울, 배열, 객체 등 다양한 타입이 올 수 있습니다.
예시:
{ "name": "홍길동", "email": "hong@test.com", "age": 30, "isActive": true, "tags": ["회원", "프리미엄"] }
n8n에서 자주 쓰이는 데이터 타입:
- 문자열(String):
"홍길동"
- 숫자(Number):
30
- 부울(Boolean):
true
또는false
- 배열(Array):
["A", "B", "C"]
- 객체(Object):
{ "key": "value" }
- 날짜(Date):
"2024-01-26"
(문자열로 표현) - 바이너리(Binary): 파일, 이미지 등(별도 처리 필요)
- 문자열(String):
n8n에서 JSON 데이터 생성 및 수정
- Set/Edit Fields 노드: 직접 키와 값을 입력해 새로운 JSON 데이터를 만들거나 기존 데이터를 수정할 수 있습니다.
- Code 노드: JavaScript로 배열과 객체를 직접 정의해 복잡한 JSON 구조를 만들 수 있습니다.
데이터 타입 변환과 다양한 빌트인 함수 활용
n8n은 워크플로우 내에서 데이터를 쉽게 가공하고 변환할 수 있도록 다양한 빌트인(builtin) 함수를 제공합니다. 이 함수들은 Expressions Editor({{ ... }}
)에서 자유롭게 사용할 수 있습니다.
문자열(String) 관련 함수
split: 문자열을 특정 구분자로 나누어 배열로 변환
{{ $json.name.split(' ') }}
// Input { "name": "홍 길 동" } // Output ["홍", "길", "동"]
join: 배열을 특정 구분자로 연결해 문자열로 변환
{{ $json.tags.join(', ') }}
// Input { "tags": ["회원", "VIP", "프리미엄"] } // Output "회원, VIP, 프리미엄"
replace: 문자열 내 특정 부분을 다른 값으로 대체
{{ $json.email.replace('@test.com', '@example.com') }}
// Input { "email": "hong@test.com" } // Output "hong@example.com"
toLowerCase / toUpperCase: 문자열을 소문자/대문자로 변환
{{ $json.name.toUpperCase() }}
// Input { "name": "hong gil dong" } // Output "HONG GIL DONG"
trim: 문자열 양쪽의 공백 제거
{{ $json.name.trim() }}
// Input { "name": " 홍길동 " } // Output "홍길동"
substring / slice: 문자열의 일부만 추출
{{ $json.code.substring(0, 3) }}
// Input { "code": "ABC12345" } // Output "ABC"
배열(Array) 관련 함수
map: 배열의 각 요소에 함수를 적용해 새로운 배열 생성
{{ $json.items.map(item => item.price) }}
// Input { "items": [ { "price": 100 }, { "price": 200 }, { "price": 300 } ] } // Output [100, 200, 300]
filter: 조건에 맞는 배열 요소만 추출
{{ $json.items.filter(item => item.active) }}
// Input { "items": [ { "active": true, "name": "A" }, { "active": false, "name": "B" } ] } // Output [ { "active": true, "name": "A" } ]
reduce: 배열의 모든 값을 누적 계산
{{ $json.numbers.reduce((a, b) => a + b, 0) }}
// Input { "numbers": [1, 2, 3, 4] } // Output 10
includes: 배열에 특정 값이 포함되어 있는지 확인
{{ $json.tags.includes('VIP') }}
// Input { "tags": ["회원", "VIP", "프리미엄"] } // Output true
concat: 여러 배열을 하나로 합침
{{ $json.arr1.concat($json.arr2) }}
// Input { "arr1": [1, 2], "arr2": [3, 4] } // Output [1, 2, 3, 4]
숫자(Number) 관련 함수
parseInt / parseFloat: 문자열을 정수/실수로 변환
{{ parseInt($json.age) }}
// Input { "age": "42", "height": "175.5" } // Output {{ parseInt($json.age) }} // 42 (정수) {{ parseFloat($json.height) }} // 175.5 (실수)
toFixed: 소수점 자리수 제한
{{ $json.price.toFixed(2) }}
// Input { "price": 1234.56789 } // Output {{ $json.price.toFixed(2) }} // "1234.57" {{ $json.price.toFixed(0) }} // "1235"
Math 함수:
Math.round()
,Math.max()
,Math.min()
등 다양한 수학 함수 사용{{ Math.max(...$json.scores) }}
// Input { "scores": [88.7, 92.1, 77.5] } // Output {{ Math.round($json.scores[0]) }} // 89 {{ Math.max(...$json.scores) }} // 92.1 {{ Math.min(...$json.scores) }} // 77.5
날짜(Date) 관련 함수
toISOString: 날짜를 ISO 문자열로 변환
{{ new Date($json.createdAt).toISOString() }}
// Input "createdAt": "2025-06-01T10:30:00" // Output {{ new Date($json.createdAt).toISOString() }} 2025-06-01T10:30:00.000Z
getFullYear / getMonth / getDate: 날짜의 연, 월, 일 추출
{{ new Date($json.birthday).getFullYear() }}
코드 | 설명 | 결과 |
---|---|---|
{{ new Date($json.birthday).getFullYear() }} |
연도 | 1990 |
{{ new Date($json.birthday).getMonth() }} |
월 (0부터 시작) | 11 (12월) |
{{ new Date($json.birthday).getDate() }} |
일 (날짜) | 25 |
객체(Object) 관련 함수
- Object.keys / Object.values / Object.entries: 객체의 키, 값, 키-값 쌍 배열 추출
{{ Object.keys($json) }}
{{ Object.values($json) }}
{{ Object.entries($json) }}
// Input { "name": "홍길동", "email": "hong@test.com", "age": 30 } // Output {{ Object.keys($json) }} ["name", "email", "age"] {{ Object.values($json) }} ["홍길동", "hong@test.com", 30] {{ Object.entries($json) }} [["name", "홍길동"], ["email", "hong@test.com"], ["age", 30]]
- hasOwnProperty: 객체에 특정 키가 있는지 확인
{{ $json.hasOwnProperty('email') }}
// Input { "name": "홍길동", "email": "hong@test.com", "age": 30 } // Output {{ $json.hasOwnProperty('email') }} true
- assign: 여러 객체를 하나로 병합
{{ Object.assign({}, $json, { status: 'active' }) }}
// Input { "name": "홍길동", "email": "hong@test.com" } // Output {{ Object.assign({}, $json, { status: 'active' }) }} { "name": "홍길동", "email": "hong@test.com", "status": "active" }
기타 유용한 함수
- encodeURIComponent / decodeURIComponent: URL 인코딩/디코딩
{{ encodeURIComponent($json.query) }}
- JSON.parse / JSON.stringify: 문자열과 객체 간 변환
{{ JSON.parse($json.data) }}
데이터 처리 노드와 활용
- Set/Edit Fields: 필드 추가, 삭제, 이름 변경 등 간단한 데이터 가공
- Merge: 여러 데이터 스트림을 하나로 합치거나 병합
- Split Out/Split In Batches: 배열을 개별 아이템 또는 일정 크기로 분할
- Aggregate: 합산, 그룹화, 통계 처리
- Function/Code: JavaScript로 자유로운 데이터 변환 및 배열/객체 조작
실전 예시
- Webhook에서 받은 JSON 데이터를 Set 노드로 가공, IF 노드로 조건 분기, Email 노드로 결과 발송
- 여러 데이터 소스를 Merge 노드로 합친 뒤, Google Sheets에 저장
확인문제
- n8n에서 노드 간에 전달되는 데이터의 기본 구조는 어떻게 생겼나요?
- 배열을 문자열로 변환하거나, 문자열을 배열로 변환하는 데 사용할 수 있는 함수는 무엇인가요?
- 배열에서 특정 조건을 만족하는 값만 추출하고 싶을 때 사용할 수 있는 함수는 무엇인가요?
주요 용어
- JSON: 키-값 쌍으로 이루어진 데이터 구조, n8n의 표준 데이터 포맷
- 아이템(Item): 노드 간에 전달되는 데이터의 한 단위(객체)
- Set/Edit Fields 노드: 데이터 필드 추가, 수정, 삭제 노드
- Function/Code 노드: JavaScript로 데이터 구조를 자유롭게 변환하는 노드
- 빌트인 함수: n8n Expressions Editor에서 사용할 수 있는 내장 데이터 처리 함수