# task-1608.1 완료 보고서: 이미지 생성 품질 개선 + Q/A Bold 실제 반영

## SCQA

**S**: InsuWiki 서비스에서 카카오 Q&A 문서는 QnaRenderer 컴포넌트로 표시되고, 이미지 생성은 Gemini API를 통해 image_router에서 수행된다.

**C**: (1) Gemini 이미지 생성 시 프롬프트 텍스트가 이미지 안에 그대로 렌더링되어 실제 이미지 대신 텍스트 카드가 출력됨. (2) task-1606.1에서 content 필드에 Bold 마크다운을 적용했으나, task-1591.1에서 추가된 QnaRenderer가 별도 question/answer 필드를 plain text로 렌더링하여 Bold가 보이지 않음. 추가로 content 섹션과 QnaRenderer가 동일 Q/A를 중복 표시.

**Q**: Gemini 이미지 품질을 개선하고 Q/A Bold를 인슈위키에서 정상 표시할 수 있는가?

**A**: (1) Gemini API에 systemInstruction을 추가하여 프롬프트 텍스트를 이미지 내에 렌더링하지 않도록 지시하고, image_router에서 비표준 프롬프트 래핑 로직 추가. (2) QnaRenderer에 `renderBoldText()` 유틸리티 추가하여 `**text**` → `<strong>` 변환 + 질문 텍스트 font-bold 적용. DocumentClient.tsx에서 Q/A 문서의 content 중복 렌더링 제거. pytest 65건 전체 통과, vitest 9건(기존7+신규2) 전체 통과.

## 수정 내용

### 수정 1: Gemini 이미지 생성 품질 개선

**파일: `/home/jay/workspace/tools/ai-image-gen/gemini_pro_generate.py` (line 94-105)**
- `_call_gemini_rest()` payload에 `systemInstruction` 블록 추가
- 모델에게 "프롬프트 텍스트를 이미지 내에 렌더링하지 말 것, 이미지 내 언급된 특정 텍스트만 자연스럽게 통합" 지시
- `responseModalities: ["IMAGE", "TEXT"]` 유지 (API 응답 형식 제어용)

**파일: `/home/jay/workspace/tools/ai-image-gen/image_router.py` (line 171-173)**
- `_generate_gemini()` 내부에서 프롬프트 래핑 로직 추가
- `create`/`generate`/`design`으로 시작하지 않는 프롬프트에 한해 이미지 생성 지시 접두사 추가
- 함수 시그니처 변경 없음 (로컬 변수 재할당)

### 수정 2: Q/A Bold 렌더링 + 중복 제거

**파일: `/home/jay/projects/insuwiki/nextapp/src/components/QnaRenderer.tsx`**
- `renderBoldText()` 유틸리티 함수 추가: `**text**` 패턴을 split하여 `<strong>` React 엘리먼트로 변환 (XSS 안전)
- 질문 텍스트: `font-medium` → `font-bold` + `renderBoldText()` 적용
- 답변 텍스트: `renderBoldText()` 적용

**파일: `/home/jay/projects/insuwiki/nextapp/src/app/docs/[id]/DocumentClient.tsx` (line 682-692)**
- Q/A 문서(sourceType=kakao_expert/kakao_community + question/answer 존재)에서 ReactMarkdown content 렌더링 및 "내용 없음" 안내 문구를 null 처리
- QnaRenderer와 content 섹션의 중복 Q/A 표시 제거

**파일: `/home/jay/projects/insuwiki/nextapp/src/components/__tests__/QnaRenderer.test.tsx`**
- `markdown bold(**text**)를 strong 태그로 렌더한다` 테스트 추가
- `bold 마크다운 없는 텍스트는 그대로 렌더한다` 테스트 추가

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **Q/A 콘텐츠 중복 표시** — QnaRenderer와 ReactMarkdown이 동일 Q/A를 각각 렌더링하는 문제. DocumentClient.tsx에서 Q/A 문서일 때 content 섹션 숨김 처리.
2. **QnaRenderer 질문 텍스트 가중치 부족** — `font-medium` → `font-bold`로 변경하여 질문 가독성 향상.
3. **Gemini 비표준 프롬프트 래핑 누락** — "create/generate/design"으로 시작하지 않는 짧은 한국어 프롬프트가 텍스트로 해석될 수 있는 문제. 프롬프트 래핑 로직 추가.

### 범위 외 미해결 (3건)
1. **pyright: image_router.py 로컬 모듈 import 미해결 (gcloud_auth, gemini_pro_generate 등)** — 범위 외 사유: 로컬 디렉토리 sys.path 동적 추가 방식의 기존 구조, 본 작업과 무관
2. **DocumentClient.tsx 미사용 변수 (DailyNoteButton, badgeClass, customName)** — 범위 외 사유: 기존 코드의 미사용 선언, 본 작업과 무관
3. **Gemini 이미지 실제 API 통합 테스트** — 범위 외 사유: API 키 + 네트워크 의존, 단위 테스트로 충분히 커버

## 테스트 결과

- Python (image_router): **65 passed** / 0 failed (0.18s)
- Vitest (QnaRenderer): **9 passed** / 0 failed (0.77s)
- 기존 테스트 회귀: 0건

## 산출물

- `/home/jay/workspace/tools/ai-image-gen/gemini_pro_generate.py`
- `/home/jay/workspace/tools/ai-image-gen/image_router.py`
- `/home/jay/projects/insuwiki/nextapp/src/components/QnaRenderer.tsx`
- `/home/jay/projects/insuwiki/nextapp/src/app/docs/[id]/DocumentClient.tsx`
- `/home/jay/projects/insuwiki/nextapp/src/components/__tests__/QnaRenderer.test.tsx`

## 모델 사용 기록

- 팀원: 토르(Thor) / 작업 내용: Gemini API systemInstruction 추가 + 프롬프트 래핑 / 사용 모델: sonnet / 정당성: -
- 팀원: 프레이야(Freyja) / 작업 내용: QnaRenderer Bold 지원 + DocumentClient 중복 제거 + 테스트 / 사용 모델: sonnet / 정당성: -

## 머지 판단
- **머지 필요**: No (worktree 미사용, 파일 직접 수정)
- **브랜치**: N/A
- **워크트리 경로**: N/A
