데이터 흐름과 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): 파일, 이미지 등(별도 처리 필요)

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에 저장

확인문제

  1. n8n에서 노드 간에 전달되는 데이터의 기본 구조는 어떻게 생겼나요?
  2. 배열을 문자열로 변환하거나, 문자열을 배열로 변환하는 데 사용할 수 있는 함수는 무엇인가요?
  3. 배열에서 특정 조건을 만족하는 값만 추출하고 싶을 때 사용할 수 있는 함수는 무엇인가요?

주요 용어

  • JSON: 키-값 쌍으로 이루어진 데이터 구조, n8n의 표준 데이터 포맷
  • 아이템(Item): 노드 간에 전달되는 데이터의 한 단위(객체)
  • Set/Edit Fields 노드: 데이터 필드 추가, 수정, 삭제 노드
  • Function/Code 노드: JavaScript로 데이터 구조를 자유롭게 변환하는 노드
  • 빌트인 함수: n8n Expressions Editor에서 사용할 수 있는 내장 데이터 처리 함수