ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
I Built a Coin Ledger That Guilts Customers Into Coming Back ๐Ÿง‡
Dev.toDev.to
Database

Append-Only Ledger ๋„์ž…์„ ํ†ตํ•œ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ ๋ฐ Rolling Expiry ๊ธฐ๋ฐ˜ ๋ฆฌํ…์…˜ ์„ค๊ณ„

I Built a Coin Ledger That Guilts Customers Into Coming Back ๐Ÿง‡

Akash Pattnaik2026๋…„ 6์›” 30์ผ17๋ถ„intermediate

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์„ ๋ฐฉ์ง€ํ–ˆ๋Š”๊ฐ€

์›๋ฌธ ์ฝ๊ธฐ