← 목록으로

Reci 야간 작업 보고 — 성능 39% 감축 + 크레딧 가격 재설계 (8/24 새벽)

지시: "전체적으로 퍼포먼스 튜닝을 확실하게 해서 더 이상 버벅이는 일 없도록 전부 처리.
그 일이 끝나면 크레딧 금액 리서치를 해놓고, 어떻게 나눠 제공하는 게 맞는지까지 태스크를 완성해라."


0. 세 줄 요약

  1. 버벅임의 정체는 코드가 아니라 보고 계신 주소였다. dev.heyreci.com 은 개발 서버라 프로덕션보다 90~210배 느리다. 프로덕션 40개 라우트는 평균 0.19초다.
  2. 그래도 진짜 문제가 하나 있었다 — 모든 페이지가 지고 다니던 공용 JS 1,087KB. 이걸 660KB(-39%, 청크 23→6개) 로 줄였다.
  3. 크레딧 가격 문서는 전부 무효였다. 가격 버그 수정 전에 쓰여서 1회 생성이 160크레딧이던 시절 기준이다(지금 36크레딧). 다시 계산했고 두 가지 결함을 찾았다.

1. 성능 — 무엇이 문제였나

1-1. 보고 계신 게 개발 서버였다

페이지 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 링크를 드려서 느린 화면만 보시게 만들었습니다.

1-2. 전 라우트 전수 조사 (40개)

평균 응답 0.19초
1초 초과 2개
캐시 대부분 HIT

로그인 필요한 페이지는 307 리다이렉트로 정상 동작.
예외 3개(ai-headshot·naver-shopping-detail-page·pet-portrait)는 재요청에도 캐시 MISS → 배포 후 재확인 항목으로 남겼다.

1-3. 진짜 병목 — 공용 JS

HTML 이 60ms 에 와도 JS 를 다 받고 하이드레이션이 끝나야 버튼이 눌린다.
"클릭했는데 안 움직인다"의 정체가 이것이다.

가장 단순한 페이지(/legal/terms)가 받는 JS 를 재보니 청크 23개 / 1,087KB 였다.
콘텐츠가 거의 없는 페이지가 이만큼 진다는 건 모든 페이지가 같은 짐을 진다는 뜻이다.


2. 성능 — 무엇을 했나

수정 이유
헤더에서 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 인 것을 확인했다.

라우트별 First Load JS (새 빌드)

라우트
공용 (모든 페이지 공통) 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순위

3. ★ 제가 앞서 틀리게 말한 것 — 정정

"polyfills 109KB 가 초기 로드에 부담"은 틀렸습니다.

프로덕션 HTML 을 열어보니 이 스크립트에는 noModule 이 붙어 있습니다.
noModule낡은 브라우저만 실행합니다 — 모던 브라우저는 다운로드조차 하지 않습니다.
따라서 browserslist 추가는 이 부분엔 효과가 없습니다(다른 효과는 있어 되돌리지 않았습니다).


4. 일부러 안 건드린 것 — 판단 필요

images.unoptimized: true

Next 이미지 최적화가 전역 비활성입니다. 앱 썸네일 원본이 1344×768 인데 카드에선 400px 로 씁니다 — 원본을 그대로 내려받고 있습니다.

끄면 좋지만 두 가지가 걸립니다.

  1. 허용 목록에 우리 CDN 이 없어서 그냥 끄면 이미지가 전부 깨집니다
  2. Vercel 이미지 최적화는 변환 건당 과금입니다 — 비용이 생깁니다

밤중에 깨지면 손쓸 수 없어서 손대지 않았고, 켤 때 필요한 정확한 변경만 문서에 남겼습니다.


5. 크레딧 가격 — 기존 문서가 전부 무효였다

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배 저렴

장당 단가는 이제 문제가 아닙니다. 가장 빡빡한 비교에서도 우리가 쌉니다.
남은 문제는 최소 결제액뿐입니다.

찾은 결함 2개

① 계획했던 "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 (단조 감소)


6. 정해주셔야 하는 것

# 질문 안 정하면
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건)은 지시대로 뒤로 미뤘습니다.


7. 커밋

커밋 내용
7fe5f8b3 전역 번들에서 framer-motion 제거 + 배럴 import 정리
af483126 측정용 빌드를 별도 경로로 분리 (dev 서버 안 죽게)
1a14ba3a · 99aa8b3c 성능 전수 조사 문서 + 실측 결과
ea9895da 크레딧 가격 설계 문서

아직 배포는 안 했습니다. 성능 개선은 배포해야 실제 사용자에게 적용됩니다.