거래 8건을 더했는데 합계가 900, 870, 1,120으로 나옵니다. 첫 숫자는 구매 시점의 소비를 기록한 값이고, 둘째는 가계 전체에서 실제 현금이 나간 값입니다. 셋째는 두 기준을 섞어 자기 돈의 이동과 카드대금을 다시 더한 값입니다. 이 중 마지막 합계가 이번에 정한 규칙과 맞지 않습니다.

이 글의 거래와 금액은 설명을 위해 만들었습니다. 실제 계좌·가계 조사·절약 성과가 아닙니다. 작은 프로그램을 직접 실행해 각 거래 뒤의 현금과 카드 잔액을 대조했습니다. 단순 중복 집계와 기록 기간·범위가 달라 생긴 차이를 구별하는 것이 목적입니다.

더하기 전에 누구의 어느 돈인지 정합니다

처음에 은행 계좌에는 1,000, 현금 지갑에는 100이 있고 카드에 갚을 돈은 없습니다. 둘 다 같은 가계의 돈이므로 시작 현금은 1,100입니다. 은행에서 지갑으로 200을 옮기면 각각의 잔액은 바뀌지만 가계 전체 현금은 그대로입니다.

이번 소비 기록은 현금 구매는 지불할 때, 카드 구매는 구입할 때 적고 카드 환불은 해당 소비에서 빼는 방식입니다. 카드대금을 갚으면 현금과 기존 카드 채무가 함께 줄어들 뿐 같은 물건을 또 산 것은 아닙니다. 현금 흐름 기록에서는 실제 지급한 카드대금을 현금 지출로 셉니다. 이 글에서 정한 모형의 규칙이지 모든 가계부가 반드시 따라야 하는 회계 기준은 아닙니다.

미국 CFPB 도구 모음도 지출 기록·청구 달력·현금 흐름·채무 기록을 따로 제공합니다. 본문의 거래와 산식은 그 기관의 조사 결과가 아니라 자체 구성한 예시입니다. 현금 예산과 구매 시점의 소비 기록은 질문이 다르므로 합계가 항상 같을 필요가 없습니다.

거래 8건에서 현금과 카드 잔액이 움직이는 방향

현금 변화의 양수는 은행과 지갑을 합친 돈의 증가, 카드 채무 변화의 양수는 갚아야 할 잔액의 증가입니다. 숫자는 가상의 같은 통화 단위입니다. 내려받는 CSV와 코드는 이 단위의 100분의 1을 정수로 저장하므로, 표와 맞출 때는 금액을 100으로 나눕니다.

거래금액소비 기록가계 전체 현금 변화카드 채무 변화
T1 은행으로 수입 입금2,0000+2,0000
T2 은행에서 식료품 결제120120−1200
T3 은행에서 현금 지갑으로 이동200000
T4 카드로 물건 구입60600+60
T5 카드 잔액으로 환불10−100−10
T6 은행에서 카드대금 지급200−20−20
T7 은행에서 월세 지급700700−7000
T8 지갑에서 식비 지급3030−300

카드대금 20은 남은 채무가 보이게 정한 모형의 입력값입니다. 일부만 납부하라는 권유가 아닙니다. 이자·수수료·청구 주기·실제 최소 또는 전액 납부 조건은 넣지 않았습니다. 실제 납부 판단에는 자신의 청구서와 계약 조건이 필요합니다.

1,120에는 무엇이 220만큼 더 들어갔나

수입을 뺀 거래 금액을 모두 더하고 환불만 빼면 120 + 200 + 60 − 10 + 20 + 700 + 30 = 1,120입니다. 그런데 200은 가계 밖으로 나간 돈이 아니라 지갑으로 옮긴 돈입니다. 또 카드 구입 60을 소비로 적어놓고 그 대금을 갚은 20을 다시 소비에 더했습니다.

정한 소비 기준으로 합치면 120 + 60 − 10 + 700 + 30 = 900입니다. 두 값의 차이 220은 자기 돈의 이동 200과 카드대금 지급 20입니다. 항목을 더 잘게 나눈다고 이 범위 오류가 해결되지는 않습니다. 각 거래가 현금·소비·채무 중 무엇을 바꾸는지 먼저 나눠야 합니다.

반대로 현금 예산에 카드대금 지급을 넣고 카드 구입액은 그 현금 합계에서 제외하는 방식도 일관되게 쓸 수 있습니다. 문제는 현금 흐름을 기록하는 행위 자체가 아니라, 한 번의 구매를 구입과 납부 때 각각 새로운 구매처럼 합치는 것입니다.

현금 지급 870과 소비 900이 동시에 맞는 이유

실제 현금이 가계 밖으로 나간 거래는 T2·T6·T7·T8입니다. 120 + 20 + 700 + 30 = 870입니다. 카드에서는 구입 60에서 환불 10을 빼고 50이 남았고, 그중 20을 갚았으므로 채무 30이 남았습니다. 시작 카드 채무가 0인 이 예시에서는 현금 지급 870에 새로 남은 채무 30을 더하면 소비 900을 설명할 수 있습니다.

마지막 은행 잔액은 1,960, 지갑은 270입니다. 합계 현금 2,230에서 카드 채무 30을 빼면 이 원장에서의 순자산은 2,200입니다. 다른 방향으로도 맞춰볼 수 있습니다. 시작 순자산 1,100 + 수입 2,000 − 소비 900 = 2,200입니다.

현금 2,230이나 순자산 2,200이 그대로 자유롭게 쓸 돈이라는 뜻은 아닙니다. 아직 오지 않은 청구나 따로 확보해야 할 돈을 이 예시에 적지 않았기 때문입니다. 여기서는 정해둔 원장의 차이가 설명되는지만 확인합니다.

납부 한 건이 다음 달로 넘어가면

T6의 카드대금 지급을 다음 기록 기간으로 옮겨보겠습니다. 이번 기간에는 거래가 7건 남습니다. 소비는 여전히 900이고 현금 지급은 850, 합계 현금은 2,250, 카드 채무는 50이 됩니다. 순자산은 그대로 2,200입니다. 절약이 새로 생긴 것이 아니라 납부 시점이 옮겨갔고 갚을 돈이 남은 결과입니다.

세 번째 사례는 시작부터 이전 기간의 카드 채무 150과 현금 1,000이 있는 경우입니다. 그 채무를 150 갚으면 이번 기간의 새 구매는 0, 현금 지급은 150입니다. 현금은 850, 채무는 0이 되고 순자산 850은 시작과 같습니다. 현금이 안 나갔다고 적으면 필요한 지급을 숨기게 되고, 이번 기간에 새로 물건을 산 것처럼 적으면 이전 소비를 다른 기간에 옮겨 담게 됩니다.

저축 배정과 모르는 내역은 별도로 표시합니다

consumer.gov 예산 안내는 수입과 지출을 계획하며 저축도 예산의 배정 항목에 넣을 수 있다고 설명합니다. 목표를 위해 돈을 따로 확보하는 것과, 자기 계좌 사이의 이동을 소비라고 부르는 것은 다른 질문입니다. 생활비를 얼마나 배정했는지, 청구일에 현금이 있는지, 이번 기간에 무엇을 구입했는지 중 어떤 결과를 보려는지 적어두세요.

카드대금 납부만 있고 실제 구입 내역이 빠졌다면 이 코드는 무엇을 언제 샀는지 알아내지 못합니다. 소비가 0이라고 자동 처리하지 말고 미확인 내역으로 남겨 대조해야 합니다. 이번에는 처음부터 완성된 가상 원장을 만들었기 때문에 시점별 대조가 가능했습니다.

코드와 거절된 입력을 함께 확인하기

거래 CSV, Python 코드, 전체 실행 결과에 원장과 세 사례를 공개했습니다. Python 3가 이미 있다면 python3 ledger-check.py를 실행해 결과를 출력할 수 있습니다. 파일이나 계좌 연결을 읽지 않고 추가 패키지·네트워크도 필요하지 않습니다.

세 사례의 마지막 잔액을 미리 정한 기대값과 대조하고, 각 거래 뒤에도 순자산 변화가 수입과 소비로 설명되는지 검사했습니다. 잘못 바꾼 입력 8개도 확인했습니다. 모르는 거래 유형, 중복 ID, 음수 금액, 정수 최소 단위가 아닌 금액, 모르는 계좌, 같은 계좌로의 이체, 카드 초과 납부, 금액 누락을 거절했습니다. 카드에 돈이 더 들어간 상태나 계좌 초과 인출을 다루지 않는 것은 이 모형의 한계이며 실제 금융기관에서 그런 상태가 불가능하다는 주장이 아닙니다.

필요한 결과는 차이를 설명하는 기록입니다. 이 원장에서는 소비 900과 현금 지급 870이 각자의 질문에 맞는 값입니다. 둘을 섞은 1,120은 정해둔 어느 기준으로도 설명되지 않습니다.