N8N 자동화가 막히는 순간 — 초보자가 빠지는 3가지 함정과 극복법
n8n으로 구글 시트 데이터를 슬랙에 보내는 워크플로우를 만들었는데, 노드는 초록불인데 메시지가 안 날아갔습니다. 에러 메시지도 없이 조용히 멈춰 있어서 어디가 문제인지 찾는 데만 2시간이 걸렸죠. 이 글을 읽고 나면 워크플로우가 막혔을 때 어디서 데이터가 끊겼는지 직접 추적하고, 노드 설정 몇 군데만 손봐서 다시 흐르게 만들 수 있습니다. 초보자가 반복해서 빠지는 함정 3가지와 각각의 진단법을 실제 입력-출력 예시로 보여드릴게요.
준비물
n8n 최신 버전이 설치돼 있어야 합니다. 제가 테스트한 환경은 n8n 버전 1.38.2였고, 로컬 Docker 컨테이너로 띄웠습니다. 간단한 워크플로우 하나를 직접 만들면서 따라오시면 됩니다. HTTP Request 노드와 Set 노드, Code 노드 정도만 쓸 거라 외부 서비스 연동은 필요 없어요. 브라우저만 있으면 충분합니다.
n8n 대시보드에서 새 워크플로우를 열어두세요. 실습할 때마다 Execute Workflow 버튼을 눌러 결과를 바로 확인할 겁니다.
함정 1: 데이터 구조가 맞지 않아 다음 노드가 빈손으로 돈다
첫 번째 함정은 워크플로우에서 앞 노드에서 넘어온 데이터가 배열인지 객체인지 모르고 다음 노드가 기대하는 형태와 안 맞는 경우입니다. HTTP Request 노드로 API를 호출했더니 응답이 배열로 왔는데, 다음 Set 노드에서 필드를 꺼내려니 undefined만 나왔어요. 실행은 성공인데 결과가 비어 있으면 십중팔구 이 문제입니다.
진단하는 법은 간단합니다. 문제가 생긴 n8n 노드 바로 앞 노드를 클릭하고 출력 탭을 열어보세요. JSON 탭으로 전환하면 실제 데이터 구조가 보입니다. 제가 겪은 케이스를 보면, n8n HTTP Request가 반환한 데이터가 이런 모양이었습니다.
[
{ "id": 1, "name": "Alice" },
{ "id": 2, "name": "Bob" }
]
그런데 Set 노드에서 {{ $json.name }}으로 꺼내려고 했더니 아무것도 안 나왔어요. 배열이라 인덱스를 지정해야 하는데 바로 필드에 접근하려 해서 워크플로우가 빈 값을 반환한 거죠. 해결은 Set 노드 설정에서 Execute Once 옵션을 끄고 각 배열 항목마다 돌게 만드는 겁니다.
제가 실제로 쓴 n8n Code 노드 스니펫은 이렇습니다.
return items.map(item => ({
json: {
userId: item.json.id,
userName: item.json.name
}
}));
이렇게 바꾸니 다음 Set 노드에서 {{ $json.userName }}이 정상적으로 Alice, Bob을 꺼내왔습니다. 데이터 구조를 눈으로 확인하고 워크플로우 노드 설정을 맞추는 것만으로 3시간 삽질을 10분으로 줄였어요.
함정 2: 에러가 나도 워크플로우가 조용히 넘어간다는 걸 몰랐다
두 번째 함정은 에러가 났는데도 워크플로우가 조용히 넘어가는 경우입니다. HTTP Request로 외부 API를 호출했는데 응답이 안 왔는데도, 다음 노드가 실행되더라고요. 실행 로그에는 초록불이 켜졌지만 실제로는 데이터가 비어있어서 뒤쪽 노드가 빈 값을 처리하다 멈췄습니다.
제가 겪은 케이스를 보면, n8n HTTP Request 노드에서 외부 API 호출이 실패했는데도 Set 노드까지 진행됐어요. 노드 자체는 "성공"으로 표시되지만 응답 데이터가 없어서 다음 단계에서 빈 필드를 참조하다 조용히 실패한 겁니다.
이런 일을 막으려면 워크플로우 각 노드에 타임아웃과 재시도 옵션을 명확히 설정하고, 실패했을 때 경로를 따로 만들어야 합니다. 제가 실제로 쓴 설정은 이렇습니다.
- Timeout: 10초
- Retry On Fail: 켜기
- Max Tries: 3
- Wait Between Tries: 2초
이렇게 바꾸고 나니 API 호출이 실패하면 3번까지 재시도하고, 그래도 안 되면 Error Output으로 빠져서 슬랙에 알림이 왔습니다. 에러를 숨기지 않고 명확히 드러내는 게 n8n 자동화를 안정적으로 돌리는 핵심이에요.
함정 3: 표현식 문법 실수로 빈 값이 계속 넘어간다
세 번째 함정은 n8n 표현식 문법을 잘못 써서 데이터를 꺼내지 못하는 경우입니다. 중괄호 두 개로 감싸는 {{ }} 문법은 익숙해지기 전까지 실수하기 쉬워요. 제가 가장 많이 실수한 건 $json.field와 $node["Node Name"].json.field를 헷갈린 겁니다.
n8n Set 노드에서 이전 HTTP Request 노드의 결과를 참조하려고 {{ $json.data.userId }}라고 썼는데 계속 undefined가 나왔습니다. 알고 보니 HTTP Request 노드 이름이 "Fetch User"였는데, 중간에 다른 노드가 하나 더 있어서 $json이 마지막 노드 출력을 가리키고 있었던 거죠. 명시적으로 노드 이름을 지정해야 합니다.
올바른 n8n 표현식은 이렇습니다.
{{ $node["Fetch User"].json.data.userId }}
n8n 노드 이름에 공백이 있으면 대괄호와 따옴표로 감싸야 합니다. 점 표기법 $node.Fetch User는 안 돼요. 제가 실제로 테스트한 케이스를 보면, Fetch User 노드가 이런 데이터를 반환했을 때:
{
"data": {
"userId": 12345,
"email": "test@example.com"
}
}
n8n Set 노드에서 {{ $node["Fetch User"].json.data.email }}이라고 써야 test@example.com이 정확히 꺼내집니다. 워크플로우 표현식을 테스트할 땐 Set 노드를 임시로 하나 만들어서 값이 제대로 나오는지 먼저 확인하세요.
자주 묻는 질문
Q. n8n에서 노드 이름을 영문으로 짓는 게 꼭 필요한가요?
A. 필수는 아니지만 워크플로우 표현식 작성이 훨씬 편해집니다. 한글이나 특수문자가 들어가면 대괄호 표기법을 써야 해서 실수 확률이 높아요. 노드가 많아질수록 영문 단일 단어로 통일하는 게 유지보수에 유리합니다.
Q. 워크플로우 디버깅할 때 가장 먼저 확인해야 할 건 뭔가요?
A. 각 워크플로우 노드의 출력 패널입니다. 실행 후 노드를 클릭해 JSON 탭을 열면 실제 데이터 구조가 보입니다. 예상과 다른 형태(배열 vs 객체)인지, 필드 이름이 정확한지 먼저 확인하세요. 데이터 흐름을 눈으로 추적하는 게 가장 빠른 해결법입니다.
Q. n8n을 Docker로 띄우면 워크플로우가 재시작 때 사라지나요?
A. 볼륨 마운트를 안 하면 그렇습니다. docker run에 -v ~/.n8n:/home/node/.n8n 옵션을 주면 워크플로우 설정과 이력이 호스트에 저장돼 컨테이너를 다시 띄워도 유지됩니다.
다음 단계
이 세 가지 함정을 피하는 법을 익혔다면, 이제 실제 프로젝트에 n8n 자동화를 적용해보세요. 구글 시트와 슬랙을 연결하는 간단한 워크플로우부터 시작하면 됩니다. 각 노드의 출력을 직접 확인하고, 타임아웃과 재시도 옵션을 미리 설정해두고, 표현식은 Set 노드로 먼저 테스트하는 습관만 들이면 대부분의 삽질을 피할 수 있습니다. 워크플로우가 복잡해질수록 노드 이름을 명확히 짓고, 중간중간 디버그용 Set 노드를 남겨두는 게 나중에 시간을 아끼는 지름길입니다.