# 계획서: InsuRo 트렌드 인사이트

**프로젝트**: InsuRo 키워드 분석 기능 재설계
**기능명**: 트렌드 인사이트 (Trend Insight)
**위치**: AI마케팅 > AI키워드분석 > "키워드 순위" 탭 → "트렌드 인사이트" 탭 교체
**작업 레벨**: Lv.4
**status**: in-progress (Phase 1 완료, Phase 2 준비 중)
**작성일**: 2026-04-30
**수정일**: 2026-04-30 (17사이클 미팅 반영)
**근거**: 에이전트 미팅 7사이클 (2026-04-29) + 17사이클 (2026-04-30)
  - memory/meetings/2026-04-29-keyword-ranking-redesign.md
  - memory/meetings/2026-04-30-keyword-pool-limit-overcome.md
**벤치마킹**: 블랙키위(BlackKiwi), 썸트렌드(Sometrend), whereispost 무한키워드

---

## 1. 목표

보험 설계사가 "지금 어떤 보험 키워드가 뜨고 있는지, 어떤 키워드로 글을 쓰면 효과적인지"를 데이터 기반으로 한눈에 파악할 수 있는 보험 업계 전용 키워드 트렌드 분석 기능.

**핵심 가치**: 블랙키위/썸트렌드 같은 범용 도구에서 불가능한 "보험 특화 + 자동 추천(Push) + 글쓰기 원스탑 연결"

---

## 2. 범위

### 포함 (Phase 1)

#### 2-1. 키워드 풀 선정 파이프라인 (★17사이클 반영)
- 시드 키워드 30개 (6카테고리) 수동 관리
- SearchAd API 연관 키워드 자동 확장 → ~14,000개
- 월간 검색량 상위 **3,500개** 컷오프 (하한 월 **50**회)
  - **코어 3,000개**: 월검색량 >=100 + 도메인점수 >=0.7 → 매일 전수 수집
  - **탐색 500개**: 월검색량 50~99 또는 뉴스 편입 → 주 2회 수집
  - **하드캡**: 코어 max 3,000 / 탐색 max 500 / 총 max 3,500
  - **overflow**: 상한 초과 시 복합 스코어 최하위부터 강등
  - **핀 기능**: is_pinned=true 키워드는 재분류 시 강등 면제 (상한 100개)
- 노이즈 필터링 (정규식 블록리스트 8패턴 + 보험사 브랜드 단독 제거)
  - ★ 선정적/범죄 패턴 2개 추가 (살인/자살/..., 파산/횡령/...)
- 카테고리 자동 분류 (규칙 기반 매칭)
- 갱신: 월 1회 (매월 1일 03:00) + 매월 1일 코어/탐색 자동 재분류
- **API 2개 운용**: Primary(서비스용) / Standby(분석용), 2인 각각 1앱 등록

#### 2-2. 데이터 수집 배치 (★17사이클 반영)
- DataLab API: 코어 3,000개 매일(배치 5개 묶기 600회) + 탐색 500개 주2회(100회)
  - 앵커("보험") 정규화, API 2세트 합산 일 2,000회 한도
- Blog Search API: 3,500개 전수 매일 (3,500회/일, 한도 50,000회 중 7%)
- SearchAd API: 월간 검색량 + 경쟁도 갱신 (월 1회, 풀 갱신 시)
- **크론: 래퍼 스크립트 파이프라인** (5→2 크론으로 통합)
  - run_trend_pipeline.sh: 트렌드→포화도→[선행체크]→랭킹→헬스체크
  - flock 이중실행 방지 + 선행 실패 시 후속 자동 스킵
- **3단계 Degradation**: NORMAL(전체) → LEVEL_1(DataLab+Blog) → LEVEL_2(Blog만) → LEVEL_3(캐시)

#### 2-3. 랭킹 알고리즘
- 급상승 점수: (최근 2주 평균 - 이전 8주 평균) / 이전 8주 평균 × 100
- 포화지수: 블로그 발행수 / 월간 검색량, ×10 정규화 (0~100)
- 이슈성 지수: 급상승 × log10(검색량)
- **복합 랭킹: 기회도(100-포화) × 0.40 + 급상승 × 0.35 + 이슈성 × 0.25**
- 엣지 케이스: 신규=surge 0, 검색량 0=비활성, 동점=검색량 타이브레이크

#### 2-4. 프론트엔드 UI
- "키워드 순위" 탭 → **"트렌드 인사이트"** 탭으로 교체
- TOP 20 카드 리스트: 순위, 등락, 키워드명, 검색량 바, 포화뱃지, 이슈라벨, 7일 스파크라인, [글쓰기] CTA
- 하단 "오늘의 추천" 배너 (복합 스코어 1위 자동 선정)
- 카테고리 필터 (8개 탭)
- **안내 페이지 구성** (아래 상세)
- 모바일 반응형

#### 2-5. 안내 페이지 구성 (UX 중요)
- **상단 안내 배너** (dismiss 가능):
  - "2,000개 보험 키워드의 실시간 트렌드를 분석합니다"
  - "기회도가 높은 키워드로 블로그 글을 쓰면 상위노출 확률이 높아집니다"
- **각 지표 설명 팝오버** (물음표 아이콘):
  - 급상승: "최근 2주간 검색량이 이전 대비 얼마나 증가했는지"
  - 기회도: "검색은 많지만 블로그 글이 적어 상위노출 기회가 높은 정도"
  - 이슈성: "현재 화제가 되고 있는 정도 (급상승 × 검색량)"
- **포화지수 뱃지 설명**:
  - 🔵 블루오션: "검색은 많은데 글이 적어 상위노출 기회가 높은 키워드"
  - 🟡 경쟁중: "적절한 경쟁 수준의 키워드"
  - 🔴 포화: "이미 많은 블로거가 다루고 있는 키워드"
- **"글쓰기" CTA 안내**: "이 키워드로 AI가 블로그 글을 작성합니다"
- **하단 활용법 섹션** (처음 사용자용 3단계):
  1. 트렌드 확인 — 지금 뜨고 있는 보험 키워드를 확인합니다
  2. 기회 발견 — 🔵블루오션 뱃지가 있는 키워드를 선택합니다
  3. 바로 글쓰기 — [글쓰기] 버튼으로 AI가 블로그 글을 작성합니다
- **갱신 시각 표시**: "마지막 업데이트: 2026-04-30 07:00"

#### 2-6. 행동 연결
- [글쓰기] → /generate?keyword=X&source=trend-insight
- /generate 페이지에서 해당 키워드 자동 삽입 + 트렌드 맥락 전달

#### 2-7. 플랜 차등
- 빈도 차등: 무료=주 1회 갱신, 맥스=일 1회 갱신
- TOP 20 전체 표시 (블러/개수 제한 없음)
- "프리미엄은 매일 업데이트됩니다" 배지

#### 2-8. DB (5+4 테이블)
**Phase 1 (완료):**
- keywords: 키워드 풀 마스터 (3,500행, is_pinned 컬럼 추가 필요)
- keyword_trends: 일별/주별 트렌드 데이터
- keyword_saturation: 일별 블로그 포화도
- keyword_rankings: 일별 랭킹 스냅샷 (movement/saturation_badge/issue_label 추가 완료)
- failed_batches: 수집 실패 로그
**Phase 2 (신규):**
- keyword_pool: 코어/탐색 풀 관리 (pool_type, domain_score, source, season_tags)
- news_keyword_candidates: 뉴스 키워드 후보 큐 (status, frequency, domain_score)
- surge_events: 급등 이벤트 로그 (surge_pct, trigger_type, notified)
- keyword_stats_monthly: 90일 압축 월별 집계

#### 2-9. 운영/모니터링 (★17사이클 반영)
- 래퍼 스크립트 내 헬스체크 (수집률 90% 미만 시 Telegram 알림)
- 수집 실패 시 3회 재시도 (지수 백오프)
- 키워드 풀 월 1회 자동 갱신 + 코어/탐색 재분류 + Telegram 보고
- **데이터 보존: 90일 raw, 이후 monthly 압축** (Supabase 무료 500MB 내 운영)
- **API 헬스체크: 30분 간격, 실패 시 즉시 재시도 + Degradation 자동 전환**
- **급등 감지 시 Telegram 즉시 알림** (키워드, 급등률, 원인, CTA)

### Phase 2 (17사이클 미팅 확정)
- **뉴스 API 키워드 감지**: 정규식+도메인사전 → opt-out 자동 승인 → T3 편입 (주 10개 상한)
- **시즌 캘린더 부스트**: 6개 시즌 JSON, 시즌 2주 전부터 관련 키워드 T1 승격
- **급등 감지 알림**: 200% 임계값 (시즌 300%), Telegram+대시보드 이중 채널
- **코어/탐색 이원 수집 엔진**: 하이브리드 배치 스케줄러
- **DB 90일 압축**: raw→monthly 롤업, keyword_stats_monthly 테이블

### 제외 (Phase 3 이후)
- LLM 키워드 예측기 (환각 리스크, 적중률 공개 전제)
- 커뮤니티 RSS 크롤링
- 자동 편입 (opt-out → 완전 자동, 데이터 축적 후)
- 경쟁 키워드 역분석 (SearchAd 재귀 확장)
- 연령/성별 검색 비율
- 소셜 언급량 분석
- 긍부정 감성 분석
- 개인화 (전문 분야별 필터)

### 건드리지 않는 것
- 기존 trend_keywords 테이블
- 기존 "검색량 조회" 탭
- 기존 인포키워드 API 연동
- 다른 탭(구글 트렌드, 정보성 키워드, 상위노출, 메인 노출)

---

## 3. 위임 계획

### Phase 분리
이 작업은 Lv.4이지만, 단일 Phase로 구현 가능 (백엔드 배치 + 프론트 UI가 독립적).

**병렬 위임 가능**:
- 팀 A (백엔드): 키워드 풀 선정 + 데이터 수집 배치 + 랭킹 알고리즘 + API 엔드포인트 + DB 마이그레이션
- 팀 B (프론트): "트렌드 인사이트" 탭 UI + 안내 페이지 + 글쓰기 CTA 연결

**순차 의존**:
- 팀 A 완료 → API 엔드포인트 확정 → 팀 B에서 API 연동

**권장**: 팀 A 먼저 시작 (3~4일), 팀 B는 API 스펙 확정 후 시작 (2~3일)

### 우선순위 (일정 압박 시)
- **P0 (필수)**: 키워드 풀 선정 + DataLab 수집 + 랭킹 산출 + TOP 20 리스트 + 글쓰기 CTA + 안내 배너
- **P1 (강력 권장)**: 카테고리 필터 + 포화지수 뱃지 + 급상승/상승/보합 표시
- **P2 (후순위)**: 스파크라인 + "오늘의 추천" 배너 + 지표 설명 팝오버 + 하단 활용법 섹션

---

## 4. 비용

| 항목 | 월간 | 비고 |
|------|------|------|
| DataLab API | 0원 | 500회/일, 쿼터 1,000회 내 |
| Blog Search API | 0원 | 2,000회/일, 쿼터 25,000회 내 |
| SearchAd API | 0원 | 월 1회 30회 |
| 서버 | 0원 | 자체 서버, 부하 무시 |
| Supabase DB | 0원 | ~75MB/년, Free 500MB 내 |
| Cloudflare | 0원 | 프론트 +5KB |
| **합계** | **0원** | |

---

## 5. 검증 기준

1. 키워드 풀 2,000개가 SearchAd에서 자동 선정되는가
2. DataLab 일 1회 수집이 정상 동작하는가 (수집률 95% 이상)
3. 포화지수 뱃지(블루오션/경쟁중/포화)가 정확한가
4. 복합 랭킹 TOP 20이 의미 있게 정렬되는가 (급상승 키워드가 상위)
5. [글쓰기] CTA → /generate 프리필 연결이 동작하는가
6. 안내 배너/팝오버가 기능 이해에 충분한가
7. 모바일 반응형 정상
8. npm run build 성공
9. 플랜별 갱신 빈도 차등 동작

---

## 6. 예상 일정

- 백엔드: 4일 (풀 선정 1일 + 수집 배치 1일 + 랭킹 알고리즘 1일 + API/테스트 1일)
- 프론트: 3일 (UI 2일 + 안내 페이지 0.5일 + 글쓰기 연결 0.5일)
- **총: 7일** (병렬 시 4일)
