n8n은 정말 강력한 자동화 도구입니다! ✨ 복잡한 워크플로우를 코딩 없이 시각적으로 구축할 수 있게 해주죠. 하지만 아무리 잘 만들어진 워크플로우라도 예기치 않은 오류는 언제든 발생할 수 있습니다. 😫 API 호출 실패, 데이터 형식 불일치, 네트워크 불안정 등 다양한 문제로 인해 소중한 자동화가 멈춰버리는 경험, 한 번쯤은 있으실 거예요.
이 가이드는 n8n 워크플로우의 디버깅 및 에러 처리 능력을 한 단계 끌어올려, 여러분의 자동화가 멈춤 없이 원활하게 실행될 수 있도록 돕는 마스터 가이드입니다. 이제 에러 발생에 대한 두려움은 내려놓고, 안정적인 자동화의 세계로 함께 들어가 볼까요? 🚀
🔍 Part 1: 디버깅의 첫걸음 – 문제 파악과 시각화
디버깅은 마치 탐정처럼 문제를 추적하고 해결하는 과정입니다. n8n은 여러분이 이 과정을 쉽게 할 수 있도록 다양한 도구를 제공합니다.
1.1 실행 로그 (Execution Logs) 분석하기 📜
워크플로우가 실행될 때마다 n8n은 상세한 실행 로그를 기록합니다. 이 로그는 문제의 원인을 파악하는 데 가장 중요한 정보원입니다.
-
어디서 확인하나요?
- 워크플로우 편집 화면 상단의 ‘Executions’ 탭 클릭.
- ‘Active’ 또는 ‘All’ 탭에서 실패한 실행을 선택.
- 각 노드의 실행 상태와 오류 메시지를 확인할 수 있습니다.
-
무엇을 봐야 할까요?
- 빨간색 노드: 오류가 발생한 노드를 즉시 알려줍니다.
- 오류 메시지: 노드를 클릭하면 ‘Error’ 탭에서 상세한 오류 메시지를 볼 수 있습니다.
401 Unauthorized
(인증 오류),Network Error
(네트워크 오류),Invalid JSON
(잘못된 JSON 형식) 등 구체적인 힌트를 제공합니다. - 입력/출력 데이터: 노드에 들어오고 나가는 데이터를 확인하여, 데이터 형식이나 값이 예상과 다른지 파악할 수 있습니다.
💡 팁: 에러 메시지가 길거나 복잡할 때는 구글에 해당 메시지를 그대로 검색해보세요. 비슷한 문제를 겪은 다른 사람들의 해결책을 찾을 수 있습니다! 🌐
1.2 노드 출력 (Node Output) 면밀히 검토하기 🕵️♀️
각 노드는 데이터를 처리하고 다음 노드로 전달합니다. 노드의 출력을 이해하는 것은 데이터 흐름의 문제를 파악하는 데 필수적입니다.
-
Test Workflow (워크플로우 테스트):
- 워크플로우를 활성화하기 전에 ‘Test Workflow’ 버튼을 클릭하여 수동으로 실행해보세요. 🧪
- 각 노드가 성공적으로 실행될 때마다 초록색으로 변하고, 실패하면 빨간색으로 변합니다.
- 노드를 클릭하면 ‘Output’ 탭에서 해당 노드가 출력하는 JSON 데이터를 실시간으로 확인할 수 있습니다.
- 예시: HTTP Request 노드의 출력에서 응답 코드(status code)가 200이 아닌 400대나 500대라면 API 호출에 문제가 있음을 알 수 있습니다.
-
Set 노드 활용:
- 데이터의 중간 상태를 확인하고 싶을 때
Set
노드를 활용하여 특정 변수의 값을 확인하거나, 데이터 구조를 재구성해보세요. - 예시:
Set
노드에서$json
을 확인하면 현재 노드까지의 모든 데이터 흐름을 볼 수 있습니다.
- 데이터의 중간 상태를 확인하고 싶을 때
1.3 코드 노드 (Code Node)로 심층 디버깅 🧑💻
복잡한 데이터 처리나 특정 로직을 검증해야 할 때는 Code
노드를 활용할 수 있습니다. console.log()
함수는 자바스크립트의 강력한 디버깅 도구입니다.
- 사용법:
console.log("🐛 디버깅 중: ", $json); // 현재 노드의 모든 데이터 출력 console.log("🐛 특정 값 확인: ", $json.item.value); // 특정 경로의 값 출력 return items; // 항상 items를 반환해야 합니다.
Test Workflow
실행 시,Code
노드의 ‘Output’ 탭에서console.log
의 메시지를 확인할 수 있습니다. 이는 마치 코드에 브레이크포인트를 걸고 변수 값을 확인하는 것과 유사합니다.
1.4 디버깅 팁 요약 ✨
- 작게 시작하기: 전체 워크플로우를 한 번에 테스트하기보다는, 문제가 의심되는 구간만 분리하여 테스트하거나, 데이터를 최소화하여 테스트합니다.
- 증분적으로 테스트: 워크플로우를 한 노드씩 추가하며 테스트하는 습관을 들이세요. 새로운 노드를 추가할 때마다 테스트하여 문제가 발생하면 바로 해당 노드임을 알 수 있습니다.
- 외부 서비스 확인: API를 호출하는 워크플로우라면, 해당 API 서비스의 상태 페이지(status page)를 확인하여 서비스 자체에 문제가 있는지 점검합니다.
- 재현하기: 에러를 재현할 수 있는 최소한의 조건과 데이터를 찾아내세요. 재현이 가능하다면 해결책도 찾기 쉽습니다.
🛡️ Part 2: 에러 처리의 핵심 – 멈춤 없는 자동화를 위한 전략
디버깅이 문제 발생 후 해결하는 것이라면, 에러 처리는 문제 발생 시 워크플로우가 멈추지 않고 적절하게 대응하도록 미리 설계하는 것입니다. n8n은 이를 위한 강력한 기능을 제공합니다.
2.1 에러 워크플로우 (Error Workflow) – 글로벌 안전망 🌐
n8n의 ‘Error Workflow’는 모든 활성화된 워크플로우에서 발생하는 처리되지 않은 오류를 catch(포착)할 수 있는 특별한 워크플로우입니다. 마치 모든 자동화의 안전망 역할을 합니다.
-
설정 방법:
- n8n 대시보드에서 새로운 워크플로우를 생성합니다.
- 첫 노드를 ‘Error Trigger’ 노드로 설정합니다.
- 이 워크플로우 안에 에러 발생 시 취할 행동(알림 보내기, 로깅, 재시도 등)을 구성합니다.
-
활용 예시:
- 알림: 슬랙, 이메일, 텔레그램 등으로 에러 발생 알림을 보냅니다. (어떤 워크플로우에서, 어떤 에러가 발생했는지 상세 정보를 포함) 🔔
- 로깅: 에러 발생 정보를 데이터베이스나 스프레드시트에 기록합니다. 📝
- 대시보드 업데이트: Grafana 같은 모니터링 대시보드에 에러 카운트를 업데이트합니다.
-
장점: 워크플로우마다 개별적으로 에러 처리를 할 필요 없이, 중앙에서 모든 에러를 관리할 수 있습니다.
2.2 Try/Catch 노드 – 특정 구간 보호막 🚧
Try/Catch
노드는 워크플로우의 특정 섹션에서 발생할 수 있는 오류를 로컬로 처리할 때 사용합니다. 마치 코드의 try...catch
블록과 동일한 개념입니다.
- 구성 요소:
- Try: 오류가 발생할 수 있는 노드들을 ‘Try’ 섹션 안에 넣습니다.
- Catch: ‘Try’ 섹션에서 오류가 발생하면, ‘Catch’ 섹션의 노드들이 실행됩니다. 오류가 발생하지 않으면 ‘Catch’는 건너뛰고 다음 노드로 넘어갑니다.
-
활용 예시:
- API 호출 실패 시 폴백: Try 블록에서 API 호출을 시도하고, 실패하면 Catch 블록에서 기본값(fallback value)을 사용하거나 다른 API를 호출하도록 합니다.
- 데이터 유효성 검사 실패 시: Try 블록에서 데이터를 파싱하고, Catch 블록에서 유효하지 않은 데이터에 대한 알림을 보내거나 특정 값으로 대체합니다.
┌─────────────┐ ┌─────────────────┐ ┌─────────────┐ │ Start Node │──────▶│ Try Node │──────▶│ (Success) │ └─────────────┘ │ ┌───────────┐ │ │ Next Node │ │ │ Risky Node│ │ └─────────────┘ │ └───────────┘ │ └─────────────────┘ │ (Error) ▼ ┌─────────────────┐ │ Catch Node │ │ ┌───────────┐ │ │ │ Error Hdl │ │ │ └───────────┘ │ └─────────────────┘ │ ▼ ┌─────────────┐ │ (Failure) │ │ Next Node │ └─────────────┘
2.3 재시도 메커니즘 (Retry Mechanisms) – 끈기의 미학 💪
일시적인 네트워크 문제, API 서버의 짧은 장애 등으로 인해 발생하는 오류는 잠시 후 다시 시도하면 해결되는 경우가 많습니다. n8n은 대부분의 HTTP 요청 관련 노드에서 자체적인 재시도 설정을 제공합니다.
- 노드별 재시도 설정:
HTTP Request
노드,Google Sheets
노드 등 외부 서비스와 통신하는 노드에는 ‘Retry on Error’ 옵션이 있습니다.- Max Retries: 몇 번까지 재시도할 것인지 설정합니다.
- Retry Delay: 재시도 간격(초)을 설정합니다.
- Backoff Strategy: 선형(linear) 또는 지수(exponential) 백오프를 사용하여 재시도 간격을 점차 늘릴 수 있습니다. 지수 백오프는 서버에 과부하를 주지 않으면서도 안정적인 재시도에 유리합니다.
- 커스텀 재시도 로직:
- 더 복잡한 재시도 로직(특정 오류 코드에만 재시도, 특정 시간대 재시도 금지 등)이 필요하다면
IF
노드와Wait
노드를 조합하여 수동으로 재시도 루프를 만들 수 있습니다.
- 더 복잡한 재시도 로직(특정 오류 코드에만 재시도, 특정 시간대 재시도 금지 등)이 필요하다면
2.4 폴백 로직 (Fallback Logic) – 플랜 B ✌️
예상치 못한 데이터 문제나 서비스 실패 시, 워크플로우가 완전히 중단되지 않고 대안적인 경로를 통해 계속 진행되도록 하는 것이 폴백 로직입니다.
IF
노드 활용:- “이 조건이 참이면 A 경로로, 아니면 B 경로로” 와 같이 워크플로우의 흐름을 분기합니다.
- 예시: “API 응답에 특정 필드가 없으면 기본값으로 대체”
Set
노드 활용:- 데이터가 비어있거나 유효하지 않을 때,
Set
노드를 사용하여 기본값을 설정하거나 오류를 나타내는 값을 삽입합니다. - 예시:
$json.api_data || '데이터 없음'
(API 데이터가 없으면 ‘데이터 없음’으로 설정)
- 데이터가 비어있거나 유효하지 않을 때,
2.5 알림 시스템 구축 (Notification System) – 비상벨 🔔
오류 발생 시 개발자나 관리자에게 즉시 알리는 것은 매우 중요합니다. 문제를 조기에 인지하고 대응할 수 있게 합니다.
- 주요 알림 노드:
Email
노드: 상세한 오류 정보를 이메일로 발송합니다.Slack
노드: 특정 Slack 채널에 오류 메시지를 보냅니다.Telegram
노드: Telegram 봇을 통해 개인 또는 그룹 채팅으로 알림을 보냅니다.Discord
노드,Microsoft Teams
노드 등
- 알림 내용:
- 어떤 워크플로우에서 오류가 발생했는지 (워크플로우 이름)
- 어떤 노드에서 오류가 발생했는지 (노드 이름)
- 상세 오류 메시지 (Error Workflow의
json.error.message
,json.error.stack
활용) - 오류 발생 시각
- 관련 데이터 (필요시)
2.6 에러 로깅 (Error Logging) – 미래를 위한 기록 📝
알림과 함께 에러 발생 이력을 체계적으로 기록하는 것은 장기적인 관점에서 자동화의 안정성을 높이는 데 기여합니다.
- 로깅 대상:
- 스프레드시트 (Google Sheets, Airtable)
- 데이터베이스 (PostgreSQL, MySQL, MongoDB)
- 로그 관리 서비스 (Datadog, Splunk, ELK Stack 등)
- 활용:
- 에러 발생 패턴 분석: 특정 시간대에 에러가 자주 발생하는지, 특정 API에서 문제가 반복되는지 등을 파악하여 근본적인 해결책을 마련합니다.
- 성능 모니터링: 에러 발생률을 추적하여 워크플로우의 전반적인 건강 상태를 모니터링합니다.
💡 Part 3: 실전 예시로 배우는 디버깅 & 에러 처리
실제 시나리오를 통해 앞에서 배운 내용들을 적용해 봅시다.
3.1 예시 1: API 호출 실패 (401 Unauthorized) 😱
문제: 외부 API를 호출하는 워크플로우가 401 Unauthorized
에러를 뱉으며 멈춥니다.
디버깅:
- 실행 로그 확인: ‘Executions’ 탭에서 실패한 실행을 클릭합니다.
HTTP Request
노드 클릭: 빨간색으로 표시된HTTP Request
노드를 클릭하고 ‘Error’ 탭을 확인합니다.- 오류 메시지 분석:
Response status was 401. Body: {"message": "Invalid API Key"}
와 같은 메시지를 발견합니다.- 진단: API 키가 잘못되었거나 만료되었을 가능성이 높습니다.
- 자격 증명 확인: n8n의 ‘Credentials’ 섹션으로 이동하여 해당 API의 자격 증명을 다시 확인하고, 필요하면 API 제공자의 대시보드에서 API 키를 재생성하거나 유효성을 검사합니다.
에러 처리 (Try/Catch + 알림):
- Try/Catch 노드 추가:
HTTP Request
노드를Try
블록 안에 넣습니다. -
Catch 블록 구성:
Set
노드를 추가하여 에러 정보를 추출합니다:{{$json.error.message}}
Email
또는Slack
노드를 추가하여 관리자에게 “API 호출 실패: 401 Unauthorized” 메시지와 함께 에러 상세 정보를 보냅니다.Respond to Webhook
노드를 통해 에러가 발생했음을 호출자에게 알릴 수도 있습니다.
[Start] │ ▼ [Try] │ ▼ [HTTP Request: Call API] <- 401 Error here! │ ▼ (Success path) [Process Data] │ ▼ [End] (Error path from HTTP Request) ▼ [Catch] │ ▼ [Set: Get Error Info] │ ▼ [Email/Slack: Send Alert] │ ▼ [End (Graceful failure)]
3.2 예시 2: 데이터 형식 불일치 🔄
문제: 이전 노드에서 문자열 형태로 받은 데이터를 Code
노드에서 JSON으로 파싱하려는데 실패합니다. SyntaxError: Unexpected token o in JSON at position 1
에러가 발생합니다.
디버깅:
Code
노드 에러: 'Executions'에서Code
노드가 빨간색인 것을 확인합니다.- 이전 노드 출력 확인:
Code
노드 바로 이전 노드의 'Output' 탭을 확인합니다. - 데이터 형식 분석: JSON 문자열로 예상했던 데이터가 실제로는
[Object]
나 다른 형태로 출력되는 것을 발견합니다.- 진단: JSON.parse()는 문자열만 파싱할 수 있는데, 이미 파싱된 JSON 객체나 다른 형태의 데이터가 넘어왔거나, 유효하지 않은 JSON 문자열이 넘어왔을 가능성이 높습니다.
- 해결:
- 데이터가 이미 JSON 객체라면
JSON.parse()
를 호출할 필요 없이 바로 사용합니다. - 데이터가 유효하지 않은 문자열이라면 이전 노드에서 데이터 처리 방식을 변경하거나,
Try/Catch
로 파싱 오류를 처리합니다.
- 데이터가 이미 JSON 객체라면
에러 처리 (Try/Catch + 폴백):
- Try/Catch 노드 추가:
Code
노드를Try
블록 안에 넣습니다. - Catch 블록 구성:
Set
노드를 사용하여 파싱 실패 시 기본값(예:{ "status": "parse_error", "data": null }
)을 설정합니다.Email/Slack
노드로 데이터 파싱 오류 알림을 보냅니다.- 이후 노드들은 이 기본값을 사용하여 워크플로우를 계속 진행할 수 있도록 합니다.
3.3 예시 3: 간헐적 네트워크 오류 📶
문제: Google Sheets
에 데이터를 추가하는 워크플로우가 가끔씩 Network Error
또는 Timeout
에러로 멈춥니다.
디버깅:
- 실행 로그 확인: 에러 메시지가
Network Error
나Timeout
인 경우, 이는 일시적인 네트워크 문제일 가능성이 큽니다. - 반복성 확인: 이런 에러가 특정 시간에 자주 발생하는지, 아니면 무작위로 발생하는지 확인합니다.
에러 처리 (재시도 메커니즘):
Google Sheets
노드 설정:- 노드를 클릭하고 'Parameters' 탭에서 'Retry on Error' 옵션을 찾습니다.
- 'Max Retries'를 3-5회 정도로 설정합니다.
- 'Retry Delay'를 5-10초 정도로 설정하고, 'Backoff Strategy'를 'Exponential'로 설정합니다.
- 설명: 이렇게 설정하면 첫 시도 실패 시 5초 후 재시도, 실패 시 10초 후 재시도 (Exponential Backoff라면 더 길게) 하는 식으로 총 3-5번을 시도하여 일시적인 네트워크 문제를 극복할 수 있습니다.
- 최종 실패 시 알림: 재시도 후에도 실패할 경우를 대비하여,
Google Sheets
노드 다음에Try/Catch
를 한 번 더 사용하여 최종 실패 시 알림을 보내도록 구성합니다.
🚀 Part 4: 고급 팁 & 모범 사례
더욱 견고하고 유지보수가 쉬운 자동화를 위한 몇 가지 고급 팁입니다.
- 버전 관리 (Version Control): n8n은 워크플로우 버전을 자동으로 저장하지만, 중요한 워크플로우는 주기적으로 JSON으로 익스포트하여 Git 같은 외부 버전 관리 시스템에 저장하는 것을 고려해보세요. 팀 협업이나 복구에 유용합니다.
- 구조화된 에러 데이터: 에러 워크플로우나 Catch 블록에서 에러 정보를 추출할 때, 그냥 메시지만 보내지 말고
workflowName
,nodeName
,errorMessage
,errorStack
,timestamp
등 객체 형태로 구조화하여 저장하거나 전송하세요. 나중에 분석하기 훨씬 용이합니다. - 모니터링 대시보드: Grafana, Datadog 같은 모니터링 툴과 연동하여 n8n 워크플로우의 실행 성공/실패율, 실행 시간 등을 시각화하면 자동화의 건강 상태를 한눈에 파악할 수 있습니다.
- 워크플로우 문서화: 복잡한 워크플로우는 주석(Comment 노드)을 충분히 달고,
Description
필드를 활용하여 워크플로우의 목적, 주요 로직, 예상되는 입출력 등을 상세하게 기록합니다. 이는 미래의 나 자신 또는 다른 팀원을 위한 투자입니다. - “Fail Fast” vs. “Graceful Degradation”:
- Fail Fast: 심각한 오류가 발생하면 즉시 중단하고 알림을 보내는 전략. 데이터 무결성이 매우 중요한 경우에 적합합니다.
- Graceful Degradation: 오류가 발생해도 워크플로우가 완전히 멈추지 않고, 일부 기능을 제한하거나 대체 경로를 통해 계속 진행하는 전략. 사용자 경험이나 서비스 연속성이 중요한 경우에 적합하며, 위에서 다룬 Try/Catch, 폴백 로직 등이 이에 해당합니다. 어떤 전략을 사용할지는 워크플로우의 중요도와 목적에 따라 신중하게 결정해야 합니다.
맺음말 🎉
n8n 디버깅과 에러 처리는 처음에는 복잡하게 느껴질 수 있지만, 이 가이드에서 제시된 도구와 전략들을 꾸준히 연습하고 적용한다면 여러분의 자동화는 훨씬 더 견고하고 신뢰할 수 있게 될 것입니다. 더 이상 “자동화가 멈췄다”는 걱정 없이, 멈춤 없는 자동화의 자유를 만끽하시길 바랍니다!
궁금한 점이나 추가적인 팁이 있다면 언제든지 댓글로 남겨주세요! 행복한 자동화 생활 되세요! 💖 D