# task-865.1 완료 보고서: Satori HTML→SVG→PNG 이미지 생성 테스트

## SCQA

**S**: MktingAuto 광고 이미지 생성 방법 6가지(issue-040) 중 5번째 항목인 Satori(Vercel 오픈소스) 파이프라인이 미테스트 상태다. 기존 테스트된 방법은 Gemini Pro Image(25.4초), 하이브리드(~25초), HTML 캐러셀(~2초) 등이 있다.

**C**: Satori는 HTML/CSS→SVG 변환 후 resvg-js로 PNG 변환하는 로컬 실행 방식으로, AI API 호출 없이 무료·극속 생성이 가능할 것으로 예상되나 실제 성능 검증이 필요하다.

**Q**: Satori 파이프라인이 MktingAuto 카드뉴스/배너 템플릿 엔진으로 활용 가치가 있는가?

**A**: 3개 시나리오 테스트 결과, 전체 3장을 962ms(1초 미만)에 생성 완료. 한글 렌더링 100% 정확, 평균 파일 크기 229KB. 기존 방법 대비 속도 25배 이상 빠르고 비용 0원. 포토리얼리스틱은 불가하나, 카드뉴스/배너/SNS 광고 템플릿 엔진으로 최적합. MktingAuto 파이프라인 통합 강력 추천.

---

## 작업 내용

### Phase 1: 환경 구성
- 프로젝트: `/home/jay/workspace/tools/ai-image-gen/satori-test/`
- 패키지: satori, @resvg/resvg-js (ESM 모듈)
- 한글 폰트: Noto Sans CJK KR (Regular + Bold) → `fonts/` 디렉토리에 복사
- Node.js v24.14.0 환경

### Phase 2: 광고 이미지 생성 결과

#### 시나리오별 결과

**시나리오 A - 리크루팅 광고**
- 파일: `scenario-a-recruiting.png`
- 생성 시간: 558ms (초기화 포함)
- 파일 크기: 208,911 bytes (204.0 KB)
- 디자인: 밝은 블루 그래디언트 + 볼드 헤드라인 + CTA 버튼
- 한글 렌더링: 100% 정확

**시나리오 B - 브랜딩 광고**
- 파일: `scenario-b-branding.png`
- 생성 시간: 185ms
- 파일 크기: 210,631 bytes (205.7 KB)
- 디자인: 다크 배경 + 골드 악센트 + 럭셔리 타이포
- 한글 렌더링: 100% 정확

**시나리오 C - 전직 유도 광고**
- 파일: `scenario-c-career.png`
- 생성 시간: 219ms
- 파일 크기: 268,425 bytes (262.1 KB)
- 디자인: 다크+오렌지 그래디언트 + 초대형 볼드 텍스트
- 한글 렌더링: 100% 정확

**전체 생성 시간: 962ms (3장 합계)**

### Phase 3: 기존 방법 대비 비교

- **Gemini Pro Image**: 25.4초, 621KB, 프롬프트 준수도 최상, AI 생성 비용 발생
- **하이브리드(AI배경+HTML)**: ~25초, 텍스트 100% 정확, API 비용 발생
- **HTML 캐러셀**: ~2초, 텍스트 100% 정확, 무료, 디자인 단순
- **Satori (본 테스트)**: ~0.32초/장, 평균 229KB, 텍스트 100% 정확, 완전 무료

비교 요약:
- 속도: Satori가 **25~75배 빠름** (Gemini Pro 대비 79배, 하이브리드 대비 78배, HTML 캐러셀 대비 6배)
- 텍스트 정확도: 100% (HTML 기반 렌더링)
- 디자인 품질: CSS 그래디언트/타이포 기반으로 카드뉴스 수준 (포토리얼리스틱 불가)
- 비용: 0원 (로컬 실행, API 호출 없음)
- 재현성: 100% (동일 코드 = 동일 출력)
- 자동화 용이성: 최고 (코드 기반 템플릿, 변수 치환 용이)

### MktingAuto 파이프라인 통합 적합성

**적합한 용도:**
- SNS 카드뉴스/배너 대량 생성 (템플릿 + 변수 치환)
- 정기 콘텐츠 자동 생성 (스케줄링 + 코드 실행)
- A/B 테스트용 배너 변형 대량 생산
- 텍스트 정확도가 100% 필수인 광고 (한글 깨짐 0%)

**부적합한 용도:**
- 포토리얼리스틱 이미지 필요 시 (AI 이미지 생성 사용)
- 복잡한 일러스트/아트워크 (CSS 도형 한계)

**결론: 카드뉴스/배너 템플릿 엔진으로 Satori 도입 강력 추천**

---

## 생성/수정 파일 목록

### 신규 생성
- `/home/jay/workspace/tools/ai-image-gen/satori-test/package.json`
- `/home/jay/workspace/tools/ai-image-gen/satori-test/generate.js`
- `/home/jay/workspace/tools/ai-image-gen/satori-test/scenarios/recruiting.js`
- `/home/jay/workspace/tools/ai-image-gen/satori-test/scenarios/branding.js`
- `/home/jay/workspace/tools/ai-image-gen/satori-test/scenarios/career.js`
- `/home/jay/workspace/tools/ai-image-gen/satori-test/fonts/NotoSansCJKkr-Regular.otf` (복사)
- `/home/jay/workspace/tools/ai-image-gen/satori-test/fonts/NotoSansCJKkr-Bold.otf` (복사)

### 산출물 (이미지)
- `/home/jay/workspace/tools/ai-image-gen/output/v7-satori/scenario-a-recruiting.png` (204KB)
- `/home/jay/workspace/tools/ai-image-gen/output/v7-satori/scenario-b-branding.png` (206KB)
- `/home/jay/workspace/tools/ai-image-gen/output/v7-satori/scenario-c-career.png` (262KB)

---

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **Satori ESM 전용 모듈** — package.json에 `"type": "module"` 설정으로 해결
2. **Satori CSS 제한 (display: block 미지원)** — 모든 컨테이너에 `display: flex` 적용
3. **첫 실행 시 폰트 초기화 오버헤드 558ms** — 이후 실행 185~219ms로 캐시 효과 확인. 프로덕션에서는 폰트 프리로드로 완화 가능

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

---

## 셀프 QC 체크리스트

- [x] 1. 이 변경이 다른 파일에 영향을 미치는가? → No. 신규 디렉토리(`satori-test/`, `output/v7-satori/`)에만 생성. 기존 v1~v6 불변.
- [x] 2. 엣지 케이스: 긴 한글 텍스트 → 줄바꿈 정상, 빈 시나리오 → N/A (정적 템플릿)
- [x] 3. 작업 지시 일치: 3시나리오 생성, 1080x1080, v7-satori 폴더, 비교 분석 포함 ✅
- [x] 4. 에러 처리: generate.js에 try-catch + process.exit(1) 포함
- [x] 5. 테스트: `node generate.js` 실행 → 3장 모두 정상 생성, exit code 0
- [x] 6. 발견 이슈 3건 모두 자체 해결 완료

---

## QC 자동 검증

- **Overall: PASS** (5 PASS, 7 SKIP)
- file_check: PASS (보고서 5,759 bytes)
- data_integrity: PASS
- critical_gap: PASS
- spec_compliance: PASS
- duplicate_check: PASS (최대 유사도 10.4%)
- api_health/test_runner/tdd_check/pyright_check/style_check/scope_check/schema_contract: SKIP (Node.js 이미지 생성 테스트 작업, Python 코드 변경 없음)
