# task-217.1 완료 보고서: InforKeyword LLM 전환 + 검색광고 API 연동

**팀**: dev2-team (오딘 팀장)
**작업일**: 2026-03-04
**상태**: 완료

---

## 작업 내용

### 수정 1: LLM을 Gemini → Claude CLI로 전환
- `claude -p` 명령어를 subprocess로 호출하는 방식으로 전환
- Claude Code Max 구독 내에서 처리 (추가 비용 없음)
- 타임아웃 60초, 실패 시 재시도 로직 유지

### 수정 2: 네이버 검색광고 API 환경변수 정비
- 환경변수명을 `NAVER_SEARCHAD_*` 형식으로 통일
- `.env.keys` 파일 자동 로드 지원 추가 (config.py)
- HMAC-SHA256 서명 생성 및 API 호출 코드는 기존 구현 유지

---

## 생성/수정 파일 목록

| 파일 | 변경 내용 |
|------|-----------|
| `worker/config.py` | Gemini 설정 제거, Claude CLI 설정 추가, Naver 환경변수명 변경, `.env.keys` 로드 지원 |
| `worker/generator/keyword_generator.py` | Gemini SDK → Claude CLI subprocess 호출 |
| `worker/analyzer/llm_promotional.py` | Gemini SDK → Claude CLI subprocess 호출 |
| `worker/analyzer/image_analysis.py` | Gemini 멀티모달 → Claude CLI stdin 이미지 파이프 |
| `worker/crawler/search_ad.py` | 환경변수명 `NAVER_SEARCHAD_*`로 통일 |
| `.env` | `GEMINI_API_KEY`/`GEMINI_MODEL` 제거, `CLAUDE_CLI_TIMEOUT` 추가, Naver 키명 업데이트 |
| `requirements.txt` | `google-generativeai` 제거, `Pillow>=10.0.0` 추가 |
| `tests/test_claude_integration.py` | 신규 — Claude CLI 전환 테스트 24개 |

---

## 테스트 결과

- 기존 테스트: **79개 PASS**
- 신규 테스트: **24개 PASS**
- **전체: 103개 PASS, 0 FAIL**

---

## 자동 검증 (qc_verify.py)

```json
{
  "task_id": "task-217.1",
  "verified_at": "2026-03-04T01:57:39",
  "checks": {
    "api_health": {"status": "SKIP"},
    "file_check": {"status": "PASS", "details": "7/7 파일 OK"},
    "data_integrity": {"status": "PASS"},
    "test_runner": {"status": "PASS", "details": "103 passed in 0.97s"}
  }
}
```

---

## 버그 유무

없음

---

## 비고

- 이미지 분석(image_analysis.py)은 이미지 바이너리를 stdin으로 Claude CLI에 파이프하는 방식 사용
- `_resize_screenshot()`으로 높이 4096px 초과 이미지 크롭 후 전송
- `.env.keys` 파일이 존재하면 자동으로 로드하여 API 키 오버라이드 (보안상 `.env.keys`는 gitignore 권장)
- Naver 검색광고 API 키가 미설정 시 기존과 동일하게 스텁 결과 반환
