데이터 구조 이해하기
이 챕터에서는 n8n의 데이터 구조와 Code 노드를 사용하여 데이터를 변환하고 노드 출력을 시뮬레이션하는 방법을 배웁니다. 기본적으로 n8n 노드는 ETL(Extract, Transform, Load) 도구로 작동합니다.
이 챕터에서는 n8n의 데이터 구조와 Code 노드를 사용하여 데이터를 변환하고 노드 출력을 시뮬레이션하는 방법을 배웁니다.
n8n의 데이터 구조#
기본적으로 n8n 노드는 ETL(Extract, Transform, Load) 도구로 작동합니다. 노드를 통해 여러 이기종 소스에서 데이터를 가져오고(추출), 특정 방식으로 수정하고(변환), 필요한 곳으로 전달(로드)할 수 있습니다.
워크플로에서 노드 간에 이동하는 데이터는 각 노드가 인식하고 해석할 수 있는 형식(구조)이어야 합니다. n8n에서 이 필수 구조는 객체의 배열입니다.
배열은 값의 목록입니다. 배열은 비어 있거나 여러 요소를 포함할 수 있습니다. 각 요소는 0부터 시작하는 목록의 위치(인덱스)에 저장되며 인덱스 번호로 참조할 수 있습니다. 예를 들어, 배열 ["Leonardo", "Michelangelo", "Donatello", "Raphael"];에서 요소 Donatello는 인덱스 2에 저장됩니다.
객체는 배열처럼 번호가 매겨진 인덱스의 값 대신 키-값 쌍을 저장합니다. 값은 키 이름으로 참조할 수 있으므로 쌍의 순서는 중요하지 않습니다. 예를 들어, 아래 객체에는 두 가지 속성(name과 color)이 포함되어 있습니다:
{
name: 'Michelangelo',
color: 'blue',
}
객체 배열은 하나 이상의 객체를 포함하는 배열입니다. 예를 들어, 아래 배열 turtles에는 네 개의 객체가 포함되어 있습니다:
var turtles = [
{
name: 'Michelangelo',
color: 'orange',
},
{
name: 'Donatello',
color: 'purple',
},
{
name: 'Raphael',
color: 'red',
},
{
name: 'Leonardo',
color: 'blue',
}
];
점 표기법 구문 object.property를 사용하여 객체의 속성에 접근할 수 있습니다. 예를 들어, turtles[1].color는 두 번째 거북이의 색상을 가져옵니다.
한 노드에서 다른 노드로 전송되는 데이터는 JSON 객체의 배열로 전송됩니다. 이 컬렉션의 요소를 항목(items)이라고 합니다.

n8n 노드는 들어오는 데이터의 각 항목에 대해 동작을 수행합니다.

Code 노드로 데이터 세트 만들기#
n8n 데이터 구조에 익숙해졌으니, 이를 사용하여 자체 데이터 세트를 만들거나 노드 출력을 시뮬레이션할 수 있습니다. 이를 위해 Code 노드를 사용하여 다음 구조의 객체 배열을 정의하는 JavaScript 코드를 작성합니다:
return [
{
json: {
apple: 'beets',
}
}
];
예를 들어, 닌자 거북이를 나타내는 객체 배열은 Code 노드에서 다음과 같이 보입니다:

이 객체 배열에는 추가 키 json이 포함되어 있습니다. n8n은 배열의 각 객체를 json 키가 있는 또 다른 객체로 감싸도록 요구합니다.

n8n이 사용하는 올바른 구조로 데이터를 전달하는 것이 좋은 관행입니다. 하지만 항목에 json 키를 추가하는 것을 잊어도 걱정하지 마세요. n8n(버전 0.166.0 이상)은 자동으로 추가합니다.
중첩된 쌍도 가질 수 있습니다. 예를 들어 기본 색상과 보조 색상을 정의하려는 경우입니다. 이 경우 키-값 쌍을 중괄호 {}로 추가로 감싸야 합니다.
이 강연에서 n8n의 데이터 구조에 대한 더 자세한 설명을 확인할 수 있습니다.
연습 문제#
Code 노드에서 name과 email 속성을 포함하는 myContacts라는 객체 배열을 만들고, email 속성은 personal과 work로 더 세분화하세요.
정답 보기
**Code 노드**의 JavaScript Code 필드에 다음 코드를 작성해야 합니다:
```javascript
var myContacts = [
{
json: {
name: 'Alice',
email: {
personal: 'alice@home.com',
work: 'alice@wonderland.org'
},
}
},
{
json: {
name: 'Bob',
email: {
personal: 'bob@mail.com',
work: 'contact@thebuilder.com'
},
}
},
];
return myContacts;
```
**Code 노드**를 실행하면 결과는 다음과 같이 보여야 합니다:
<figure><img src="/images/docs/n8n/_images/courses/level-two/chapter-one/exercise_function.png" alt="" style="width:100%"><figcaption align = "center"><i>Code 노드 결과</i></figcaption></figure>
Code 노드로 노드 데이터 참조하기#
표현식을 사용하여 다른 노드의 데이터를 참조하는 것처럼, Code 노드에서도 일부 메서드와 변수를 사용할 수 있습니다.
다음 연습으로 진행하기 전에 반드시 이 페이지들을 읽어보세요.
연습 문제#
이전 연습을 바탕으로, Code 노드를 사용하여 이름과 이메일이 있는 두 연락처의 데이터 세트를 만들었습니다. 이제 첫 번째 Code 노드에 두 번째 Code 노드를 연결하세요. 새 노드에서 첫 번째 연락처의 업무 이메일을 참조하는 workEmail이라는 새 컬럼을 생성하는 코드를 작성하세요.
정답 보기
**Code 노드**의 JavaScript Code 필드에 다음 코드를 작성해야 합니다:
```javascript
let items = $input.all();
items[0].json.workEmail = items[0].json.email['work'];
return items;
```
**Code 노드**를 실행하면 결과는 다음과 같이 보여야 합니다:
<figure><img src="/images/docs/n8n/_images/courses/level-two/chapter-one/exercise_function_reference.png" alt="" style="width:100%"><figcaption align = "center"><i>Code 노드 참조</i></figcaption></figure>
데이터 변환#
일부 노드에서 들어오는 데이터는 n8n에서 사용하는 데이터 구조와 다를 수 있습니다. 이 경우 각 항목을 개별적으로 처리할 수 있도록 데이터를 변환해야 합니다.
데이터 변환을 위한 가장 일반적인 두 가지 작업은 다음과 같습니다:
- 하나의 항목에서 여러 항목 만들기
- 여러 항목에서 단일 항목 만들기
위에서 언급한 목적을 위한 데이터 변환 방법은 여러 가지가 있습니다:
- n8n의 데이터 변환 노드를 사용합니다. 이 노드들을 사용하면 Code 노드에서 JavaScript 코드를 사용하지 않고도 목록(배열)을 포함하는 들어오는 데이터의 구조를 수정할 수 있습니다:
- Split Out 노드를 사용하여 목록을 포함하는 단일 데이터 항목을 여러 항목으로 분리합니다.
- Aggregate 노드를 사용하여 별도의 항목 또는 그 일부를 가져와 개별 항목으로 그룹화합니다.
- Code 노드를 사용하여 Run Once for All Items 모드에서 JavaScript 함수를 작성하여 들어오는 데이터의 구조를 수정합니다:
- 단일 항목에서 여러 항목을 만들려면 다음과 같은 JavaScript 코드를 사용할 수 있습니다. 이 예시에서는 항목에
[{ "data": [{<item_1>}, {<item_2>}, ...] }]형식의 배열로 설정된data라는 키가 있다고 가정합니다:
return $input.first().json.data.map(item => { return { json: item } });- 여러 항목에서 단일 항목을 만들려면 다음 JavaScript 코드를 사용할 수 있습니다:
return [ { json: { data_object: $input.all().map(item => item.json) } } ]; - 단일 항목에서 여러 항목을 만들려면 다음과 같은 JavaScript 코드를 사용할 수 있습니다. 이 예시에서는 항목에
이 JavaScript 예시들은 전체 입력을 변환하려는 경우를 가정합니다. 위의 연습 문제처럼 항목 목록에서 해당 항목을 식별하여 특정 필드에 대해 작업을 실행할 수도 있습니다. 예를 들어 workEmail 예시에서 단일 필드에 여러 이메일이 있다면 다음과 같은 코드를 실행할 수 있습니다:
let items = $input.all();
return items[0].json.workEmail.map(item => {
return {
json: item
}
});
연습 문제#
- HTTP Request 노드를 사용하여 PokéAPI
https://pokeapi.co/api/v2/pokemon에 GET 요청을 보냅니다. (이 API는 인증이 필요하지 않습니다). - Split Out 노드로
results필드의 데이터를 변환합니다. - Code 노드로
results필드의 데이터를 변환합니다.
정답 보기
1. PokéAPI에서 포켓몬을 가져오려면 다음 파라미터로 **HTTP Request 노드**를 실행하세요:
- **Authentication**: None
- **Request Method**: GET
- **URL**: https://pokeapi.co/api/v2/pokemon
2. **Split Out 노드**로 데이터를 변환하려면 이 노드를 **HTTP Request 노드**에 연결하고 다음 파라미터를 설정하세요:
- **Field To Split Out**: results
- **Include**: No Other Fields
3. **Code 노드**로 데이터를 변환하려면 이 노드를 **HTTP Request 노드**에 연결하고 JavaScript Code 필드에 다음 코드를 작성하세요:
```javascript
let items = $input.all();
return items[0].json.results.map(item => {
return {
json: item
}
});
```
