# task-1562.1 완료 보고서

## SCQA

**S**: 네이버 블로그 콘텐츠 워크플로우(키워드 분석→글 생성→경쟁 분석)가 구현되어 있으나, "글 생성" 단계에서 프롬프트만 생성하고 실제 AI 글 작성은 미연동 상태이며, 각 단계의 히스토리 저장/조회 기능이 없다.

**C**: 사용자가 글 생성 버튼을 누르면 프롬프트만 확인할 수 있고 별도로 Claude에 복사-붙여넣기해야 하며, 과거 분석/작성 이력을 조회할 방법이 없어 반복 작업이 발생한다.

**Q**: Sonnet API를 직접 호출하여 원클릭 글 생성을 완성하고, SQLite 기반 히스토리 저장/조회를 추가할 수 있는가?

**A**: Anthropic Sonnet API(claude-sonnet-4-6) 호출을 `/api/naver-blog/generate` 엔드포인트에 통합하고, SQLite DB(3개 테이블)로 키워드분석/글작성/경쟁분석 히스토리를 자동 저장하며, 프론트엔드에 생성 글 미리보기+복사 버튼과 히스토리 탭 UI를 추가하여 완료했다. py_compile 통과, pyright 신규 에러 0건.

## 작업 내용

### 기능 1: AI 글 생성 완성

**백엔드 (server.py)**:
- `import anthropic`, `import sqlite3`, `from anthropic.types import TextBlock` 추가
- `POST /api/naver-blog/generate` 수정: 프롬프트 생성 후 Anthropic Sonnet API 호출 → 생성된 글을 `content-{날짜}-{키워드}.md`로 저장
- API 키: `_load_env_key("ANTHROPIC_API_KEY")` 사용 (하드코딩 없음)
- 응답 변경: `{ status: "generated", generatedContent: "...", prompt: "...", savedPath: "..." }`

**프론트엔드 (NaverBlogView.js)**:
- "AI 생성은 추후 연동 예정" 경고 문구 제거
- 로딩 메시지: `"글을 작성 중입니다... (30초 이상 소요)"`
- 생성된 글 본문 미리보기 (max-h-500px 스크롤) + "복사" 버튼 (클립보드)
- CompetitionStep에 `generatedContent` (실제 AI 글) 우선 전달

### 기능 2: 히스토리 저장 + 조회

**SQLite DB**: `/home/jay/workspace/dashboard/data/naver_blog_history.db`
- `keyword_analysis` 테이블: 키워드 분석 결과 저장
- `blog_content` 테이블: 글 작성 결과 (프롬프트+생성글+파일경로) 저장
- `competition_analysis` 테이블: 경쟁 분석 결과 저장
- 서버 시작 시 `_init_blog_history_db()`로 자동 초기화

**백엔드 API**:
- `GET /api/naver-blog/history/keywords` — 키워드 분석 히스토리 목록 (최근 50건)
- `GET /api/naver-blog/history/contents` — 글 작성 히스토리 목록 (최근 50건)
- `GET /api/naver-blog/history/competitions` — 경쟁 분석 히스토리 목록 (최근 50건)
- `GET /api/naver-blog/history/{type}/{id}` — 상세 조회

**프론트엔드**:
- `HistorySection` 컴포넌트 신규 추가 (키워드분석/글작성/경쟁분석 3탭)
- 항목 클릭 시 상세 내용 펼침, 글작성 히스토리에서 "복사" 버튼 제공

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — 백엔드 AI 생성 + 히스토리 DB + API 추가
- `/home/jay/workspace/dashboard/components/NaverBlogView.js` — 프론트엔드 UI 업데이트

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **Pyright 타입 에러: `response.content[0].text` union type 접근** — `isinstance(content_block, TextBlock)` 타입 가드 추가로 해결
   - 상세: server.py:4329-4332, `from anthropic.types import TextBlock` import 추가
2. **"AI 생성은 추후 연동 예정" 문구 프론트/백 양쪽 잔존** — 백엔드 응답 메시지 변경 + 프론트엔드 amber 경고 박스 제거로 해결
3. **CompetitionStep에 prompt만 전달되던 문제** — `generatedContent || prompt` fallback 체인으로 수정

### 범위 외 미해결 (0건)
없음.

## 테스트 결과

- py_compile: PASS (문법 오류 없음)
- Pyright: 신규 에러 0건 (기존 dashboard import 경고 4건은 기존 이슈)
- 기존 API 엔드포인트(keyword-analysis, competition-analysis) 로직 무변경 (히스토리 저장만 추가, try/except 방어)

## 모델 사용 기록

- 토르 (백엔드): server.py 수정 / sonnet / -
- 프레이야 (프론트엔드): NaverBlogView.js 수정 / sonnet / -

## 비고

- ANTHROPIC_API_KEY가 `.env.keys`에 아직 등록되지 않음. 실제 사용 전에 키 등록 필요.
- Sonnet API 호출 시 timeout은 anthropic SDK 기본값 사용 (600초). 필요시 `timeout` 파라미터로 조정 가능.
- 히스토리 저장 실패는 메인 API 응답에 영향 없음 (silent fail)

## QC 자동 검증

```json
{
  "summary": "PASS (보고서 생성 후 재검증)",
  "pyright": "신규 에러 0건",
  "py_compile": "PASS",
  "file_check": "PASS"
}
```
