# task-2124: 네이버 키워드 검색 완전 수정 — 완료 보고서

**팀**: dev1-team (헤르메스)
**레벨**: Lv.4 (critical)
**프로젝트**: InsuRo
**PR**: https://github.com/JonghyukJeon/InsuRo/pull/18 (MERGED)

---

## SCQA

**S**: InsuRo의 네이버 키워드 분석 기능이 서비스 중이며, 단일 키워드(예: "실비보험") 검색은 정상 동작한다.

**C**: 사용자가 공백 포함 키워드("실비보험 가격")를 입력하면 네이버 SearchAd API가 `{"code":11001,"message":"hintKeywords 파라미터가 유효하지 않습니다"}` 에러를 반환한다. 근본 원인은 API의 `hintKeywords` 파라미터가 공백을 허용하지 않는데, 서버가 사용자 입력을 그대로 전달했기 때문이다. Lv.4 — 5회 이상 실패 후 아누가 근본 원인을 규명하여 수정 지시서를 작성.

**Q**: 공백/쉼표 포함 키워드 입력 시에도 에러 없이 결과를 반환할 수 있는가?

**A**: `re.split(r"[,\s]+", req.query)`로 키워드를 분할하고 각각 API를 호출한 뒤 `relKeyword` 기준으로 중복 제거하여 병합. 대시보드(routes_post.py:1810)에서 검증된 동일 패턴 적용. 테스트 결과: 단일(754건), 공백(831건), 쉼표(2293건), 빈문자열(400), JWT 없음(401) — 전체 5개 시나리오 통과. Gemini PR 리뷰 High 0건 PASS.

---

## 수정 파일

| 파일 | 변경 내용 | grep 검증 | 상태 |
|------|-----------|-----------|------|
| server/main.py:16 | `import re` 추가 | grep "import re" OK (L16) | verified |
| server/main.py:826-828 | 빈 문자열 검증 추가 | grep "키워드를 입력하세요" OK | verified |
| server/main.py:831 | `re.split(r"[,\s]+", req.query)` 키워드 분할 | grep "re.split" OK (L831) | verified |
| server/main.py:835-837 | 키워드 수 상한 10개 제한 | grep "최대 10개" OK (L837) | verified |
| server/main.py:842-876 | 개별 API 호출 + 결과 병합 (seen/all_results) | grep "seen = set" OK (L844) | verified |

---

## L1 스모크테스트 결과

- 서버 재시작: 성공 (`systemctl --user restart insuro-api` → active running)
- API 응답 확인:
  - Test 1 (단일): `"실비보험"` → 200 OK, keywordList 754건
  - Test 2 (공백): `"실비보험 가격"` → 200 OK, keywordList 831건 ← **핵심 수정 검증**
  - Test 3 (쉼표): `"실비보험,암보험,치아보험"` → 200 OK, keywordList 2293건
  - Test 4 (빈문자열): `"  "` → 400 "키워드를 입력하세요"
  - Test 5 (JWT 없음): → 401 Missing authorization
- 스크린샷: 해당없음 (API 백엔드 작업)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **`re` import 누락** — 상단 import에 추가 (L16)
2. **키워드 개수 무제한 → rate limit 위험** — Codex 리뷰에서 지적, 최대 10개 제한 추가 (L835-837)
3. **빈 문자열 입력 시 빈 배열로 API 호출** — 빈 문자열 사전 검증 추가 (L826-828)

### 범위 외 미해결 (2건)
1. **datalab search_type 네이버 인증 오류** — NAVER_CLIENT_ID/SECRET 관련 기존 이슈. keyword와 무관, 별도 작업 필요
2. **순차 API 호출 지연** — Gemini 리뷰 medium. 키워드 다수 입력 시 순차 호출로 지연 가능. asyncio.gather 병렬화는 향후 최적화 작업으로 분리

---

## Gemini PR 리뷰

- PR: #18
- High: 0건 → PASS
- Medium: 2건
  - 순차 처리 지연 → DEFER (별도 최적화 작업)
  - 502 에러 의미론 → DEFER (모든 API 실패 시 502 적절)

---

## 머지 판단

- **머지 필요**: Yes (완료)
- **브랜치**: task/task-2124-dev1
- **PR**: #18 (MERGED)
- **머지 의견**: Gemini 리뷰 High 0건, 5개 테스트 시나리오 전체 통과, 기존 동작 영향 없음

---

## 3문서

- 계획서: `memory/plans/tasks/task-2124/plan.md` (status: completed)
- 맥락노트: `memory/plans/tasks/task-2124/context-notes.md` (3 Step Why 완료)
- 체크리스트: `memory/plans/tasks/task-2124/checklist.md` (7/9 = 78%)

---

## 모델 사용 기록

- 팀원: 불칸 / 작업 내용: server/main.py keyword 분기 수정 + micro-commit / 사용 모델: sonnet / 정당성: -

---

## Codex 사전 검증

- 결과: 분석 완료 (코드 수정 전이므로 pass=false 예상)
- 반영 사항: 키워드 수 상한 10개, 에러 메시지 통일, 빈 문자열 검증 강화

## 세션 통계
- 총 도구 호출: 0회


## 세션 통계
- 총 도구 호출: 0회

