콘텐츠로 이동
📣 인포그랩에서 OpenAI 기술 기반으로 자체 개발한 자동화 번역 프로그램을 통해 n8n 공식 문서의 한글판을 국내 최초로 제공합니다.

데이터 구조 이해하기#

이 장에서는 n8n의 데이터 구조와 Code node를 사용하여 데이터를 변환하고 노드 출력을 시뮬레이션하는 방법에 대해 배웁니다.

n8n의 데이터 구조#

기본적으로 n8n의 노드는 추출, 변환, 적재(ETL) 도구로 기능합니다. 노드를 사용하면 여러 이질적인 소스에서 데이터를 액세스(추출)하고, 특정 방식으로 데이터를 수정(변환)한 후, 필요한 곳으로 데이터를 전달(적재)할 수 있습니다.

워크플로우에서 노드와 노드 사이로 이동하는 데이터는 각 노드가 인식하고 해석할 수 있는 형식(구조)이어야 합니다. n8n에서 이 요구되는 구조는 객체 배열입니다.

객체 배열에 대한 설명

배열은 값의 목록입니다. 배열은 비어 있을 수도 있고 여러 요소를 포함할 수도 있습니다. 각 요소는 목록의 특정 위치(인덱스)에 저장되며, 0부터 시작하여 인덱스 번호로 참조할 수 있습니다. 예를 들어, 배열 ["Leonardo", "Michelangelo", "Donatello", "Raphael"];에서 요소 Donatello는 인덱스 2에 저장됩니다.

객체는 배열처럼 번호가 매겨진 인덱스에 값을 저장하는 대신 키-값 쌍을 저장합니다. 쌍의 순서는 중요하지 않으며, 값은 키 이름을 참조하여 접근할 수 있습니다. 예를 들어, 아래 객체는 두 개의 속성(namecolor)을 포함합니다:

1
2
3
4
{
	name: 'Michelangelo',
	color: 'blue',
}

객체 배열은 하나 이상의 객체를 포함하는 배열입니다. 예를 들어, 아래 배열 turtles는 네 개의 객체를 포함합니다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
var turtles = [
	{
		name: 'Michelangelo',
		color: 'orange',
	},
	{
		name: 'Donatello',
		color: 'purple',
	},
	{
		name: 'Raphael',
		color: 'red',
	},
	{
		name: 'Leonardo',
		color: 'blue',
	}
];

객체의 속성은 object.property 구문을 사용하여 점 표기법으로 접근할 수 있습니다. 예를 들어, turtles[1].color는 두 번째 거북이의 색상을 가져옵니다.

한 노드에서 다른 노드로 전송되는 데이터는 JSON 객체 배열로 전송됩니다. 이 컬렉션의 요소는 아이템이라고 불립니다.

아이템

n8n 노드는 들어오는 데이터의 각 아이템에서 작업을 수행합니다.

고객 데이터 저장소 노드의 아이템

Code node를 사용하여 데이터 세트 만들기#

n8n 데이터 구조에 익숙해졌으므로 이를 사용하여 자체 데이터 세트를 만들거나 노드 출력을 시뮬레이션할 수 있습니다. 이를 위해 Code node를 사용하여 다음 구조를 가진 객체 배열을 정의하는 JavaScript 코드를 작성하십시오:

1
2
3
4
5
6
7
return [
	{
		json: {
			apple: 'beets',
		}
	}
];

예를 들어, 닌자 거북이를 나타내는 객체 배열은 Code node에서 다음과 같이 보일 것입니다:

Code node의 객체 배열

JSON 객체

이 객체 배열에는 추가 키 json이 포함되어 있습니다. n8n은 각 객체를 배열 안의 또 다른 객체로 감싸서 키 json을 사용해야 합니다.

n8n의 데이터 구조 설명

n8n에서 사용하는 올바른 구조로 데이터를 전달하는 것이 좋습니다. 그러나 아이템에 json 키를 추가하는 것을 잊어버려도 걱정하지 마세요. n8n(버전 0.166.0 이상)은 이를 자동으로 추가합니다.

중첩된 쌍을 가질 수도 있습니다. 예를 들어, 기본 색상과 보조 색상을 정의하고 싶다면, 이 경우 키-값 쌍을 중괄호 {}로 추가로 감싸야 합니다.

n8n 데이터 구조 비디오

이 강연은 n8n의 데이터 구조에 대한 보다 자세한 설명을 제공합니다.

연습#

Code node에서 myContacts라는 객체 배열을 생성합니다. 이 배열은 nameemail 속성을 포함하며, email 속성은 personalwork로 나뉩니다.

해결책 보여줘

Code node에서 JavaScript Code 필드에 다음 코드를 작성해야 합니다:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 node를 실행하면 결과는 다음과 같아야 합니다:

Code node의 결과

Code node로 노드 데이터 참조하기#

다른 노드의 데이터를 참조하기 위해 expressions를 사용할 수 있듯이, Code node에서도 일부 methods and variables를 사용할 수 있습니다.

계속하기 전에 이러한 페이지를 반드시 읽어보세요.

연습#

이전 연습에서 Code node를 사용하여 두 개의 연락처 이름과 이메일을 포함하는 데이터 세트를 생성했습니다. 이제 두 번째 Code node를 첫 번째 노드에 연결합니다. 새 노드에서 첫 번째 연락처의 작업 이메일을 참조하는 workEmail이라는 새로운 열을 만드는 코드를 작성합니다.

해결책 보여줘

Code node의 JavaScript Code 필드에 다음 코드를 작성해야 합니다:

1
2
3
let items = $input.all();
items[0].json.workEmail = items[0].json.email['work'];
return items;

Code node를 실행하면 결과는 다음과 같아야 합니다:

Code node 참조

데이터 변환#

일부 노드에서 들어오는 데이터는 n8n에서 사용하는 데이터 구조와 다를 수 있습니다. 이 경우 각 항목이 개별적으로 처리되도록 데이터를 변환해야 합니다.

데이터 변환을 위한 가장 일반적인 두 가지 작업은 다음과 같습니다:

  • 하나의 항목에서 여러 항목 생성
  • 여러 항목에서 단일 항목 생성

위의 목적을 위해 데이터를 변환하는 방법에는 여러 가지가 있습니다:

  • n8n의 데이터 변환 노드를 사용합니다. 이러한 노드를 사용하여 Code node에서 JavaScript 코드를 사용하지 않고도 목록(배열)을 포함하는 들어오는 데이터의 구조를 수정할 수 있습니다:
    • Split Out node를 사용하여 목록을 포함하는 단일 데이터 항목을 여러 항목으로 분리합니다.
    • Aggregate node를 사용하여 개별 항목이나 그 일부를 서로 그룹화하여 개별 항목으로 만듭니다.
  • Code node를 사용하여 JavaScript 함수를 작성하여 Run Once for All Items 모드에서 들어오는 데이터의 구조를 수정할 수 있습니다:
    • 단일 항목에서 여러 항목을 생성하려면 다음과 같은 JavaScript 코드를 사용할 수 있습니다. 이 예시에서는 항목에 data라는 키가 배열 형태의 항목으로 설정되어 있다고 가정합니다: [{ "data": [{<item_1>}, {<item_2>}, ...] }]:
      1
      2
      3
      4
      5
      return $input.first().json.data.map(item => {
          return {
              json: item
          }
      });
      
    • 여러 항목에서 단일 항목을 생성하려면 다음 JavaScript 코드를 사용할 수 있습니다:
      1
      2
      3
      4
      5
      6
      7
      return [
      	{
          	json: {
          		data_object: $input.all().map(item => item.json)
          	}
          }
        ];
      

이 JavaScript 예시는 입력 전체가 변환하려는 내용이라고 가정합니다. 위의 연습에서처럼 특정 필드에 대해 작업을 실행할 수도 있습니다. 예를 들어, workEmail 예제가 단일 필드에 여러 개의 이메일이 있는 경우, 다음과 같은 코드를 실행할 수 있습니다:

1
2
3
4
5
6
let items = $input.all();
return items[0].json.workEmail.map(item => {
	return {
		json: item
	}
});

연습#

  1. HTTP Request node를 사용하여 Quotable API에 GET 요청을 만듭니다 https://api.quotable.io/quotes. (이 API는 인증이 필요하지 않습니다).
  2. Split Out node를 사용하여 results 필드의 데이터를 변환합니다.
  3. Code node를 사용하여 results 필드의 데이터를 변환합니다.
해결책을 보여주세요
  1. Quotable API에서 인용구를 가져오기 위해 다음 매개변수로 HTTP Request node를 실행합니다:
    • 인증: 없음
    • 요청 방법: GET
    • URL: https://api.quotable.io/quotes
  2. Split Out node로 데이터를 변환하기 위해 이 노드를 HTTP Request node에 연결하고 다음 매개변수를 설정합니다:
    • 분리할 필드: results
    • 포함: 기타 필드 없음
  3. Code node로 데이터를 변환하기 위해 이 노드를 HTTP Request node에 연결하고 JavaScript 코드 필드에 다음 코드를 작성합니다:
    1
    2
    3
    4
    5
    6
    let items = $input.all();
    return items[0].json.results.map(item => {
    	return {
    		json: item
    	}
    });
    
인포레터에서 최신 DevOps 트렌드를 격주로 만나보세요!