표현식으로 데이터 변환하기
표현식으로 데이터 변환하기
n8n에서 표현식을 쓸 수 있는 자리라면 어디서든 표현식 변환 함수(expression transformation function)를 사용할 수 있어요.
그런데 정말 하고 싶은 일이 '다른 작업 없이 오직 표현식으로만 데이터를 변환하는 것'이라면, 그때는 Edit Fields (Set) 노드를 쓰는 걸 권장해요. 이 노드는 데이터 변환 전용으로 설계되어서, 깔끔한 인터페이스로 이런 작업을 할 수 있거든요.
- 표현식 기반 값으로 새 필드 추가
- 변환 함수로 기존 필드 값 수정
- 필드 제거 또는 이름 변경
이렇게 하면 데이터 변환과 비즈니스 로직을 분리해서 워크플로를 정리할 수 있어요. 나중에 이해하고 유지보수하기도 훨씬 쉬워지죠.
모범 사례: 여러 노드의 각기 다른 파라미터에 복잡한 표현식을 흩어 넣기보다는, Edit Fields로 데이터를 먼저 준비한 다음 변환된 데이터를 뒤따르는 노드들에 넘겨주세요.
UI에서 표현식을 만들려면 필드를 식 모드(Expression mode)로 바꾸고, INPUT 창에서 값을 끌어다 놓거나 직접 타이핑하면 됩니다.
더 많은 정보와 예시는 Expression reference 문서를 참고하세요.
예시: 웹훅 본문에서 데이터 가져오기
이런 상황을 생각해 볼게요. 웹훅 트리거가 웹훅 본문으로 데이터를 받고 있거든요. 그 데이터의 일부를 워크플로에서 쓰려고 꺼내고 싶은 겁니다.
웹훅 데이터가 대략 이렇게 생겼다고 해 봐요.
[
{
"headers": {
"host": "n8n.instance.address",
...
},
"params": {},
"query": {},
"body": {
"name": "Jim",
"age": 30,
"city": "New York"
}
}
]
이제 다음 노드에서 city 값만 꺼내고 싶다면, 이런 표현식을 쓰면 됩니다.
{{$json.body.city}}
이 표현식이 하는 일을 풀어보면요.
- n8n의 커스텀 변수
$json로 들어오는 JSON 형식 데이터에 접근합니다. city의 값(여기서는 "New York")을 찾습니다. 참고로 이 예시는 JSON 데이터를 조회할 때 JMESPath 문법을 쓴 거예요.{{$json['body']['city']}}처럼 쓸 수도 있습니다.
크레덴셜에서 표현식 사용하기
크레덴셜(credential) 필드에서도 표현식을 쓸 수 있어요. 예를 들어 {{$json.body.city}}나 {{ $('Webhook').item.json.headers.authorization }}처럼 표현식으로 데이터를 참조하면, n8n은 그 표현식을 현재 워크플로 실행(execution)의 맥락 안에서 평가합니다.
즉 이런 의미가 돼요.
- 크레덴셜의 표현식은 현재 실행 맥락에서 사용할 수 있는 데이터(이전 노드의 데이터 포함)에 접근할 수 있습니다.
- 각 워크플로 실행은 자기만의 데이터 맥락을 갖습니다.
- 표현식은 실행 단위로 평가되기 때문에, 서로 다른 실행끼리는 데이터를 공유하지 않습니다.
예를 들어 웹훅 노드가 액세스 토큰을 받았고, 그 토큰을 표현식으로 크레덴셜 필드에 참조한다면, 그 값은 해당 워크플로 실행의 실행 데이터로부터 결정됩니다.
예시: 더 긴 JavaScript를 표현식으로 작성하기
표현식에서는 변수 할당이나 여러 문장 같은 것도 할 수 있어요. 다만 그 코드를 IIFE(즉시 실행 함수 표현식, Immediately Invoked Function Expression) 문법으로 감싸야 합니다.
아래 코드는 Luxon 날짜·시간 라이브러리를 써서 두 날짜 사이의 시간을 개월 단위로 구합니다. 코드를 표현식의 핸들바 중괄호와 IIFE 문법으로 감쌌어요.
{{(()=>{
let end = DateTime.fromISO('2017-03-13');
let start = DateTime.fromISO('2017-02-13');
let diffInMonths = end.diff(start, 'months');
return diffInMonths.toObject();
})()}}
자주 겪는 문제
여기 표현식과 관련해 자주 나타나는 오류 몇 가지와 해결·트러블슈팅 방법을 정리했어요.
'JSON Output' in item 0 contains invalid JSON
JSON 모드를 쓰면서 유효한 JSON 객체를 제공하지 않았을 때 이 오류가 나요. JSON 객체에 어떤 문제가 있느냐에 따라 The 'JSON Output' in item 0 does not contain a valid JSON object처럼 표시되기도 합니다.
해결하려면 제공한 코드가 유효한 JSON인지 확인하세요.
- JSON 검증기로 JSON을 확인해 보세요.
- JSON 객체가 정의되지 않은 입력 데이터를 참조하지 않는지 확인하세요. 들어오는 데이터가 항상 같은 필드를 갖지는 않을 때 이런 일이 생기곤 해요.
Can't get data for expression
표현식이 참조하는 데이터를 n8n이 가져오지 못할 때 나는 오류예요. 보통 앞선 노드가 아직 실행되지 않았을 때 생깁니다.
또 다른 변형으로 Referenced node is unexecuted처럼 보일 수도 있어요. 그때는 이 오류의 전체 문구가 실행되지 않는 노드가 정확히 어디인지 알려줍니다.
An expression references the node '...', but it hasn't been executed yet. Either change the expression, or re-wire your workflow to make sure that node executes first.
트러블슈팅은 이름이 명시된 노드까지 워크플로를 테스트해 보는 것부터 시작하세요.
JavaScript나 다른 커스텀 코드를 쓰는 노드에서는, 값 자체를 쓰려고 하기 전에 앞선 노드가 실행됐는지를 이런 식으로 확인할 수 있어요.
$("...").isExecuted
예를 들어 다음 JSON은 입력 데이터의 파라미터를 참조합니다. 이 단계를 다른 노드에 연결하지 않고 그대로 테스트하면 이 오류가 표시돼요.
{
"my_field_1": {{ $input.params }}
}
Invalid syntax
문법 오류가 있는 표현식을 쓸 때 나오는 오류예요.
예를 들어 아래 JSON 안의 표현식에는 마침표가 뒤에 하나 붙어 있어서 잘못된 문법 오류가 발생합니다.
{
"my_field_1": "value",
"my_field_2": {{ $('If').item.json. }}
}
이 오류를 해결하려면 표현식 문법을 확인해서 기대하는 형식을 따르고 있는지 점검하세요.