Data Engineering/n8n

[n8n] 8. Code Node (JavaScript/Python) 활용

팬돌프 2025. 12. 10. 00:29
반응형

안녕하세요! IT 지식의 길잡이, 팬돌프입니다.

지난 시간, 우리는 n8n의 독특한 데이터 구조와 아이템 인덱스 문제에 대해 깊이 파고들었습니다. 이제 데이터의 흐름이 어떻게 이어지는지 머릿속에 그려지시나요?

오늘은 n8n이 단순한 '노코드' 툴이 아니라, 개발자에게 가장 강력한 무기가 되는 이유를 증명하는 시간입니다. 바로 직접 코드를 작성하여 로직을 제어하는 Code Node입니다.

복잡한 노드 10개를 연결하는 것보다, 단 5줄의 자바스크립트 코드가 훨씬 효율적일 때가 있습니다. 외부 라이브러리를 내 마음대로 주무르고, 정규식으로 데이터를 정밀하게 조각하는 방법을 알려드리겠습니다.


[Part 8] Code Node (JavaScript/Python) 활용 : 개발자의 진짜 무기

n8n은 기본적으로 노코드(No-Code)를 지향하지만, 한계에 부딪힐 때 로우코드(Low-Code)로 전환할 수 있는 Code Node를 제공합니다. 여기서 여러분은 JavaScriptPython 중 익숙한 언어를 선택해 비즈니스 로직을 구현할 수 있습니다.

1. 내장 라이브러리 및 외부 NPM 모듈 로딩 방법

Code Node를 열어보시면 기본적으로 표준 자바스크립트 문법은 다 작동합니다. 하지만 개발을 하다 보면 lodash, moment, axios 같은 외부 라이브러리가 절실할 때가 있죠.

기본 상태에서는 보안상의 이유로 외부 모듈을 불러올(require) 수 없습니다. 이를 해결하려면 환경변수(Environment Variables) 설정이 필요합니다.

1단계: Docker Compose 환경변수 설정

우리가 Part 2에서 구축했던 docker-compose.yml 파일이나 .env 파일을 수정해야 합니다. 다음 두 가지 변수를 추가해 주세요.

  • NODE_FUNCTION_ALLOW_BUILTIN: Node.js 내장 모듈(예: fs, crypto, path) 사용 허용
  • NODE_FUNCTION_ALLOW_EXTERNAL: 외부 NPM 모듈 사용 허용
YAML
 
# docker-compose.yml의 environment 섹션 예시

environment:
  - NODE_FUNCTION_ALLOW_BUILTIN=*
  - NODE_FUNCTION_ALLOW_EXTERNAL=lodash,moment,axios
  • 주의: 보안을 위해 * (전체 허용)보다는 필요한 라이브러리 이름만 콤마(,)로 구분해서 적는 것을 권장합니다.
  • 설치: 환경변수만 적는다고 끝이 아닙니다. n8n 컨테이너 내부에 해당 모듈이 실제로 설치되어 있어야 합니다. 커스텀 Docker 이미지를 만들거나, 볼륨 마운트 방식으로 node_modules를 연결해야 합니다. (가장 쉬운 방법은 Dockerfile을 하나 만들어 RUN npm install ...을 수행하는 것입니다.)

2단계: Code Node에서 사용하기

설정이 완료되고 컨테이너를 재시작했다면, 이제 코드 내에서 자유롭게 불러올 수 있습니다.

JavaScript
 
const _ = require('lodash');
const moment = require('moment');

// 이제 lodash와 moment의 강력한 기능을 마음껏 쓸 수 있습니다!
return [
  {
    json: {
      uniqueId: _.uniqueId('user_'),
      date: moment().format('YYYY-MM-DD')
    }
  }
];

2. 실전 예제 : 복잡한 데이터 매핑 및 정규식(Regex) 처리

n8n의 기본 노드들로 문자열을 자르고 붙이는 건 꽤 번거롭습니다. 특히 "이메일 본문에서 송장 번호만 추출하고 싶다" 같은 요구사항은 **정규표현식(Regex)**을 지원하는 Code Node가 정답입니다.

시나리오: 지저분한 텍스트에서 핵심 정보 추출하기

고객 문의 메일이 들어왔는데, 본문 텍스트가 뒤죽박죽입니다. 여기서 이메일 주소와 **주문 번호(Order-숫자)**만 뽑아내 정제된 JSON으로 만들고 싶습니다.

입력 데이터 (Input):

JSON
 
[
  {
    "json": {
      "body": "안녕하세요. 제 주문번호는 Order-12345입니다. 연락은 pandolph@n8n.io 로 주세요."
    }
  }
]

Code Node (JavaScript) 작성:

JavaScript
 
// 모든 입력 아이템을 순회하며 처리
const results = $input.all().map(item => {
  const text = item.json.body;

  // 1. 정규식으로 데이터 추출
  const emailMatch = text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/);
  const orderMatch = text.match(/Order-(\d+)/);

  // 2. 새로운 JSON 객체 생성
  return {
    json: {
      originalText: text,
      extractedEmail: emailMatch ? emailMatch[0] : null,
      orderNumber: orderMatch ? orderMatch[1] : 'UNKNOWN',
      processedAt: new Date().toISOString()
    }
  };
});

return results;

이 코드를 실행하면, 다음 노드부터는 extractedEmail과 orderNumber라는 깔끔한 변수를 사용할 수 있게 됩니다. 복잡한 가공은 Code Node에서, 단순한 연결은 UI 노드에서 처리하는 것이 n8n 고수의 작업 방식입니다.


🚀 다음 편 예고

개발자의 강력한 무기인 Code Node까지 장착하셨군요! 이제 못 만들 자동화 로직은 거의 없습니다.

하지만 매번 코드를 짤 수는 없겠죠? n8n UI 상에서 {{ $json.id }} 처럼 변수를 끌어다 쓰는 것을 **표현식(Expression)**이라고 합니다. 이 표현식을 얼마나 자유자재로 다루느냐가 작업 속도를 결정합니다.

다음 Part 9. 고급 표현식 (Expressions) 활용 편에서는 n8n의 내부 변수들을 심층 해부합니다.

  • $node, $json, $binary, $env 등 숨겨진 전역 객체의 비밀
  • 변수가 제대로 안 잡힐 때 해결하는 동적 데이터 바인딩 팁과 트릭

마우스 드래그만으로는 알 수 없었던 표현식의 숨겨진 기능들, 다음 포스팅에서 낱낱이 공개하겠습니다!

반응형