Technical Debt — Nougat DevPay
검증된 코드 기준으로 정직하게 구분: ✅완료 / 🟡부분 / ❌미구현.
아키텍처
| 항목 | 상태 | 메모 |
|---|---|---|
| Repository Trait / UoW | ✅ | RepoOps trait(76연산) — Store::tx(&dyn RepoOps), audit/ledger도 포트 멤버. PgRepo가 동일 trait 구현으로 교체 가능성 입증. |
| Protobuf 자동생성 | ❌ | buf/protoc 미설치 — models.rs 수동 1:1 동기. 계약 drift 위험. 경로: prost-build build.rs + buf.yaml 연결. |
| PostgreSQL 어댑터 | 🟡 | PgStore/PgRepo — RepoOps 전체 구현(postgres crate, ?N→$N, RefCell<Transaction>). 컴파일+계약 완료, PG 서버 대상 실행은 PG_TEST_URL 게이트로 미검증. PG 전용 DDL 마이그레이션 경로 없음. |
| OTel / OTLP | 🟡 | X-Request-ID·/metrics 있음 — OTLP exporter 없음. |
| Outbox 디스패처 | ✅ | pending→completed/failed, attempts·last_error, 재시작 유실 없음. |
| Audit Retention/Legal Hold | ❌ | append-only는 있으나 retention·정정이벤트·무결성 해시 없음. |
| Ledger 분리 | ❌ | 감사와 거래 원장이 구분되지 않음 (outbox만 별도). |
보안
| 항목 | 상태 | 메모 |
|---|---|---|
| 실제 인증 제공자 | ❌ | Dev Auth는 Mock IdP — 운영은 X-Admin-Key만. OAuth 없음. |
| Resource Ownership | ❌ | 단일 seller 가정 — seller 간 격리·IDOR 검증 없음. |
| Rate Limiting | ✅ | IP별 100rpm, 429, RPM=0 opt-out. |
| Input validation | 🟡 | BE에서 금액·purpose·소속 검증 — 필드 길이·형식 검증 미흡. |
| Replay 방어 | 🟡 | 멱등키는 있으나 timestamp·nonce 서명 없음. |
데이터 정합성
| 항목 | 상태 | 메모 |
|---|---|---|
| Migration | ✅ | 버전 파일 001-005, apply() 러너, 오류 전파, 점진 업그레이드 테스트. |
| 백업/복구 | ❌ | 스크립트 없음 — SQLite 파일 복사 + WAL이 유일한 수단. |
| 동시 쓰기 | 🟡 | busy_timeout=5000 — 동시 쓰기 경합 측정 안 됨. |
테스트 커버리지 공백
- 게임 아이템 구매→지급→환불 브라우저 E2E (API 테스트는 있음)
- 라이선스·구독 화면의 실제 동작 검증 (Mock-only 표시 필요)
- 중첩 오버레이·ephemeral 외부 임베드 격리
- Docker 빌드·compose 기동 (데몬 부재로 미검증)
- DB Lock 경합·메모리·FE 초기 로딩 LCP 측정
운영 전 필수
- 실제 인증 제공자 (OAuth·JWT) — Dev Auth 완전 제거
- Resource Ownership — seller별 데이터 격리·IDOR
- Audit Retention·무결성 해시 체인
- PG 송금은 별도 법률·운영 검토 (현재 전부 Mock)
- Docker 빌드 검증 + HTTPS·백업 절차
2025-하드닝 세션 후 남은 부채 (P0 없음)
- [P1] PG Adapter — 구현됨, 잔여 작업 — PgStore/PgRepo RepoOps 전체 구현·contract test 게이트됨. 잔여: admin_backup만 raw Connection(VACUUM INTO — 엔진고유, PG면 pg_dump 경로), PG 서버 contract 실행 VERIFIED(postgres:16 컨테이너), PG 전용 DDL, sqlite↔pg 데이터 전환 절차. 읽기풀 read_pool=4로 병목 해소됨.
- [P1] Protobuf codegen — 완료(코드) / CI 잔여 — .proto→generated.rs→models.rs re-export 체인 완성, TS 타입(pbts) 생성물 있음. 잔여: buf breaking-change CI, FE가 생성 .d.ts를 실제 사용하도록 정리.
- [P1] OTel/OTLP — 구현됨 — opentelemetry-otlp batch exporter gRPC + TraceContextPropagator remote-parent. 잔여: collector 대상 end-to-end span 확인(환경 의존), metrics/logs exporter(traces만 구현).
- [P1] JWKS/세션 폐기 없음 — JWT는 단일 HS256 비밀. 키 로테이션·revocation 목록 필요.
- [P2] 구 FNV 감사 해시는 감지만 — 레거시 16자 해시는 재계산 스킵(하위호환), 체인 앵커 외부 checkpoint export 미구현.
- [P2] 동기 SQLite 잠금 — single
Mutex<Connection>은 write 경합 시 직렬화. WAL+pool 전환 여지. - [P2] Docker 로컬 미검증 — daemon 미기동으로 compose 실행은 CI docker-smoke job에 위임.
- [P2] paid feedback 미사용 결제 회수 — 문맥 변경 시 orphan payment 남음(미사용 상태로 안전하지만 정리 API 여지).