엔지니어링
왜 모든 잔액은 복식부기 원장에서 나와야 하는가
2026년 7월 27일 · 9 분 소요 · Coreza
모든 뱅킹 시스템에는 제품에서 가장 중요한 질문 — 이 고객은 돈이 얼마나 있는가 — 에 답하는 테이블이 있습니다. 신뢰할 수 있는 코어와 취약한 코어를 가르는 설계 결정은 그 숫자가 저장되는가 — 누군가 갱신하는 하나의 열인가 — 아니면 도출되는가 — 추가 전용 원장의 합계인가입니다. 구현 디테일처럼 들리지만, 이것이 바로 자신의 잔액을 증명할 수 있는 시스템과 그저 주장만 할 수 있는 시스템의 차이입니다.
이것은 핀테크 코어에서 가장 결과가 큰 아키텍처 결정이면서, 데모에서는 거의 보이지 않습니다. 두 제품이 화면에서는 똑같아 보여도, 하나는 잔액 열을 그 자리에서 덮어쓰고 다른 하나는 모든 잔액을 복식부기 원장에서 도출합니다. 그 차이는 나중에 드러납니다 — 대사 불일치에서, 아무도 설명하지 못하는 지원 티켓에서, 그리고 감사에서.
엔지니어링 관점에서 복식부기가 의미하는 것
복식부기는 5세기의 역사를 지녔지만, 뱅킹 백엔드에서는 회계상의 형식이 아닙니다 — 데이터베이스가 강제하는 불변식입니다. 모든 자금 이동은 최소 두 개의 분개를 가진 트랜잭션입니다. 한 계정이 차변에 기입되고 다른 계정이 대변에 기입되며, 분개의 합은 0이 됩니다. 돈은 UPDATE 문으로 생성되거나 소멸되지 않습니다. 계정 사이를 이동할 뿐이며, 그 이동 자체가 기록입니다.
고객 잔액은 그렇다면 하나의 투영입니다. 그 계정을 거치는 모든 원장 분개의 합계죠. 성능을 위해 캐시할 수는 있습니다 — 그러나 언제나 다시 계산할 수 있고, 그 재계산이 곧 진실입니다. 캐시와 원장이 어긋나는 일이 생기면 이기는 쪽은 원장이며, 그 어긋남 자체가 조사할 것이 있다는 신호입니다.
합계-0 불변식은 저장형 잔액 설계가 결코 제공할 수 없는 속성을 줍니다. 시스템 전체를 검산할 수 있다는 것입니다. 모든 계정 — 고객 지갑, 수수료 수익, 프로바이더 정산 계정, 가계정 — 의 모든 분개를 더하면 총합은 0입니다. 돈을 잃게 만드는 버그, 경쟁 상태, 부분 장애는 무엇이든 그 등식을 깨뜨리고 탐지 가능해집니다. 대개는 당일에.
저장된 잔액은 어떻게 어긋나는가
잔액 열 설계의 고장 방식은 극적이지 않습니다. 평범한 프로덕션 트래픽이 만들어내는 느린 표류입니다.
- 동시성: 두 건의 출금이 같은 순간 같은 잔액을 읽고, 둘 다 검사를 통과하고, 둘 다 기록합니다. 원장이 없으면 잔액이 원래 얼마였어야 하는지에 대한 기록이 남지 않습니다.
- 재시도와 부분 장애: 결제 프로바이더가 타임아웃되고, 클라이언트가 재시도하고, 입금이 두 번 들어옵니다 — 혹은 "잔액 갱신"과 "거래 기록" 사이의 크래시가 둘을 영구히 불일치 상태로 남깁니다.
- 수동 작업: 지원 엔지니어가 민원을 직접 UPDATE로 해결합니다. 고객은 만족하지만, 나타난 돈에는 출처가 없고, 어떤 보고서도 그것을 설명하지 못할 것입니다.
- 수수료와 반올림: 한 곳에서 계산되고 다른 곳에서 적용되는 수수료, 양쪽에서 다르게 반올림되는 환전 — 1센트의 조각들이 쌓여 실제 불일치가 됩니다.
원장이 강제하는 규칙들 — 전부 좋은 것들
도출형 잔액에 전념하면 코어의 나머지 부분에 규율이 부과됩니다. 이 제약들은 첫날에는 엄격하게 느껴지지만, 3년 차에 시스템이 여전히 정확한 이유가 바로 이것이었음이 드러납니다.
- 금액은 최소 단위의 정수 — 센트, 사토시, wei — 로 다루고 부동소수점은 절대 쓰지 않습니다. 이진 부동소수점은 0.10을 정확히 표현할 수 없습니다. 합이 0이 되어야 하는 원장을 얼추 맞는 숫자 위에 세울 수는 없습니다.
- 불변 분개: 기장된 분개는 절대 수정되거나 삭제되지 않습니다. 실수는 은행이 언제나 바로잡아 온 방식으로 바로잡습니다 — 오류와 정정을 모두 기록에 남기는 반대 분개로.
- 멱등성: 모든 작업이 키를 지니므로 재시도된 요청은 한 번만 기장됩니다. 원장은 중복을 드러나게 하고, 멱등성은 중복을 막습니다.
- 원자성: 차변, 대변, 비즈니스 상태 변경은 함께 커밋되거나 아예 커밋되지 않습니다. 원장 트랜잭션 밖에서 잔액을 갱신하는 코드 경로는 없습니다 — 관리자 조정도 포함해서요. 조정은 소리 없는 덮어쓰기가 아니라 평범하고 책임 소재가 분명한 분개가 됩니다.
대사: 바깥 세계에 대해 증명하기
내부 불변식은 시스템이 스스로와 일치함을 증명합니다. 대사는 시스템이 현실과 일치함을 증명합니다. 핀테크 코어는 외부 상대방 — 뱅킹 레일, 카드 프로세서, 블록체인 네트워크 — 과 포지션을 보유하며, 각자가 자기 버전의 진실을 갖고 있습니다. 일일 대사는 모든 프로바이더 명세서와 모든 온체인 포지션을 해당 원장 계정과 비교하고, 모든 차이에 설명을 강제합니다. 이동 중인 정산, 아직 기장되지 않은 프로바이더 수수료, 혹은 진짜 불일치 — 이 경우 당일에 가계정 분개와 담당자가 지정됩니다.
대사는 이 아키텍처가 본전을 뽑는 지점입니다. 복식부기 원장이 있으면 불일치는 범위가 한정된 탐색입니다. 나타난 날짜, 거쳐 간 계정, 관련된 분개. 저장된 잔액에서는 같은 조사가 이력 없는 숫자 하나에서 시작합니다 — 잔액 열 시스템의 미해결 대사 차이가 해결되기보다 상각 처리되는 경향이 있는 이유입니다.
암호자산은 판돈을 키웁니다. 온체인 잔액은 공개되어 있습니다. 누구든 당신이 통제하는 지갑과 당신이 고객에게 보여주는 잔액을 비교할 수 있습니다. 체인과 매일 대사하는 원장 없는 셀프 커스터디는, 회사 바깥의 누군가에게 발견되기를 기다리는 불일치일 뿐입니다.
감사인과 규제기관이 실제로 묻는 것
조만간 규제받는 핀테크는 같은 질문의 어떤 버전과 마주하게 됩니다. 고객 잔액이 정확하다는 것을 증명하라. 실무적인 답은 증거의 사슬입니다 — 모든 잔액은 추가 전용 원장에서 도출된다. 원장의 합은 0이다. 모든 외부 포지션과 매일 대사된다. 그리고 해시 체인으로 연결된 불변 감사 기록이 각 자금 이동을 누가, 어떤 기기에서, 어떤 승인 아래 개시했는지 기록한다.
저장형 잔액 설계 위에 만든 팀은 이 질문들에 포렌식으로 답하게 됩니다 — 애플리케이션 로그와 프로바이더 내보내기 자료에서 이력을 재구성하면서, 최악의 시점에, 기한에 쫓기며. 원장을 가진 팀은 쿼리 하나로 답합니다. 감사가 요건을 만들어내는 것이 아닙니다. 아키텍처가 처음부터 그 요건을 충족하고 있었는지를 드러낼 뿐입니다.
어떤 코어뱅킹 플랫폼에든 해 볼 테스트
플랫폼을 평가 중이라면 — 혹은 직접 만든 것을 점검 중이라면 — 이 질문들은 묻는 데 5분이면 충분하고, 답은 꾸며내기 어렵습니다.
- 고객 화면의 숫자는 어디에서 옵니까? 답이 원장의 투영이 아니라 잔액 열이라면, 나머지 전부는 장식입니다.
- 원장 분개를 만들지 않고 잔액을 바꿀 수 있습니까? 관리자 도구와 지원 워크플로우에 대해 구체적으로 물어보세요 — 소리 없는 UPDATE가 숨는 곳이 바로 거기입니다.
- 금액은 암호화폐 쪽을 포함해 끝에서 끝까지 최소 단위의 정수입니까?
- 어제의 대사를 보여주세요. 모든 프로바이더, 모든 체인, 모든 차이가 설명된 것으로요. 이것을 보여주지 못하는 플랫폼은 하지 않고 있는 것입니다.
- 잘못된 기장은 어떻게 정정됩니까? 유일하게 좋은 답은 특정 개인에게 귀속되고 승인 플로우를 거친 반대 분개입니다.
Coreza의 위치
Coreza는 이 설계의 엄격한 버전 위에 세워졌습니다. 모든 잔액 — 법정화폐와 암호화폐 모두 — 은 복식부기 원장에서 도출되고, 금액은 어디서나 최소 단위의 정수이며, 기장된 분개는 불변이고 정정은 메이커-체커 승인을 거친 반대 분개로 이루어지며, 각 인스턴스는 연결된 모든 프로바이더 및 운영 중인 모든 체인과 매일 대사합니다. 감사 기록은 추가 전용이고 해시 체인으로 연결되어, 각 자금 이동의 누가, 언제, 어디서를 기록합니다.
이 중 어느 것도 제품 데모에서는 보이지 않으며, 그것이 바로 이 글의 요지입니다. 원장은 코어뱅킹 플랫폼에서 화면을 들여다보는 것으로는 평가할 수 없는 부분입니다. 이 코어의 한 버전은 2024년부터 규제받는 유럽 핀테크에서 실제 고객과 실제 돈을 처리해 왔습니다 — 그리고 위의 다섯 가지 질문이야말로 저희 플랫폼을 포함해 어떤 플랫폼에든 던져 보시라고 권하는 질문입니다.