---
title: "📅 2026-06-10 (수) 작업일지 — 가입 온보딩 동의·소셜 OAuth 전용 흐름·충전식 가격·결제 시스템 W1~W11"
category: "devlog"
document_type: "개발일지"
source_status: "generated"
knowledge_group: "03_history"
priority: "High"
purpose: "2026-06-10 개발일지(갭 복원). OAuth 직후 표준 고객동의를 강제하는 온보딩 게이트와 동의 이력(필수4+마케팅), 자체 ID/PW 없는 소셜 OAuth 전용 로그인/회원가입/계정찾기 정리, 그리고 코치AI 충전식 가격·결제 시스템 W1~W11(지갑·원장·차감 신모델·구독관리·단발·PG mock·결제 webhook·AI 원가레버·약관 충전금 조항)을 PG 실키 교체 직전까지 구축한 흐름을 시간순으로 기록."
read_when: ["개발일지","갭복원","최신상태복구","2026-06","충전식","결제","동의","소셜OAuth"]
updated: "2026-06-10"
work_timestamp: "20260610_234500"
context: "달록본레포CC (D:\\dallog\\dallog_git) — 작업일지 갭 복원. 근거: git log·KB 작업보고·핸드오프."
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 📅 2026-06-10 (수) 작업일지

> **이 문서가 무엇인가 (비개발자용 한 줄 설명)**
> 이날은 두 가지 큰 일을 했다. ① 새 사용자가 소셜 로그인(구글·카카오·네이버 등) 직후 약관·개인정보 동의를 반드시 통과해야 앱에 들어올 수 있게 만들고, 자체 아이디/비밀번호 없이 소셜 로그인만으로 가입·로그인·계정찾기가 돌아가게 정리했다. ② 코치AI를 "충전식·구독식" 유료 모델로 바꾸는 결제 시스템의 뼈대(지갑·차감·구독관리·단발 이용권·결제대행 연결·약관 충전금 조항)를 결제대행사 실키만 끼우면 되는 직전 단계까지 구축했다.

---

## 0. 이날의 큰 그림

오전~오후 초반은 **가입 동의·로그인 흐름 정비**(PR#77~#79), 늦은 밤은 **충전식 가격·결제 시스템 W1~W11**(PR#80) 한 덩어리 작업이었다. 두 흐름 모두 달록의 일관된 운영 원칙 위에서 진행됐다.

- **본인인증 미도입 유지** — OAuth 신뢰 기반으로 계속 간다([[project_verification_policy]]). 결제 도입 시점에도 별도 본인인증은 붙이지 않았다.
- **변호사 자문 없는 표준약관·표준동의** — 법령·표준기관 가이드대로 표준약관과 표준 고객동의 시스템만 구성한다([[project_legal_no_lawyer_policy]]).
- **충전식 정책 본체는 B-라이트 확정안** — 무료0 / 1단계 5,900 / 2단계(주력) 9,900 / 히든 24,900(VAT 포함 KRW), 일일할당 자유책임 모델, 소진 시 단발 150, 충전금=선수금 분리회계([[project_pricing_charge_policy]]).
- **도구 호출 턴은 무차감** — 코치챗이 내부 도구를 호출하는 턴은 코칭 회를 깎지 않는다(원가만 로깅)([[project_coach_tool_turn_billing]]).

---

# 1부 — 가입 온보딩 동의·로그인 흐름 (오전~오후)

## 13:21 · PR#77 — 가입 온보딩 동의 + 동의 이력 / 로그인 브랜딩 복귀

`46248b7` (PR#77, 본커밋 `99ea648` + 브랜딩 `37cbefe`)

### 무엇을
- **`user_consent` 동의 이력 테이블 신설** — append-only(추가만 가능·변조 불가) 구조로, 동의 행위가 발생할 때마다 한 줄씩 쌓인다. 기존 행을 수정하지 않으므로 "언제 무엇에 동의했는가"가 영구 보존된다.
- **RLS(행 수준 보안) 본인만** — 각 사용자는 자기 동의 이력만 읽고 쓸 수 있다. 변조 금지 정책을 DB 차원에서 강제.
- **OnboardingConsent 게이트(가입 직후 통과 관문) 신설** — 동의를 마치지 않은 사용자는 앱 본화면 진입이 차단된다. OAuth 로그인은 성공했어도 동의 미완료면 온보딩 화면에 묶인다.
- **설정 > 계정 화면에 동의 이력·마케팅 토글 추가** — 사용자가 자기 동의 내역을 보고, 마케팅 수신 동의를 켜고 끌 수 있다.
- **로그인 브랜딩 복귀** — 타이틀을 "달록—PaceLog"로, 파비콘을 라임 컬러로 되돌렸다(`37cbefe`).

### 왜
- 정식 출시를 앞두고 **표준 고객동의 시스템**을 실제 가입 흐름에 강제할 필요가 있었다. 동의가 단발성 체크가 아니라 **이력으로 보존**되어야 분쟁·감사 대응이 가능하다(append-only).

### 결과
- 동의 미완료 사용자의 진입이 게이트에서 막히는 흐름 가동. 동의 이력은 변조 불가로 누적.

---

## 14:01 · PR#78 — 소셜 OAuth 전용 로그인/회원가입 흐름 + 약관 동의 강제(필수3)

`84274ef` (PR#78, 본커밋 `c8fbefa`)

### 무엇을
- **`SocialAuthInfoPage` 신설** — `/signup`·`/find-account` 경로를 소셜 OAuth 안내 페이지로 통합. 달록은 자체 ID/PW가 없으므로 "회원가입"·"계정찾기"도 결국 소셜 로그인으로 수렴한다는 사실을 안내한다.
- **`oauth_provider` 캡처** — 어떤 소셜 제공자(구글·카카오·네이버 등)로 들어왔는지 기록.
- **`postLoginRedirect` 도입** — 로그인 전 가려던 보호 경로를 로그인 후 복원하되, **open-redirect(외부 임의 URL로 튕기는 보안취약점) 차단** 로직을 함께 넣었다. 내부 경로만 허용.
- **네이버 state 검증 강화** — OAuth state 파라미터 검증을 강화해 CSRF성 위조 요청을 차단.
- **약관 동의 강제(필수 3항목)** — 이 시점 동의 항목은 필수 3개.

### 왜
- 자체 ID/PW 없는 **소셜 OAuth 전용** 구조를 사용자에게 명확히 안내하고, 로그인 리다이렉트의 보안 구멍(open-redirect)을 막기 위함.

### 결과
- `/signup`·`/find-account` 진입 시 소셜 OAuth 안내로 정리. 보호 경로 복원 + 외부 리다이렉트 차단.

---

## 14:32 · PR#79 — 동의 항목 조정(건강정보 별도동의 필수 재포함 + 마케팅 선택 추가)

`0b5a0db` (PR#79, 본커밋 `06e39c0`)

### 무엇을
- **건강정보(민감정보) 별도 동의를 필수로 재포함** → 필수 항목이 3개에서 **4개**로 늘었다.
- **마케팅(선택) 동의 추가** — 필수와 분리된 선택 항목.

### 왜
- 달록은 운동·건강 데이터를 다루므로 **건강정보는 민감정보**에 해당한다. 일반 개인정보와 묶지 않고 **별도 동의**를 받아야 한다는 표준 가이드를 반영. 마케팅은 강제할 수 없으므로 선택으로 분리.

### 결과
- 최종 동의 구성 = **필수 4 + 마케팅(선택)**. PR#77~#79를 거쳐 가입 동의 체계 확정.

---

# 2부 — 충전식 가격·결제 시스템 W1~W11 (늦은 밤)

## 23:43 · PR#80 — 충전식 가격·결제 시스템 W1~W11

`ce50cce` (PR#80, 본커밋 `b7c6a27`) · Codex 검토 4루프

### 무엇을 — 한 덩어리로 본 전체
B-라이트 가격 정책([[project_pricing_charge_policy]])을 실제 동작하는 시스템으로 옮기는 작업. SQL 7종 + 구독관리 UI + AI 원가레버 + PG(결제대행) mock 배선 + 결제 webhook 워커 + 약관 충전금 조항을, **결제대행사 실키만 끼우면 되는 직전 단계**까지 구축했다.

### W1~W11 작업 단위

| 단위 | 영역 | 무엇을 | 핵심 포인트 |
|---|---|---|---|
| **W1** | SQL·플랜표 | 플랜표(요금제 정의) 재시드 | B-라이트 4단계(무료0/5,900/9,900/24,900) 반영 |
| **W2** | SQL·지갑 | 지갑 + append-only 원장(거래내역) | 잔액은 원장 합산으로 도출, 거래는 추가만(변조 불가) |
| **W3** | SQL·쿠폰 | 쿠폰 테이블 | 프로모션·보정용 |
| **W4** | SQL·결제멱등 | 결제 멱등(idempotency) 처리 | 멱등=같은 결제 요청이 반복돼도 1번만 반영. 중복충전 방지 |
| **W5** | SQL·사용량 | 일 사용량 집계 | 일일할당 자유책임 모델의 소비 기준 |
| **W6** | SQL·차감 | `consume_turn` 신(新) 차감 모델 | 일/월/방(룸)/할증/단발을 통합한 차감 RPC. 도구턴 무차감([[project_coach_tool_turn_billing]]) |
| **W7** | SQL·온보딩 | 온보딩 부스트 | 신규 사용자 초기 사용량 부스트 |
| **W8** | SQL·매출뷰 | 매출 분리표시 뷰 | 충전금(선수금)과 실매출을 분리회계로 표시 |
| **W9** | AI 원가레버 | 룸 단위 memoize·조건부 티어·Flash-Lite 라우팅·출력상한 | 응답 품질 유지하며 원가 절감(룸 단위 캐시, 가벼운 요청은 저비용 모델·Flash-Lite로 라우팅, 출력 토큰 상한) |
| **W10** | PG 배선 | PG(결제대행) mock 어댑터 + `payment-webhook` 워커 | 서명검증 + 원자(atomic) 충전 RPC. webhook=외부 결제 이벤트 수신 콜백. 실키 없이 mock으로 끝까지 배선 |
| **W11** | 법무 | 약관 충전금 조항(제9~11조) | 충전금=선수금·만료없음·환불(실충전분만) 등 표준 조항 |

### UI — 구독관리·단발·전환 funnel
- **구독관리 페이지 `/coach/subscription` 신설** — 현재 요금제·잔액·거래내역·구독 상태를 한 화면에서 관리.
- **단발 이용권** — 일일할당 소진 시 단발 150(무료·유료 공통, 확인·취소 가능, 자동 OFF) 흐름.
- **턴캡 할증 경고** — 방당 캡 초과·할증 발생을 사용자에게 사전 경고(가중 소모 안내).
- **전환 funnel** — 무료→유료 전환 유도 흐름.

### 왜
- B-라이트 정책 본체는 확정됐으나([[project_pricing_charge_policy]]) 코드·DB·결제 배선은 미구현이었다. 실제 과금이 돌려면 **지갑·원장·차감·결제수신**이 한 묶음으로 필요하다.
- **mock으로 끝까지 빌드** — 외부 의존(PG 실키)은 아직 없어도 mock 어댑터로 webhook·원자충전까지 동작하게 만들어, 실키 교체만 남긴다([[feedback_no_self_phasing]] 원칙 — 임의 페이즈 분리·예고 프레임 UI 금지).

### 결과
- 충전식 가격·결제 시스템이 **PG 실키 교체 직전까지** 동작 가능 상태로 완성. Codex 4루프 검토 반영.

---

## 종합 — 이날 끝난 상태

| 영역 | 상태 |
|---|---|
| 가입 동의 | 필수 4 + 마케팅(선택), append-only 이력, OnboardingConsent 게이트 강제 |
| 로그인 흐름 | 소셜 OAuth 전용 정리, open-redirect 차단, 네이버 state 검증 강화 |
| 충전식 결제 | W1~W11 구축 완료, PG mock 배선 — **실키 교체만 남음** |
| 검토 | Codex 4루프 |

---

## 관련 페이지

- [[project_pricing_charge_policy]] — 충전식 정책 본체(B-라이트 확정안)
- [[project_coach_tool_turn_billing]] — 도구 호출 턴 무차감 모델
- [[project_verification_policy]] — 본인인증 미도입 유지
- [[project_legal_no_lawyer_policy]] — 변호사 자문 없는 표준약관·표준동의
- [[feedback_no_self_phasing]] — 임의 페이즈 분리·예고 프레임 UI 금지
- 관련 작업보고 #98 (충전식 가격·결제 구현완료), #100 (가입 온보딩 동의·소셜 OAuth 전용·로그인 브랜딩 복귀)
- 관련 핸드오프 #34 (가입 온보딩 동의·소셜 OAuth 전용·충전식 가격·결제 W1~W11 — 같은 백필로 신규 발행, work_timestamp 20260610_234300)

---

## 작업 리드타임

- 첫 커밋(PR#77 본커밋 `99ea648`): 2026-06-10 13:20:22
- 마지막 커밋(PR#80 머지 `ce50cce`): 2026-06-10 23:43:03
- 경과(이날 작업 구간): 약 10시간 23분 (오전 가입 동의 → 늦은 밤 충전식 결제 W1~W11)

---
