---
task_id: task-2321
type: context
scope: task
created: 2026-04-30
updated: 2026-04-30
status: in-progress
---

# 맥락 노트: task-2321

**task**: task-2321

---

## 결정 근거

### Codex G1 리뷰 대응 (2026-04-30)

1. **DB 마이그레이션 방식**: SQL Editor 수동 실행 대신 `server/migrations/` 파일 사용 → 스키마 드리프트 방지
2. **keyword_trends UNIQUE 변경**: `(keyword_id, period_start)` → `(keyword_id, period_start, period_end)` → 일별/주별 공존 가능
3. **.env 로딩**: `.env.keys` 대신 기존 `.env` dotenv 방식 사용 (main.py와 일관)
4. **브랜드 필터**: exact match 기준 (substring 제거 시 "삼성 암보험" 등 유효 키워드 탈락 방지)
5. **키워드 정규화**: strip + 다중공백 축소 + lower → 중복 제거 정밀도 향상
6. **SearchAd "< 10" 파싱**: 문자열 검색량 → int 변환 처리 (< 10 → 5로 치환)

### 3 Step Why

1st Why: 왜 이 설계가 필요한가?
→ 기존 30개 고정 키워드 순위는 의미 없고, 2,000개 자동 확장 키워드 풀로 보험 업계 전용 트렌드 분석 기반을 마련해야 한다.

2nd Why: 왜 SearchAd API + 시드 30개 자동 확장이 최선인가?
→ 네이버 공식 API만 사용(법적 안전), 비용 0원, 시드 30개로 1만+ 연관 키워드 확보, 상위 2,000개 컷오프로 DataLab 쿼터(500회/일) 최적 활용.

3rd Why: 왜 이 접근이 다른 대안보다 나은가?
→ 수동 150개 시드(롱테일 미커버) 대비 자동 확장이 관리 부담 최소. 크롤링(법적 리스크) 대비 API 기반이 안전. 비용 차이 0원.

A-B-C 일관성: ✅

## 참조 자료

- 마스터 계획서: `memory/plans/insuro-trend-insight/plan.md`
- 마스터 체크리스트: `memory/plans/insuro-trend-insight/checklist.md`
- 에이전트 미팅: `memory/meetings/2026-04-29-keyword-ranking-redesign.md`
- SearchAd 인증 참조: `server/main.py:1969-2016` (_get_naver_search_volume)
- Supabase 클라이언트 참조: `server/trend_collector.py:17-21` (get_supabase)

## 주의사항

- 기존 trend_keywords 테이블 절대 건드리지 않음
- SearchAd rate limit: 0.5초 간격 호출
- .env 파일 경로: /home/jay/projects/InsuRo/.env (load_dotenv 기반)
