1. 개발 방식
Claude Code와의 협업으로 진행했습니다. 두 개로 나뉘어 있던 기획서(웹 기반 v1, Flutter 기반 v2)를 하나로 통합하는 것에서 시작해, 백오피스 우선 구축 → 파이프라인 실연동 → 반복적인 실사진 테스트와 프롬프트 튜닝 → 비용 절감 검토 순으로 진행했습니다.
2. 인프라 분리 셋업 (2026-09-12)
기존 "가득율 관리 시스템"과 절대 연계되면 안 된다는 요구에 따라, 처음부터 완전히 독립된 인프라로 구성했습니다.
- git 브랜치
feature/grimilgi-app을main에서 새로 분기(기존 가득율 시스템의 작업 브랜치와 무관) - 별도 Vercel 프로젝트, 별도 Supabase 프로젝트
grimilgi.thinklab.life서브도메인 신규 연결- Google Gemini API 키도 별도 발급, Supabase Vault에 암호화 저장
3. 백오피스 우선 구축
프롬프트와 API 키가 자주 바뀔 것으로 예상해, 실제 파이프라인보다 관리 화면을 먼저 만들었습니다.
- 프롬프트 관리 — 1단계(분석)와 2단계(공통/사진유형/스타일/부정)를 분리해 버전 관리, 조합당 활성 버전은 항상 하나
- API 키 관리 — Supabase Vault에 암호화 저장, SECURITY DEFINER 함수로만 읽기·쓰기 허용, 1단계(분석)/2단계(이미지 생성) 용도 구분
- 테스터 관리 — 전화번호 화이트리스트 등록/비활성화
4. 소비자 파이프라인 구현
처음엔 Server Action을 동기로 호출해 검증한 뒤, "요청하고 결과 나올 때까지 기다릴 수 없다"는 피드백에 따라 Next.js after()로 비동기 전환했습니다 — 접수만 바로 응답하고, 실제 분석·생성은 응답 이후 백그라운드에서 처리합니다.
5. 반복 튜닝 (2026-09-12 ~ 09-14)
실제 사진으로 테스트하며 결과를 원본·참고 이미지와 직접 비교하는 방식으로 프롬프트를 여러 차례 고쳤습니다.
- 애니메/망가 화풍이 섞여 나오는 문제 → 영어 프롬프트 재작성, 네거티브 프롬프트에 "anime style" 명시 제외
- 배경이 인물과 뭉개지는 문제 → 배경을 완전히 그려달라는 지시 추가
- 인물 얼굴 표현 → 참고 이미지 기준으로 "귀여운 낙서"(둥근 얼굴, 점 눈, 블러셔) 스타일로 재작성
- 4개 스타일이 서로 비슷해 보이는 문제 → "컬러 유무 × 윤곽선 유무" 2축으로 스타일을 재설계하고, 사용자가 제공한 실제 참고 이미지를 기반으로 프롬프트를 다시 작성
- 색연필 스타일이 참고 이미지와 다르게 나오는 문제 → 사진유형(person) 프롬프트의 "얼굴 단순화" 지시가 모든 스타일에 공통 적용되며 스타일 자체 지시와 충돌하던 것을 발견, 해당 스타일 프롬프트에 우선순위 지시를 추가해 해결
6. 비용 절감 검토
- 이미지 생성 모델을 lite 버전으로 다운그레이드(출력 단가 절반)
imageSize실험 — "512", "2K" 모두 400 오류로 거부됨을 실기로 확인, 이 모델에서 동작하는 값은 "1K"뿐- Batch API 실기 테스트 — 공식 문서와 쿡북 예제가 서로 다른 이야기를 하고 있어(미디어 모델 지원 여부) 문서만으로는 판단이 안 돼, 관리자 도구를 만들어 직접 제출해 확인. 실제 이미지 모델이 배치를 지원하고, 평균 약 7분 30초에 처리되는 것을 확인(50% 할인 적용 여부는 청구서로 별도 확인 필요)
7. UX·관리자 도구 확장
- 홈 피드의 팝업식 이미지 확대를 인스타/틱톡 스타일 전체화면 스토리 뷰어로 교체
- 실패·거부된 그림일기가 화면에서 완전히 숨겨져 있던 문제를 발견해 "다시 시도해주세요" 카드로 노출
- 관리자용 4스타일 동시 비교 도구 — 스타일마다 개별 호출(4배 과금) 대신 2×2 그리드 1장으로 묶어 요청, 실행마다 히스토리(요청/결과 사진, 실제 전송 프롬프트)를 기록
- 에러 코드 체계 도입 — 백오피스는 원인 코드를 그대로 노출하고, 소비자 화면은 자연스러운 한국어 문구로 매핑
- 관리자 메뉴가 길어져 줄바꿈되던 문제를 좌측 사이드바(그룹별 펼침/접힘)로 재편