---
task_id: task-2225
type: context
scope: task
created: 2026-04-27
updated: 2026-04-27
status: in-progress
---

# 맥락 노트: task-2225

**task**: task-2225

---

## 결정 근거

### 3 Step Why 자문

**1st Why: "왜 이 설계가 필요한가?"**
→ 기존 Edge Function generate-image가 GOOGLE_AI_API_KEY 미설정으로 동작하지 않음. 서버 사이드로 전환하면 API 키 관리가 서버 환경변수로 일원화되고, 플랜별 차등 이미지 품질을 제공할 수 있음.

**2nd Why: "왜 서버 사이드 전환이 최선인가?"**
→ 이미 generate-content 엔드포인트가 서버로 이전 완료됨. 동일 패턴(JWT + 플랜 검증 + 큐 시스템)을 재사용하면 코드 일관성 유지. Edge Function은 환경변수 관리가 어렵고 디버깅도 제한적.

**3rd Why: "왜 플랜별 3단계(Satori/Gemini/Hybrid)가 다른 대안보다 나은가?"**
→ 대안1: 모든 플랜에 Gemini만 제공 → 비용 폭증 (무료 사용자에 AI 이미지 생성 비용 부과 불가).
→ 대안2: 모든 플랜에 Satori만 제공 → 프로 이상 사용자의 기대 불충족 (포토리얼 이미지 불가).
→ 3단계 차등: 비용 0인 Satori를 무료/베이직에, AI 이미지를 프로 이상에 제공하여 비용/가치 균형 달성.

### Satori 접근 방식
- Node.js subprocess로 satori-render.js 호출
- @resvg/resvg-js로 SVG → PNG 변환
- 한글 폰트 내장 (NotoSansCJK)

## 참조 자료

- InsuRo 서버: `/home/jay/projects/InsuRo/server/main.py`
- 기존 이미지 패널: `/home/jay/projects/InsuRo/src/components/ImageGeneratorPanel.tsx`
- 서비스 계정: `/home/jay/.config/gcloud/service-accounts/insuwiki-j2h-fa603f4f75f5.json`

## 주의사항

- main.py가 4000줄+ 대형 파일 → Edit 시 offset/limit 필수
- Gemini Vertex AI는 서비스 계정 활성화 필요 → 이번 작업에서는 스텁 구현
- satori npm 패키지 설치 여부 확인 필요
