Simple Bank — ระบบจัดการธุรกรรมและการโอนเงินจำลอง
โปรเจกต์ Backend จำลองระบบธุรกรรมธนาคาร พัฒนาด้วย Go (Golang) และ PostgreSQL เพื่อฝึกฝนทักษะ Backend เชิงลึก: การจัดการ Database Transaction แบบ ACID, การแก้ปัญหา Deadlock เมื่อมีคำสั่งโอนเงินพร้อมกัน (Concurrency), ระบบบัญชีคู่ (Double-entry Ledger) และความปลอดภัยด้วย PASETO Token

เทคโนโลยีที่ใช้
เกี่ยวกับผลงานนี้
Simple Bank เป็นโปรเจกต์ Backend Engineering ที่สร้างขึ้นด้วยภาษา Go (Golang) และ PostgreSQL โดยมีเป้าหมายหลักคือการฝึกฝนและทำความเข้าใจแก่นของการพัฒนาระบบ Backend ระดับ Production โดยเฉพาะระบบการเงินที่มีความอ่อนไหวสูงเรื่องความถูกต้องของข้อมูล (Data Consistency) และการรองรับคำสั่งพร้อมกันจำนวนมาก (High Concurrency)
🎯 เป้าหมายในการฝึกฝนและสิ่งที่ได้ลงมือทำจริง
-
การจัดการ ACID Transactions และแก้ปัญหา Deadlock:
- ออกแบบระบบโอนเงินผ่าน Database Transaction เพื่อให้แน่ใจว่าเงินถูกตัดและเพิ่มพร้อมกันอย่างถูกต้อง (Atomicity)
- แก้ปัญหา Cycle Deadlock จากการโอนเงินสวนทางกันพร้อมกัน (เช่น บัญชี 1 โอนให้ 2 ในขณะที่บัญชี 2 โอนให้ 1 พร้อมกัน) ด้วยเทคนิค Strict Consistent Lock Ordering โดยจัดลำดับให้ Transaction เข้าไปล็อก Row ของ Account ID ที่น้อยกว่าก่อนเสมอ ไม่ว่าจะโอนไปทิศทางไหน
-
ระบบบัญชีคู่ (Double-Entry Bookkeeping Ledger):
- บันทึกการเคลื่อนไหวของเงินลงในตาราง
transfersและentriesตามหลักการทางบัญชี ทุกยอดเงินเข้า-ออกมีประวัติที่ตรวจสอบย้อนหลังได้ (Audit Trail) โดยไม่มีการแก้ไขหรือลบยอดเงินเดิมโดยตรง
- บันทึกการเคลื่อนไหวของเงินลงในตาราง
-
ความปลอดภัยและการยืนยันตัวตนด้วย PASETO:
- เลือกใช้ PASETO (Platform-Agnostic Security Tokens) ที่ใช้ Symmetric Encryption (v2.local) ซึ่งมีความปลอดภัยสูงและลดช่องโหว่เมื่อเทียบกับ JWT ทั่วไป
- เข้ารหัสรหัสผ่านด้วย
bcryptและสร้าง Custom Auth Middleware ตรวจสอบสิทธิ์เจ้าของบัญชีอย่างรัดกุม
-
สถาปัตยกรรมโค้ดและการตรวจสอบข้อมูล (Clean Architecture & Validation):
- จัดโครงสร้างโค้ดแบบแยกเลเยอร์ชัดเจน: API Router/Handler, DB Store/Transaction, Token Maker และ Util
- สร้าง Custom Validator สำหรับตรวจสอบความถูกต้องของรหัสสกุลเงิน (Currency Validation เช่น USD, EUR, CAD) ในระดับ Request Payload
-
การทดสอบความถูกต้องและ Concurrency Test:
- เขียน Unit Test และ Concurrency Test ด้วย Go
testing+testifyโดยยิงคำสั่งโอนเงินคู่ขนานผ่าน Goroutines หลายรายการพร้อมกัน เพื่อพิสูจน์ว่ายอดเงินคงเหลือถูกต้อง 100% และไม่มี Race Condition
- เขียน Unit Test และ Concurrency Test ด้วย Go
-
DevOps & Database Migrations:
- รัน PostgreSQL ใน Container ด้วย Docker Compose
- จัดการ Version ของ Database Schema ด้วย
golang-migrateและรวมคำสั่งอำนวยความสะดวกไว้ในMakefile