아키텍처 개요 (OPS_SPEC §3-3·§3-5 요약)
저장 4계층 — "유저가 느리다고 느끼면 안 된다"
L1 클라 로컬 (ETag·낙관적 표시 — 체감 지연 0)
→ L2 Cloudflare CDN (config·번들 — 오리진 요청 소멸)
→ L3 Redis = 운영 상태 주 저장소 (핫패스 완결, p95 <30ms)
→ L4 Aurora = 내구 원본 (원장·돈 경로 동기 + 상태 비동기 반영)
아웃박스 이벤트 파이프라인 (v6.0 — 원자성 보장)
[커밋 요청] → 유저 락(SET NX) → 멱등성 키 확인
→ Lua 원자 실행: 상한 검증(ARGV 주입) + 상태 갱신 + outbox:{userId} XADD
→ 즉답 (ack·corrections·badges)
[릴레이] outbox XREADGROUP → Kinesis PutRecords(재시도) → XACK+트림
→ 컨슈머: Aurora 반영 (30s 코얼레싱 upsert + currency_daily 누적) / S3 보존
장애 시: Redis 유실 → 레플리카 승격(AOF ≤1s) → 최악: 스냅샷+리플레이 (RPO 초 단위)
재화 중복·다중 커밋 방지 4겹 (§3-5 C)
1겹 유저 락 (SET NX PX 500 — 실패 = 즉시 409) 2겹 멱등성 키 (결과 24h 캐시 — 재실행 불가) 3겹 커밋 단조 seq + 버전 CAS (재시도 = 동일 seq·key·payload / 다른 key = 409) 4겹 DB 유니크 제약 (mail_claims·coupon·mission·transaction_id·ssv_nonces) +사후: 정합성 대사 배치 → 이중 지급 자동 플래그
DB 스키마 · ERD
ERD 관계도
users ──1:N──┬ player_state (1:1) ┬ inventory ┬ player_menus
├ player_staff ├ player_interior ├ player_collections
├ mission_progress ├ attendance ├ social_progress
├ currency_ledger(월파티션) + currency_daily(집계)
├ iap_receipts ── ssv_nonces(전역 디듀프) ├ ad_views(월파티션)
├ friends ⇄ (양방향 2행) ├ alba_visits └ cheat_flags
mail(글로벌 1행) ──lazy──▶ mail_claims(user×mail UNIQUE)
coupons ──▶ coupon_redemptions(user×coupon UNIQUE)
item_catalog ◀─참조─ mail.rewards / coupons.rewards / player_interior
campaigns ◀─연결─ mail·coupons·event_missions·ledger.ref_id
leaderboard_weekly (전역 — user_id 선두 예외 명단)
원본: docs/api-schema/db-schema.md
db-schema.md 로딩…
원장 Reason 코드 (단일 소스: reason-codes.json)
와이어·DB의 reason은 항상 숫자 ID. tier 2 = currency_daily 일 집계 (100·101·102 뿐), 나머지 = 원장 개별 행. ID 불변 — 신규는 JSON에 추가 후 사용.
reason-codes.json 로딩…
이벤트 포맷·타입: 아래 스키마 파일 탭의 events.md 참조
Redis 키 인벤토리
원본: docs/api-schema/redis-keys.md
redis-keys.md 로딩…
API 엔드포인트
원본: docs/api-schema/api-endpoints.md
api-endpoints.md 로딩…
스키마 파일 원문
events.md — 이벤트 계약
로딩…
commit.schema.json — 배치 커밋 (JSON Schema)
로딩…
README.md — 규격 규칙·게이트
로딩…
동기화 규칙
- 원본 = 레포
docs/api-schema/— 수정 후pwsh scripts/deploy-docs.ps1실행 (api-schema를 site로 복사 + 배포) - 이 페이지는 복사된 원본을 fetch 렌더 — 별도 HTML 수정 불필요 (기획서 본문 index.html과 달리 자동 동기)
- 기획 변경 = GDD 버전업 규칙 그대로 (CLAUDE.md)