Append-Only Ledger ๋์ ์ ํตํ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ ๋ฐ Rolling Expiry ๊ธฐ๋ฐ ๋ฆฌํ ์ ์ค๊ณ
I Built a Coin Ledger That Guilts Customers Into Coming Back ๐ง
AI ์์ฝ
Context
๋จ์ Balance ์ปฌ๋ผ ์ ๋ฐ์ดํธ ๋ฐฉ์์ ๋ฐ์ดํฐ ์ ์ค ์ํ๊ณผ ์ถ์ ๋ถ๊ฐ๋ฅํ ์ด๋ ฅ ๊ด๋ฆฌ ํ๊ณ๋ฅผ ์๋ณ. ๋จ์ ํฌ์ธํธ ์ง๊ธ๋ณด๋ค ์์ค ํํผ ์ฌ๋ฆฌ๋ฅผ ํ์ฉํ ๋ฆฌํ ์ ๊ทน๋ํ๋ฅผ ์ํด ๊ฐ๋ณ ์ด๋ฒคํธ ๋จ์์ ๋ง๋ฃ ๊ด๋ฆฌ๊ฐ ํ์ํ ์ํฉ.
Technical Solution
- Mutable Balance ๋ฐฉ์์์ Append-Only Ledger ๊ตฌ์กฐ๋ก ์ ํํ์ฌ ๋ชจ๋ ํธ๋์ญ์ ์ Audit Trail ํ๋ณด
coin_ledgerํ ์ด๋ธ ๋ดsource_ledger_id๋ฅผ ํตํ Earn-Redeem ๊ฐ์ Full Traceability ๊ตฌํ- DB ์์ค์
CHECK์ ์ฝ ์กฐ๊ฑด์ ํ์ฉํ์ฌ Earn/Bonus ์ด๋ฒคํธ์expiry_atํ์ ์ ๋ ฅ ๊ฐ์ ๋ฐ ๋น์ฆ๋์ค ๋ฃฐ ๋ณด์ฅ - PostgreSQL View์
FILTER์ ์ ์กฐํฉํ์ฌ 1์ผ, 7์ผ, 14์ผ ๋จ์์ Rolling Expiry ์ง๊ณ๋ฅผ ์ค์๊ฐ ์ฒ๋ฆฌ - Signed Numeric ํ์ ์ ์ ์ฉํ์ฌ ๋จ์ผ ์ปฌ๋ผ Summation๋ง์ผ๋ก ํ์ฌ ์์ก์ ์ฆ์ ์ฐ์ถํ๋ ๊ตฌ์กฐ ์ค๊ณ
์ค์ฒ ํฌ์ธํธ
1. ์์ก ๊ด๋ฆฌ ์์คํ ์ค๊ณ ์ Mutable ์ปฌ๋ผ ๋์ Append-Only Ledger๋ฅผ ์ฐ์ ๊ณ ๋ คํ๋๊ฐ
2. ๋น์ฆ๋์ค ํต์ฌ ์ ์ฝ ์ฌํญ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ด ์๋ DB Constraint๋ก ๊ฐ์ ํ๊ณ ์๋๊ฐ
3. ๋ฐ์ดํฐ์ ์์ฒ(Source of Truth)๊ณผ ์บ์(Cache)๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ์ ๊ธฐ์ ์ธ Reconciliation ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ถ์๋๊ฐ
4. ๋์์ฑ ์ ์ด๊ฐ ํ์ํ ํธ๋์ญ์ ๊ตฌ๊ฐ์ DB RPC(Stored Procedure)๋ก ์บก์ํํ์ฌ Race Condition์ ๋ฐฉ์งํ๋๊ฐ