발행일: 2026-10-06(화) 11:44
← 목차로 돌아가기|하루 30분 n8n 시리즈 ② 실무 자동화 레시피 100
RECIPE 086

API 에러 자동 감지 → 개발팀 알림 + 티켓 생성

  • ▸애플리케이션 에러 로그에서 임계값 초과 에러 자동 감지
  • ▸Slack 개발팀 채널에 에러 상세 정보 즉시 알림
  • ▸Jira/GitHub에 버그 티켓 자동 생성

✅사전 준비

  • □에러 로그 소스 결정: Sentry 웹훅, CloudWatch, 또는 커스텀 로그 API
  • □에러 심각도 분류 기준 정의 (critical/error/warning)
  • □Slack #dev-alerts 채널 웹훅 URL
  • □Jira 프로젝트 키 및 이슈 타입 ID 확인

Sentry 웹훅 수신 설정

// Sentry: Settings → Integrations → Webhooks
// 또는 Alert Rules → Actions → Send a notification via...

Node: Webhook
Path: /sentry-error
Method: POST

// 에러 심각도 필터 (IF 노드)
Condition: {{ $json.data.event.level }} == 'error'
또는: {{ $json.data.event.level }} == 'fatal'

Slack 에러 알림 포맷

:rotating_light: *프로덕션 에러 감지*

심각도: {{ $json.data.event.level.toUpperCase() }}
에러: {{ $json.data.event.title }}
파일: {{ $json.data.event.culprit }}
발생 횟수: {{ $json.data.event.times_seen }}회
최초 발생: {{ $json.data.event.firstSeen }}

상세 링크: {{ $json.url }}

@dev-team 즉시 확인 바랍니다.

Jira 버그 티켓 자동 생성

Node: HTTP Request
Method: POST
URL: https://YOUR_DOMAIN.atlassian.net/rest/api/3/issue
Authentication: Basic Auth

Body:
{
  "fields": {
    "project": { "key": "PROJ" },
    "summary": "[자동생성] {{ $json.data.event.title }}",
    "description": {
      "type": "doc",
      "version": 1,
      "content": [{
        "type": "paragraph",
        "content": [{ "type": "text", "text": "Sentry 링크: {{ $json.url }}" }]
      }]
    },
    "issuetype": { "name": "Bug" },
    "priority": { "name": "{{ $json.data.event.level === 'fatal' ? 'Critical' : 'High' }}" }
  }
}
💡 TIP동일 에러가 5분 내 3번 이상 발생한 경우에만 티켓을 생성하도록 쿨다운 로직을 추가하면 중복 티켓 생성을 방지할 수 있습니다. Sheets나 Redis에 마지막 알림 시각을 저장하는 방식을 사용하세요.
⚡

워크플로우 JSON

아래 JSON을 복사해 n8n에 바로 임포트하세요

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "recipeId": "recipe086",
  "title": "당근마켓 키워드 알림 자동화",
  "chapter": 8,
  "category": "국내 서비스 특화 레시피",
  "difficulty": "⭐",
  "estimatedTime": "20분",
  "usedApps": [
    "HTTP Request (당근마켓 RSS/API)",
    "Slack"
  ],
  "description": "1시간마다 당근마켓 검색 결과를 자동 수집해, 내가 원하는 키워드의 새 게시물이 올라오면 Slack에 제목·가격·링크를 즉시 알려줍니다. 특정 물건이나 지역·카테고리 매물을 모니터링할 때 유용합니다.",
  "nodes": [
    {
      "id": "node1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "name": "1시간마다 실행",
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 * * * *"
            }
          ]
        }
      }
    },
    {
      "id": "node2",
      "type": "n8n-nodes-base.httpRequest",
      "name": "당근마켓 검색 결과 수집",
      "parameters": {
        "method": "GET",
        "url": "https://www.daangn.com/search/{{$env.DAANGN_KEYWORD}}",
        "headers": {
          "User-Agent": "Mozilla/5.0"
        }
      }
    },
    {
      "id": "node3",
      "type": "n8n-nodes-base.htmlExtract",
      "name": "게시물 정보 추출",
      "parameters": {
        "extractionValues": {
          "values": [
            {
              "key": "title",
              "cssSelector": ".article-title",
              "returnValue": "text"
            },
            {
              "key": "price",
              "cssSelector": ".article-price",
              "returnValue": "text"
            },
            {
              "key": "link",
              "cssSelector": "a.article-card",
              "returnValue": "href"
            }
          ]
        }
      }
    },
    {
      "id": "node4",
      "type": "n8n-nodes-base.if",
      "name": "새 게시물 여부 확인",
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{$json['link']}}",
              "operation": "isNotEmpty"
            }
          ]
        }
      }
    },
    {
      "id": "node5",
      "type": "n8n-nodes-base.slack",
      "name": "새 게시물 Slack 알림",
      "parameters": {
        "channel": "={{$env.PERSONAL_SLACK_ID}}",
        "text": "🥕 당근마켓 새 게시물!\n\n*{{$json['title']}}*\n가격: {{$json['price']}}\n🔗 {{$json['link']}}"
      }
    }
  ],
  "envVariables": {
    "DAANGN_KEYWORD": "모니터링할 검색 키워드 (URL 인코딩)",
    "PERSONAL_SLACK_ID": "본인 Slack DM ID"
  },
  "tips": [
    "당근마켓은 공식 API를 제공하지 않아 HTTP Request로 웹 페이지를 파싱하는 방식을 사용합니다. 사이트 구조 변경 시 CSS 셀렉터를 업데이트해야 할 수 있어요.",
    "중복 알림을 방지하려면 처리된 게시물 링크 목록을 Google Sheets에 저장하고 IF 노드에서 비교하세요.",
    "지역을 필터링하려면 URL에 지역 파라미터를 추가하거나 HTML 파싱 단계에서 지역 정보를 추출해 IF 노드로 필터링하세요."
  ],
  "qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe086"
}
← 이전 레시피☰ 목차다음 레시피 →