지시: "전체적으로 퍼포먼스 튜닝을 확실하게 해서 더 이상 버벅이는 일 없도록 전부 처리.
그 일이 끝나면 크레딧 금액 리서치를 해놓고, 어떻게 나눠 제공하는 게 맞는지까지 태스크를 완성해라."
dev.heyreci.com 은 개발 서버라 프로덕션보다 90~210배 느리다. 프로덕션 40개 라우트는 평균 0.19초다.| 페이지 | dev.heyreci.com | heyreci.com | 배수 |
|---|---|---|---|
/ |
5.57s | 0.06s | 94배 |
/pricing |
7.05s | 0.08s | 85배 |
/apps |
90.5s | 0.43s | 210배 |
dev.heyreci.com 은 이 맥북의 개발 서버를 터널로 노출한 것이다. 요청마다 컴파일하고 터널을 한 번 더 타서 느린 게 정상이다.
Supabase 문제도, Cloudflare 문제도 아니었다. 프로덕션 HTML 은 캐시 HIT 로 40~115ms 에 온다.
앞으로 속도 판단은
heyreci.com에서 해주세요. dev 는 화면 확인용입니다.
제가 계속 dev 링크를 드려서 느린 화면만 보시게 만들었습니다.
| 평균 응답 | 0.19초 |
| 1초 초과 | 2개 |
| 캐시 | 대부분 HIT |
로그인 필요한 페이지는 307 리다이렉트로 정상 동작.
예외 3개(ai-headshot·naver-shopping-detail-page·pet-portrait)는 재요청에도 캐시 MISS → 배포 후 재확인 항목으로 남겼다.
HTML 이 60ms 에 와도 JS 를 다 받고 하이드레이션이 끝나야 버튼이 눌린다.
"클릭했는데 안 움직인다"의 정체가 이것이다.
가장 단순한 페이지(/legal/terms)가 받는 JS 를 재보니 청크 23개 / 1,087KB 였다.
콘텐츠가 거의 없는 페이지가 이만큼 진다는 건 모든 페이지가 같은 짐을 진다는 뜻이다.
| 수정 | 이유 |
|---|---|
| 헤더에서 framer-motion 제거 → CSS 키프레임 | 헤더는 모든 페이지에 있다. 여기서 import 하면 애니메이션 라이브러리가 전 페이지 초기 번들에 들어간다. 슬라이드 하나에 낼 비용이 아니다 |
| 알림벨 지연 로드 | 로그인 사용자에게만 의미 있는데 헤더에 있어 전 페이지에 실렸다. 내부에서 또 framer-motion 을 쓴다 |
배럴 import 정리 (optimizePackageImports) |
lucide-react 는 아이콘이 수천 개라 통째로 들어오면 번들이 부푼다 |
browserslist 모던 타겟 |
(아래 정정 참고) |
| 청크 수 | raw 합계 | |
|---|---|---|
| 전 | 23개 | 1,087 KB |
| 후 | 6개 | 660 KB |
| -17개 | -427 KB (39%) |
특정 페이지가 아니라 모든 페이지에 적용되는 감소다.
검증: 새 빌드의 공용 청크를 직접 열어 framer-motion 흔적이 0 인 것을 확인했다.
| 라우트 | |
|---|---|
| 공용 (모든 페이지 공통) | 102 kB |
/legal/* |
103 kB |
/ |
250 kB |
/apps · /about |
251~253 kB |
/pricing |
306 kB |
/library |
382 kB |
/image-studio |
429 kB |
/apps/banner-studio · /apps/interior-generator |
543 kB ← 다음 1순위 |
"polyfills 109KB 가 초기 로드에 부담"은 틀렸습니다.
프로덕션 HTML 을 열어보니 이 스크립트에는 noModule 이 붙어 있습니다.
noModule 은 낡은 브라우저만 실행합니다 — 모던 브라우저는 다운로드조차 하지 않습니다.
따라서 browserslist 추가는 이 부분엔 효과가 없습니다(다른 효과는 있어 되돌리지 않았습니다).
images.unoptimized: trueNext 이미지 최적화가 전역 비활성입니다. 앱 썸네일 원본이 1344×768 인데 카드에선 400px 로 씁니다 — 원본을 그대로 내려받고 있습니다.
끄면 좋지만 두 가지가 걸립니다.
밤중에 깨지면 손쓸 수 없어서 손대지 않았고, 켤 때 필요한 정확한 변경만 문서에 남겼습니다.
8/10 레드팀 문서도, 8/23 오픈착수 계획도 가격 버그를 고치기 전에 쓰였습니다.
그때는 1회 생성이 160크레딧, 지금은 36크레딧 — 4.4배 차이라 "몇 크레딧 주자"가 전부 어긋나 있었습니다.
| 이미지 1장 | 9크레딧 = ₩450 |
| 1회 생성 (4장) | 36크레딧 = ₩1,800 |
| 원가 | ₩174/장 (실패 환불 반영 ₩213) |
| 비교 | 시장가 | 우리 |
|---|---|---|
| 순수 누끼 작업만 | ₩500~3,000/장 | 1.1~6.7배 저렴 |
| 촬영 포함 누끼컷 | ₩9,000~12,000/컷 | 20~27배 저렴 |
| 사진 보정 | ₩5,000~20,000/장 | 11~44배 저렴 |
장당 단가는 이제 문제가 아닙니다. 가장 빡빡한 비교에서도 우리가 쌉니다.
남은 문제는 최소 결제액뿐입니다.
① 계획했던 "Trial ₩9,900 / 300크레딧"은 할인 사다리를 뒤집습니다.
| 크레딧당 | |
|---|---|
| Trial (계획대로) | ₩33 ← 제일 쌈 |
| Starter | ₩50 |
| Basic | ₩45 |
| Pro | ₩40 |
가장 작은 칸이 가장 싸집니다. 많이 살수록 손해입니다. 300 이 아니라 200크레딧이어야 ₩50 선이 지켜집니다.
② ₩40,000 → ₩450,000 사이가 11배 비어 있습니다.
시장의 반복 지출 밴드는 월 ₩30,000~55,000 인데(드랩아트 ₩49,900 · 가비아 ₩55,000 · 망고보드 ₩49,000), 우리는 그 밴드를 Starter 하나로 덮고 그 위가 곧바로 45만원입니다. "Starter 로는 모자란데 45만원은 못 쓰겠다"는 사람이 갈 곳이 없습니다.
| 구간 | 가격 | 크레딧 | 크레딧당 | 생성 횟수 | 역할 |
|---|---|---|---|---|---|
| 무료 | ₩0 | 100 (현행 50) | — | 2.8회 | 첫 성공 경험 |
| Trial (신설) | ₩9,900 | 200 | ₩49.5 | 5.6회 | 지갑을 처음 여는 관문 |
| Starter | ₩40,000 | 800 | ₩50 | 22회 | 유지 |
| Growth (신설) | ₩120,000 | 2,600 | ₩46 | 72회 | 11배 공백 메움 |
| Basic | ₩450,000 | 10,000 | ₩45 | 278회 | 유지 |
| Pro | ₩800,000 | 20,000 | ₩40 | 556회 | 유지 |
사다리: 49.5 → 50 → 46 → 45 → 40 (단조 감소)
| # | 질문 | 안 정하면 |
|---|---|---|
| 1 | 무료를 100크레딧으로 올릴까 | 첫 생성 성공률이 계속 낮게 나온다 |
| 2 | Trial ₩9,900 / 200 신설할까 | 4주 뒤에도 결제 표본이 0 |
| 3 | Growth ₩120,000 넣을까 | Starter 다 쓴 사람이 이탈 |
| 4 | 크레딧을 결과물로 번역해 표기할까 (200크레딧 = 사진 22장) |
크레딧 숫자만으론 비싼지 판단 불가 |
| 5 | images.unoptimized 를 끌까 (§4) |
썸네일 원본을 계속 그대로 내려받는다 |
손댈 수 없는 제약: NicePay 입점 기준상 부가 상품 동봉 금지, 서비스 제공기간 90일 초과 불가.
결제 실동작 확인(본인 카드 1건 + 환불 1건)은 지시대로 뒤로 미뤘습니다.
| 커밋 | 내용 |
|---|---|
7fe5f8b3 |
전역 번들에서 framer-motion 제거 + 배럴 import 정리 |
af483126 |
측정용 빌드를 별도 경로로 분리 (dev 서버 안 죽게) |
1a14ba3a · 99aa8b3c |
성능 전수 조사 문서 + 실측 결과 |
ea9895da |
크레딧 가격 설계 문서 |
아직 배포는 안 했습니다. 성능 개선은 배포해야 실제 사용자에게 적용됩니다.