잔액을 저장하지 마세요! 결제 시스템이 원장(Ledger)을 쓰는 이유
·
공부방
"지금 잔액이 얼마인가?"이 질문에 답하는 방법은 두 가지입니다. 하나는 잔액을 컬럼에 저장해두고 읽는 것이고, 다른 하나는 거래 기록을 전부 더하는 것입니다.개발자로서 처음 드는 생각은 당연히 전자입니다. SELECT balance FROM account가 SELECT SUM(amount) FROM entries보다 빠르고 단순하니까요. 그런데 은행도, 카드사도, 결제 게이트웨이도 후자를 씁니다. 성능을 몰라서가 아닙니다.이 글은 그 이유에 대한 이야기입니다. 그리고 제 토이 프로젝트에 원장을 넣으면서, 원장을 만들었기 때문에 비로소 보인 구조적 결함 하나를 발견한 기록이기도 합니다.1. 잔액은 "상태"고, 원장은 "사실"이다차이를 한 문장으로 줄이면 이렇습니다.잔액은 덮어써지고, 기록은 쌓인다.bal..