---
title: "✅ 충전식 가격·결제 시스템 구현 완료 보고 (W1~W11 전 범위 — PR#80 머지)"
category: "report"
document_type: "작업보고"
source_status: "generated"
knowledge_group: "00_current_state"
priority: "High"
purpose: "충전식 가격·결제 작업설계서(05-status/98) W1~W11 전 범위 구현 완료 기록. DB 스키마 61런·차감 신모델·구독관리 UI·단발/할증 UX·AI 원가레버(주입 효율화·Flash-Lite)·PG mock 배선·법무 조항까지. 무엇이 어디까지 동작하고, 사장님이 실행할 잔여 항목(SQL 2런·워커 시크릿·PG 행정)이 무엇인지의 기준 기록."
read_when: ["충전식","결제","구현완료","코치AI","구독관리","단발","할증","주입효율화","Flash-Lite","PG","payment-webhook","작업보고"]
updated: "2026-06-10"
work_timestamp: "20260610_234344"
context: "달록본레포CC (D:\\dallog\\dallog_git) — 작업설계서 workdesign_charge_pricing_v1.md 기반 구현. 사장님 논스톱 지시(임의 페이즈 분리 금지·PG mock 끝까지 배선·법무 표준 선집행). Codex 협업 검수 4루프. PR#80 squash 머지(main ce50cce)."
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# ✅ 충전식 가격·결제 시스템 구현 완료 보고

> **상위 문서** — 정책: 기획안_충전식가격결제정책(00_current_state) / 구현 명세: 작업설계서(05-status/98).
> **코드** — 달록 본레포 PR#80 (main `ce50cce`, 2026-06-10). 빌드 통과 · health recall 테스트 통과 · Codex 검수 4루프.

---

## 1. 무엇이 완성됐나 (비개발 해설)

### 💾 데이터베이스 (SQL 61런 — 59런 적용 완료 + 2런 적용 대기)
- **새 가격표** — 1단계 5,900 / 2단계 9,900 / 프리미엄(hidden) 24,900 / tier3 은퇴. 하루 제공량·월 상한·방당 턴캡·도구캡이 전부 설정값.
- **충전금 지갑·원장** — 실충전(선수금)과 쿠폰(판촉)이 분리된 지갑 + 고쳐쓸 수 없는(append-only) 거래 장부. 부호가 틀리면 DB가 거부.
- **차감 두뇌(consume_turn)** — 하루 할당 안은 자유(방캡 초과 시 할증=가속 소모), 소진되면 끝 → 단발 150원. 모든 검사·차감이 한 트랜잭션.
- **보안** — 클라이언트가 직접 사용량·잔액을 조작할 수 없게 막고(자기 쓰기 권한 제거), 모든 변경은 검증된 서버 함수로만.

### 🖥️ 화면
- **구독·충전금 관리**(/coach/subscription) — 플랜 현황·오늘/이번달 잔여·충전 잔액(실충전/쿠폰 분리)·충전(프리셋+자유입력)·환불 요청·자동충전/단발자동 토글(기본 꺼짐)·플랜 변경·해지·이용 이력.
- **두 안내 메시지(사장님 확정)** — ① 턴캡 도달: "새 대화 권장 + 이어가면 약 N배 소모" ② 오늘치 고갈: "단발 이용권(150원)으로 이어가기" 버튼 활성. 예고 프레임 없음 — 가부는 서버 설정(billing_phase)이 판정.
- **약관** — 충전금 조항 신설(제9~11조: 선수금 성격·만료 없음·언제든 전액 환불·자동결제 사전 고지). AI 위탁사에 Google(Gemini) 추가.

### 📉 AI 원가 절감 (W9 — 즉시 가동)
- **주입 효율화** — 같은 방에서는 운동기록 컨텍스트를 재조회하지 않고(룸 단위 캐시), 인사·일반 대화엔 초압축 여정만 주입. 데이터 질문에만 풀 블록. **입력 비용 35~60% 절감 추정**(베타 실측으로 확정).
- **Flash-Lite 라우팅** — 인사·기능안내만 경량 모델 후보로 보내되, 서버가 건강·데이터 키워드를 재검증(클라 신뢰 X). recall 테스트 누수 0건 통과. 끄기 레버: 워커 env `LITE_ROUTING_ENABLED='false'`.
- **출력 상한** — 일반 800 / 건강·분석 1,200 / 장문 리포트 3,000 토큰.

### 💳 결제 (W10 — mock으로 전 구간 배선 완료)
- mock 결제로 **충전 → 서버 검증 → 멱등 → 원장 → 잔액** 전 구간이 실코드로 구동·테스트 가능. 실서비스 전환은 **포트원 키 등록 + env 교체만**(코드 수정 0).
- `dallog-payment-webhook` 워커 신설·배포 — 결제 통지 서명 검증(HMAC) + 포트원 결제조회 재확인 + 원자 충전 함수 호출. 동시 통지에도 잔액 안 깨짐.

## 2. ⚠ 사장님 실행 항목 (순서대로)

1. **SQL 2런 적용(최우선)** — 가이드 HTML(RUN 29 플랜변경 결제가드 · RUN 30 원자충전 함수). **특히 RUN 29는 즉시** — 적용 전엔 베타에서 플랜변경 버튼으로 무결제 유료 전환이 이론상 가능(현재 사용자=지인 베타라 실위험 낮음).
2. **워커 시크릿 1개** — `cd workers/payment-webhook && wrangler secret put SUPABASE_SERVICE_ROLE_KEY` (mock 충전 테스트에 필요).
3. **결제 오픈 시점(사장님 결정)** — `billing_phase='billing'` 전환(SQL 1줄) + 포트원 계약 후 시크릿·env 교체 + `MOCK_ENABLED='false'`.
4. **행정** — PG(포트원) 가입·심사, 충전금 전용 통장 개설, 통신판매업 신고 확인. (법무 문서: 본레포 docs/legal/260610_충전금_법무회계_운영문서.md)

## 3. Codex 협업 검토 결과 (요약)

- **루프 4회** — ① SQL 사전 설계검토(30건) ② SQL 적대적 검수(8건) ③ 프론트 정합(6건) ④ W7~W11 최종(23건).
- **반영 주요** — self RLS 제거↔전 RPC DEFINER 전환·원장 부호 CHECK+append-only 트리거·surcharge 방캡 가드·포트원 서명 검증·customData 사용자 매핑·원자충전 SQL 함수(race 해소)·주입 캐시 race 가드·약관 위탁사 보강.
- **반려** — SQL "컬럼 주석 묻힘" Critical 2건(Codex 오독 — 실파일 정상 확인).
- **보류(사유)** — fallback 경로 Lite 미적용(cross-provider 시 무의미), Flash-Lite 단가 placeholder(공식단가 확인=DB값), mock 기본 ON(DB billing 가드가 2중 차단).

## 4. 미해결·후속

- 베타 실측 재보정: 할증 배수 밴드·무료 월캡(45~50)·Flash-Lite 단가 — 전부 설정값이라 SQL 1줄로 조정.
- 선결조건 잔여: Gemini 청구통화 실인보이스·최악 턴원가 — 베타 데이터/인보이스 확보 후. (통화 라벨 버그는 §5에서 해소됨.)

## 5. 잔여분 완결 추가분 (2026-06-11 — 설계자 검토 회신 + 사장님 추가지시 반영, PR#81·#82)

설계자 판정 "빌드분 수용·잔여 완료까지 종결 보류"에 따라 잔여 5건 + 사장님 신규지시(계좌인증·UI 정렬)를 같은 날 완결.

- **온보딩 부스트 프론트 배선** — 무료 신규가입자 7일/3세션·세션당 5턴 보너스가 실동작(기기 단위 1회·"환영 보너스" 배지·월 hard cap 가드).
- **환불계좌 1원 인증(신규지시)** — mock 모의 통장으로 전 구간(코드 발급→대조→인증 계좌 기록→미인증 환불 거부) 구현. 실 금융제휴 시 워커 env(ACCOUNT_VERIFY_PROVIDER)+키 교체만.
- **어드민 충전식 섹션** — 🅰선수금/🅱매출/🅒쿠폰 분리표시·예치계좌 대사 힌트·충전 전환 퍼널·어뷰징 모니터·재검토 트리거(§9 ⓐⓑⓒ). **통화 라벨 버그 해소**: estimated_cost(USD)를 ₩로 표시하던 것을 환율(FX_KRW_PER_USD=1524.8) 환산으로 정정.
- **사이드바·프로필 잔액(§4-2)** — 사이드바 플랜 배지+충전금(쿠폰 별도 칸)+프로필 '구독·충전금' 진입. 행 미생성 peek 조회(코치 미사용자 부작용 0).
- **UI 정렬(사장님 스크린샷)** — 충전 '기타' 버튼·자동 옵션 행 정렬 개편.
- **mock E2E 15/15 통과(A안)** — billing 전환→계좌인증(오답 거부 포함)→충전 1만원(멱등 재전송 차단)→단발 150원(원장·매출 분리 검증)→전액 환불→beta 복귀→가드 재확인. **E2E가 실제 런타임 버그(42702 — 지갑 RPC 3종 컬럼 모호)를 발견·수정**. 잔존 흔적=mster 원장 mock: 행(append-only 감사 기록).
- SQL 64런(61+계좌인증·fix 2)·전부 CC 직접 적용·검증. Codex 검수 1루프(Critical 2·High 3 반영, admin 함수 anon 권한 회수 포함).
- 브라우징 실화면: API-E2E + 라이브 번들 확인으로 검증(Playwright는 로컬 Chrome 프로필 충돌로 차세션 과제).

## 6. UI 정비 + 스튜디오 1클릭 발행 복원 (2026-06-11 후속, PR#83)

사장님 추가 지적(토글 정렬 미해결·모서리 조잡·스튜디오 회귀 의문) 처리분. Codex 회귀 집중 검수 1루프(High 1·Medium 2·권고 4 반영).

- **토글 정렬 근본 수정** — 직전 수정이 안 먹은 진짜 원인 발견: 전역 `input{width:100%}` 가 체크박스에도 적용돼 체크박스가 한 줄을 점유. 체크박스·라디오 전역 예외로 해결(전 사용처 11곳 회귀 없음 검증).
- **전역 모서리 2px 이하**(사장님 지시) — 디자인 토큰 3종(14/10/6→2px)+하드코딩+알약 배지 일괄. 예외 2곳만: 원형 요소(아바타·점)·동의 토글 스위치 트랙(기능성 외관 — Codex 지적).
- **스튜디오 카탈로그 보강** — 스튜디오 생성(5/30) 이후 화면(코치·구독관리·어드민·동의)이 쓰는 토큰 추가: 모서리 3종·테두리 2종·경고/위험색. 기본값 2px 동기화.
- **스튜디오 1클릭 커밋·푸시 라이브 복원** — 기능은 5/31(PR#12)에 존재했으나 dev 서버 전용이라 라이브에선 버튼 미렌더(회귀 아닌 구현범위 한정). `dallog-studio-publish` 워커 신설: 마스터 검증→GitHub Contents API 로 `studio-overrides.css` 만 커밋(경로 고정·64KB·409 재시도)→CF Pages 자동 배포. dallog.kr /studio 에서 버튼 1클릭=1~2분 내 전 사용자 반영(실커밋 검증).
- **GitHub 토큰 보안 교체** — 전체권한 gh 토큰 → fine-grained(달록 레포 1개·Contents RW만·무기한·Revoke 즉시 가능, 사장님 직접 등록). 워커 재검증 통과(비로그인 403·변경없음 판정).
