10년간의 개인 재정을 일반 텍스트 파일로 관리한 기록

1 month ago 12

  • Beancount를 이용해 10년간 개인 재정을 일반 텍스트 파일로 기록하며, 약 45,000줄의 데이터와 10,000건의 거래를 관리
  • 매달 30~45분을 들여 은행 명세서 CSV 파일을 가져와 수동·자동으로 정리하고, 연도별 파일로 분리해 가독성을 유지
  • 독일 은행용 Python 기반 importer 라이브러리를 직접 개발해 Beancount와 연동, 일부는 현재도 유지 관리 중
  • Beancount 입문자의 어려움을 느껴 초보자용 입문서를 집필했으며, 커뮤니티에서 긍정적 평가를 받음
  • 모든 데이터가 자신의 로컬 기기와 Git 저장소에 보관되어, 특정 앱이나 서비스보다 지속성과 통제력이 높음

10년간의 Beancount 원장 구조

  • 2016년부터 Beancount로 재정 데이터를 관리해 왔으며, 총 45,011줄의 항목이 16개의 .beancount 파일에 저장
    • main.beancount 파일을 중심으로 연도별 파일을 include 방식으로 연결
    • 전체 거래는 약 9,895건, 그 안의 posting(분개) 은 19,743개
  • 1,086개의 계정(account) 이 존재하지만, 이는 실제 은행 계좌가 아닌 가상 분류 계정으로 구성
    • 예: 슈퍼마켓 지출, 수입, 구독 서비스 등 세부 항목별 계정 생성 가능
  • 507개의 PDF 문서가 거래에 첨부되어 있으며, 세금 신고 시 관련 영수증을 쉽게 확인 가능
  • 연도별 posting 수는 2016년 715건에서 2023년 2,651건으로 증가, 2023년이 가장 활발한 해로 기록

월별 관리 절차

  • 매달 약 30~45분을 투자해 은행 명세서를 CSV로 다운로드 후 Beancount에 가져오기
    • CSV는 PDF보다 파싱이 용이해 사용
    • Python 기반 importer가 CSV 데이터를 Beancount 형식으로 변환
  • 변환된 거래를 .beancount 파일에 추가 후, 이중부기 원칙에 따라 잔액이 0이 되도록 조정
    • 일부는 자동 분류, 일부는 수동 조정
  • 새해가 시작되면 이전 연도의 거래를 <year>.beancount 파일로 이동하고, main.beancount에 포함시켜 관리
  • 모든 거래 내역이 하나의 디렉터리 내 텍스트 파일로 정리되어 있음

독일 은행용 Beancount Importer 개발

  • Beancount는 기본적으로 은행 명세서 형식을 알지 못하므로, importer 클래스를 통해 변환 필요
  • 독일 은행 계좌를 사용하기 때문에 직접 여러 importer를 개발
  • 첫 세 라이브러리는 현재도 활발히 유지·사용 중

사용자에서 저자로

  • Beancount의 문서는 방대하지만, 초보자에게는 진입 장벽이 높음
  • 시행착오 끝에 익힌 경험을 바탕으로 입문서를 집필
    • personalfinancespython.com에서 공개
    • Beancount 공식 문서의 external contributions 페이지에 언급
    • 독자 리뷰에서 긍정적 반응을 얻음

마무리

  • 모든 재정 데이터가 Git으로 버전 관리된 로컬 텍스트 파일로 저장되어 있음
  • 데이터가 자신의 기기에 존재하고, 특정 앱이나 서비스에 종속되지 않음
  • Beancount 생태계의 도구를 활용해 자유롭게 분석 가능
  • 이러한 plaintext accounting 방식은 어떤 앱보다 오래 지속될 수 있는 강력한 재정 관리 형태

Read Entire Article