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

고객 리뷰 자동 수집 → 감정 분석 → 대시보드

  • ▸Google Maps / Naver 플레이스 리뷰 주기적 수집
  • ▸OpenAI API로 리뷰 감정(긍정/부정/중립) 자동 분류
  • ▸부정 리뷰 발생 시 담당자에게 즉시 알림

✅사전 준비

  • □Google Places API 키 발급 (https://console.cloud.google.com)
  • □OpenAI API 키 준비
  • □Google Sheets 결과 저장용 스프레드시트 생성
  • □Slack 또는 이메일 알림 채널 설정

Google Places 리뷰 수집

Node: HTTP Request
Method: GET
URL: https://maps.googleapis.com/maps/api/place/details/json
Query Parameters:
  place_id: YOUR_PLACE_ID
  fields: reviews,rating
  language: ko
  key: YOUR_GOOGLE_API_KEY

OpenAI 감정 분석 프롬프트

모델: gpt-4o-mini

System: 당신은 고객 리뷰 감정 분석 전문가입니다.
리뷰를 읽고 다음 JSON 형식으로만 응답하세요:
{"sentiment": "긍정|부정|중립", "score": 0.0~1.0, "summary": "한 줄 요약"}

User: 다음 리뷰를 분석해주세요:
{{ $json.text }}

부정 리뷰 필터 (IF 노드)

Condition: {{ JSON.parse($json.choices[0].message.content).sentiment }} == '부정'
또는
Condition: {{ JSON.parse($json.choices[0].message.content).score }} < 0.3
⚠️ 주의Google Places API는 최근 5개 리뷰만 반환합니다. 더 많은 리뷰가 필요하면 서드파티 스크레이핑 서비스를 활용하거나, 자체 리뷰 수집 폼을 운영하는 것을 권장합니다.
⚡

워크플로우 JSON

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

📥 n8n 임포트 방법
n8n 화면 우측 상단 메뉴 (⋮) → Import from JSON → 아래 JSON 전체 복사 후 붙여넣기 → Import 클릭
{
  "recipeId": "recipe056",
  "title": "주간 업무 현황 자동 수집 & 리포트",
  "chapter": 5,
  "category": "HR & 조직 운영 자동화",
  "difficulty": "⭐⭐",
  "estimatedTime": "35분",
  "usedApps": [
    "Slack",
    "Google Sheets"
  ],
  "description": "매주 금요일 오후 4시에 각 팀원에게 Slack DM으로 주간 업무 요약 입력을 요청하고, 응답 내용을 Google Sheets에 자동 기록한 뒤 오후 5시에 취합된 내용을 팀장에게 요약 발송합니다.",
  "nodes": [
    {
      "id": "trigger_request",
      "type": "trigger",
      "service": "Schedule",
      "name": "매주 금요일 오후 4시",
      "config": {
        "interval": "weekly",
        "dayOfWeek": "friday",
        "time": "16:00"
      }
    },
    {
      "id": "get_team_members",
      "type": "action",
      "service": "Google Sheets",
      "name": "팀원 목록 조회",
      "config": {
        "operation": "readRows",
        "spreadsheetId": "{{$env.HR_SHEET_ID}}",
        "sheetName": "직원명단",
        "columns": [
          "이름",
          "슬랙ID",
          "팀"
        ]
      }
    },
    {
      "id": "loop_members",
      "type": "action",
      "service": "SplitInBatches",
      "name": "팀원별 DM 발송",
      "config": {
        "batchSize": 1
      }
    },
    {
      "id": "send_dm_request",
      "type": "action",
      "service": "Slack",
      "name": "주간 업무 입력 DM",
      "config": {
        "operation": "sendDM",
        "userId": "{{$json['슬랙ID']}}",
        "message": "📝 {{$json['이름']}}님, 이번 주 업무 요약을 이 채널에 입력해 주세요!\n\n아래 형식으로 작성해 주시면 됩니다:\n\n✅ 완료한 업무:\n🔄 진행 중인 업무:\n⚠️ 이슈/블로커:\n📌 다음 주 계획:\n\n입력 기한: 오늘 오후 5시까지"
      }
    },
    {
      "id": "trigger_collect",
      "type": "trigger",
      "service": "Schedule",
      "name": "매주 금요일 오후 5시 수집",
      "config": {
        "interval": "weekly",
        "dayOfWeek": "friday",
        "time": "17:00"
      }
    },
    {
      "id": "trigger_slack_message",
      "type": "trigger",
      "service": "Slack",
      "name": "Slack DM 응답 수신",
      "config": {
        "event": "message",
        "channelType": "im"
      }
    },
    {
      "id": "record_report",
      "type": "action",
      "service": "Google Sheets",
      "name": "주간 보고 시트 기록",
      "config": {
        "operation": "appendRow",
        "spreadsheetId": "{{$env.WEEKLY_REPORT_SHEET_ID}}",
        "sheetName": "주간보고",
        "row": {
          "주차": "{{$now.format('YYYY년 WW주')}}",
          "날짜": "{{$now.format('YYYY-MM-DD')}}",
          "작성자": "{{$json['user_name']}}",
          "내용": "{{$json['text']}}"
        }
      }
    },
    {
      "id": "react_check",
      "type": "action",
      "service": "Slack",
      "name": "접수 완료 이모지 반응",
      "config": {
        "operation": "addReaction",
        "channel": "{{$json['channel']}}",
        "timestamp": "{{$json['ts']}}",
        "emoji": "white_check_mark"
      }
    },
    {
      "id": "trigger_summary",
      "type": "trigger",
      "service": "Schedule",
      "name": "매주 금요일 오후 5시 10분 요약 발송",
      "config": {
        "interval": "weekly",
        "dayOfWeek": "friday",
        "time": "17:10"
      }
    },
    {
      "id": "get_this_week_reports",
      "type": "action",
      "service": "Google Sheets",
      "name": "이번 주 보고 취합",
      "config": {
        "operation": "readRows",
        "spreadsheetId": "{{$env.WEEKLY_REPORT_SHEET_ID}}",
        "sheetName": "주간보고",
        "filters": {
          "주차": "{{$now.format('YYYY년 WW주')}}"
        }
      }
    },
    {
      "id": "send_summary_to_manager",
      "type": "action",
      "service": "Slack",
      "name": "팀장에게 주간 요약 발송",
      "config": {
        "operation": "sendDM",
        "userId": "{{$env.MANAGER_SLACK_ID}}",
        "message": "📊 {{$now.format('YYYY년 WW주')}} 팀 주간 업무 현황\n\n{{$items().map(r => `👤 ${r.json['작성자']}\n${r.json['내용']}\n`).join('\n---\n')}}\n\n👉 전체 시트 보기: {{$env.WEEKLY_REPORT_SHEET_URL}}"
      }
    }
  ],
  "edges": [
    {
      "from": "trigger_request",
      "to": "get_team_members"
    },
    {
      "from": "get_team_members",
      "to": "loop_members"
    },
    {
      "from": "loop_members",
      "to": "send_dm_request"
    },
    {
      "from": "trigger_slack_message",
      "to": "record_report"
    },
    {
      "from": "record_report",
      "to": "react_check"
    },
    {
      "from": "trigger_summary",
      "to": "get_this_week_reports"
    },
    {
      "from": "get_this_week_reports",
      "to": "send_summary_to_manager"
    }
  ],
  "tips": [
    "Slack DM 트리거는 n8n의 Slack Trigger 노드에서 'message' 이벤트와 'im' 채널 타입을 선택하면 DM 메시지를 감지할 수 있어요.",
    "미응답 팀원 목록을 자동으로 파악해 리마인더 DM을 보내려면 오후 4시 30분에 시트와 대조하는 추가 워크플로우를 만들어보세요.",
    "부서별로 팀원을 그룹핑하여 팀장에게 부서별 요약을 전달하면 조직 규모가 커져도 효율적으로 운영할 수 있어요."
  ],
  "qrUrl": "www.koreaaitimes.com/books/n8n-vol2/recipe056"
}
← 이전 레시피☰ 목차다음 레시피 →