피드로 돌아가기
Dev.toDatabase
원문 읽기
Append-only Ledger 도입을 통한 무결성 보장 및 Balance Derived State 설계
How I built a billing system with a real double-entry ledger in Node + PostgreSQL
AI 요약
Context
기존 Billing 시스템의 Balance 변수 직접 수정(Mutation) 방식에서 발생하는 데이터 유실 및 추적 불가 문제 분석. 단순 수치 업데이트로 인한 중복 결제 처리 오류와 과거 데이터 수정 시 발생하는 연쇄적 정합성 붕괴를 해결해야 하는 상황.
Technical Solution
- Balance를 저장 데이터가 아닌 Derived State로 정의하여 모든 잔액을 LedgerEntry 합계로 재계산하는 구조 설계
- Immutable Row 기반의 Append-only Ledger를 구축하여 모든 금융 이벤트의 수정 및 삭제를 원천 차단
- Draft-first Posting 메커니즘을 통해
posted: false상태의 임시 데이터를 운영하고, Batch 확정 시에만 잔액에 반영하여 가역적 수정 환경 구현 - FIFO(First-In-First-Out) Settlement 로직을 적용하여 결제 금액을 가장 오래된 미납 청구서부터 순차적으로 할당하는 정산 체계 구축
- PostgreSQL CHECK 제약 조건을 통해 Debit/Credit 동시 발생을 차단하고 데이터베이스 레벨에서 불변성(Invariants) 강제
- Decimal 타입을 사용하여 부동 소수점 연산 오류를 방지하고 정밀한 금융 계산 보장
실천 포인트
- 잔액(Balance)을 컬럼으로 저장하지 않고 Ledger의 합계로 유도하고 있는가? - 모든 금융 트랜잭션을 Immutable한 행으로 기록하고 있는가? - 데이터 수정 시 원본을 고치는 대신 신규 행을 추가하거나 Batch Un-post 후 재계산하는 구조인가? - 금융 데이터 연산에 Float 대신 Decimal 타입을 적용했는가? - DB 제약 조건을 통해 애플리케이션 버그가 데이터 오염으로 이어지는 경로를 차단했는가?