# task-1602.1 완료 보고서

## SCQA

**S**: 대시보드의 네이버 블로그 기능에서 히스토리 상세 보기와 이미지 생성 API 2가지 기능이 운영 중이다.

**C**: (1) 히스토리에서 글작성 항목 클릭 시 생성된 블로그 글만 표시되고, 저장 경로·프롬프트·이미지 생성 섹션이 누락되어 글 작성 화면과 불일치. (2) "이미지 생성" 클릭 시 400 에러 발생. 원인: 프론트엔드가 `{prompts: [{type, description}]}` 형태로 요청하나, 백엔드가 `descriptions` 키만 처리하여 빈 배열로 판정 → 400 반환.

**Q**: 히스토리 상세를 글 작성 결과 화면과 동일하게 표시하고, 이미지 생성 400 에러를 해결할 수 있는가?

**A**: (1) `HistoryPromptPreview`/`HistoryImageSection` 2개 서브 컴포넌트 신설 + HistorySection 상세 영역 확장으로 저장 경로, 프롬프트(접기/펼치기), 이미지 생성(편집+생성+폴링+다운로드) 전체 표시 구현. (2) POST 핸들러에서 `prompts`/`descriptions` 양쪽 모두 수용하도록 수정 + `_generate_blog_images` 함수가 type별 purpose 매핑(photo→"광고", infographic→"인포그래픽")으로 image_router에 전달. python syntax check 통과.

## 수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — 백엔드 이미지 생성 API 수정
- `/home/jay/workspace/dashboard/components/NaverBlogView.js` — 프론트엔드 히스토리 전체 뷰 구현

## 상세 변경 내역

### server.py 변경

1. **`_generate_blog_images()` 함수** (line 912): 시그니처 `descriptions: List[str]` → `image_items: List[dict]` 변경. 각 항목에서 `type`/`description` 추출, type별 purpose 매핑 딕셔너리 추가 (photo→"광고", infographic/comparison_table/checklist/chart/process_flow→"인포그래픽"), Claude CLI 프롬프트도 type에 따라 photorealistic/infographic 분기.

2. **POST `/api/naver-blog/generate-images`** (line 4895): `prompts_raw = body.get("prompts", [])` 추가. 우선순위: prompts 있으면 `[{type, description}]` 변환 → 없으면 descriptions 폴백 (하위호환) → 둘 다 없으면 400 에러.

### NaverBlogView.js 변경

1. **`HistoryPromptPreview` 컴포넌트** (line 1235): 접기/펼치기 토글로 prompt_text 표시.

2. **`HistoryImageSection` 컴포넌트** (line 1252): `parseImagePrompts`/`parseImageDescriptions`로 이미지 프롬프트 파싱, 편집 가능 textarea, 이미지 생성 API 호출, 2초 폴링 상태 확인, 이미지 그리드/다운로드/전체 ZIP 다운로드.

3. **`HistorySection` 내 contents 탭 상세** (line 1482-1516): 4개 섹션으로 확장 — 블로그 글(기존+개선) + 저장 경로 + 프롬프트 미리보기 + 이미지 생성.

## 발견 이슈 및 해결

### 자체 해결 (1건)
1. **이미지 생성 400 에러** — 프론트엔드 payload 형태(`prompts`)를 백엔드가 미지원. POST 핸들러에 `prompts` 키 처리 로직 추가로 해결.

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

## 셀프 QC 체크리스트

- [x] 1. 영향 파일: server.py, NaverBlogView.js (2개)
- [x] 2. 엣지 케이스: 빈 prompts/descriptions 배열, dict 아닌 prompts 항목, file_path/prompt_text 없는 히스토리 레코드 → 모두 처리됨
- [x] 3. 작업 지시 일치: 히스토리 전체 뷰 ✅, 이미지 생성 400 에러 ✅
- [x] 4. 에러 처리/보안: 입력 검증 완료, dangerouslySetInnerHTML은 기존 패턴 유지
- [x] 5. 테스트: 관련 직접 테스트 파일 없음 (dashboard/tests/test_server.py는 범용)
- [x] 6. 발견 이슈 모두 해결: 1건 해결 완료
- [x] 7. 코드 아키텍처: SOLID/DRY 위반 없음. 기존 패턴(BlogGenerateStep) 재사용
- [x] 8. 인터페이스 변경: API 하위호환 유지 (descriptions 형태 그대로 동작)
- [x] 9. 이미지/배너: 해당 없음

## 모델 사용 기록

- 팀원: 불칸(백엔드) / 작업: server.py 이미지 생성 API 수정 / 모델: sonnet
- 팀원: 이리스(프론트엔드) / 작업: NaverBlogView.js 히스토리 전체 뷰 구현 / 모델: sonnet
