# task-1558.1 완료 보고서: 네이버 블로그 대시보드 탭 구현

## SCQA

**S**: 대시보드(http://100.76.130.39:8000/dashboard/)에 12개 탭이 운영 중이며, 네이버 블로그 콘텐츠 작업은 외부 도구에 의존하고 있다.

**C**: 키워드 분석 → 글 생성 → 경쟁 분석의 3단계 블로그 워크플로우가 대시보드 내에서 통합되지 않아, 작업 전환 비용이 발생하고 네이버 검색광고 API 활용이 불가능했다.

**Q**: 대시보드에 네이버 블로그 전용 탭을 추가하여 키워드 분석부터 글 생성까지 원스톱 워크플로우를 제공할 수 있는가?

**A**: 네이버 블로그 탭(13번째)을 추가 완료. 기능 0(키워드 분석)은 네이버 검색광고 API 실시간 연동으로 749개+ 연관 키워드 분석 + AI 기반 5순위 추천 제공. 기능 1(글 생성)은 SEO/GEO 최적화 프롬프트 자동 생성 및 파일 저장 구현. 기능 2(경쟁 분석)는 stub으로 구현하여 향후 크롤링 연동 예정. API 3개 엔드포인트 모두 curl 테스트 통과.

## 산출물

### 생성 파일
- `/home/jay/workspace/dashboard/components/NaverBlogView.js` (618줄, 프론트엔드 컴포넌트)

### 수정 파일
- `/home/jay/workspace/dashboard/server.py` (백엔드 API 3개 엔드포인트 + 헬퍼 함수 4개 추가)
- `/home/jay/workspace/dashboard/components/App.js` (탭 배열 + 렌더링 조건 추가)
- `/home/jay/workspace/dashboard/index.html` (NaverBlogView.js 스크립트 로드 추가)

## 구현 상세

### 백엔드 (server.py)
- `_load_naver_searchad_keys()`: .env.keys 파일에서 API 키 로드 (하드코딩 없음)
- `_naver_searchad_signature()`: HMAC-SHA256 서명 생성
- `_naver_searchad_keyword_tool()`: 네이버 키워드 도구 API 호출
- `_naver_blog_recommended()`: 검색량/경쟁도 기반 상위 5개 키워드 추천
- `_build_naver_blog_prompt()`: SEO/GEO 최적화 프롬프트 구성
- POST `/api/naver-blog/keyword-analysis`: 키워드 분석 (749개 연관 키워드 반환 확인)
- POST `/api/naver-blog/generate`: 프롬프트 생성 및 파일 저장
- POST `/api/naver-blog/competition-analysis`: 경쟁 분석 stub

### 프론트엔드 (NaverBlogView.js)
- StepIndicator: 3단계 진행 표시 (0→1→2)
- KeywordAnalysisStep: 키워드 입력 → 분석 테이블 → 순위 편집 → 확정
- BlogGenerateStep: 키워드 표시 + 추가 내용 입력 → 프롬프트 생성/미리보기
- CompetitionStep: 1순위 키워드 경쟁 분석 (현재 stub)

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **API 라우트 do_PUT 오삽입** — 팀원이 do_PUT 메서드 내에 삽입. do_POST로 이동하여 해결.
2. **프론트-백 데이터 필드 불일치 (results.keywords → results.results)** — 프론트엔드 4곳 수정.
3. **recommended 객체 vs 문자열 불일치** — 프론트에서 relKeyword 필드 추출하도록 수정.
4. **검색량 문자열 타입 오류** — 네이버 API가 "< 10" 등 문자열을 반환하여 _to_int() 안전 변환 추가.

### 범위 외 미해결 (1건)
1. **경쟁 분석 크롤링 미구현** — 범위 외 사유: 태스크 지시서에 stub으로 명시, 향후 크롤링 로직 별도 구현 예정.

## 테스트 결과

- `py_compile dashboard/server.py`: PASS (문법 에러 0건)
- POST `/api/naver-blog/keyword-analysis {"keyword":"보험"}`: 200 OK, 789개 키워드, 5개 추천
- POST `/api/naver-blog/generate`: 200 OK, 프롬프트 850자, 파일 저장 확인
- POST `/api/naver-blog/competition-analysis`: 200 OK, stub 응답 정상
- GET `/dashboard/components/NaverBlogView.js`: 200 OK
- 기존 대시보드 기능: `/dashboard/` 200 OK, 기존 탭 정상 로드

## 모델 사용 기록
- 토르 (백엔드): sonnet / server.py API 구현
- 프레이야 (프론트엔드): sonnet / NaverBlogView.js + App.js + index.html 구현
