Beancount의 기술적 우위 vs. Ledger, hledger, 및 GnuCash
· 약 5분
개인 회계 시스템을 선택할 때는 성능, 데이터 구조, 확장성 사이에서 트레이드오프가 발생합니다. 엔지니어와 같은 기술 사용자는 가장 견고하고 예측 가능하며 프로그래밍 가능한 기반을 제공하는 시스템을 선호합니다.
자세한 비교 보고서를 바탕으로, Beancount와 인기 오픈소스 대안인 Ledger‑CLI, hledger, GnuCash의 기술적 세부 사항을 살펴보겠습니다.
속도와 성능: 정량적 벤치마크 🚀
진지한 데이터셋에서는 성능이 협상 불가입니다. Beancount는 수십 년 치 거래 데이터를 속도를 희생하지 않고 처리하도록 설계되었습니다. Python(v2)으로 구현되었음에도 불구하고, 고도로 최적화된 파서가 놀라울 정도로 효율적입니다.
- Beancount: 실제 사용 사례에서는 수십만 건의 거래를 약 2초 만에 로드 및 처리할 수 있습니다. 메모리 사용량도 적어, 100k 거래를 파싱할 때 수십 메가바이트 수준의 RAM만 사용합니다.
- 1M 거래 스트레스 테스트: 1백만 건 거래, 1,000개 계정, 1백만 개 가격 항목으로 구성된 합성 원장을 이용한 벤치마크에서 다음과 같은 차이가 드러났습니다.
- hledger (Haskell): 전체 파싱 및 보고서를 80.2초에 완료했으며, 초당 12,465건을 처리하고 2.58 GB RAM을 사용했습니다.
- Ledger‑CLI (C++): 복잡한 원장으로 인한 메모리·CPU 과다 사용 버그 때문에 40분 후에 프로세스가 강제 종료되었습니다.
- Beancount: 해당 1M 테스트에 포함되지는 않았지만, 기존 성능 곡선으로 볼 때 효율적으로 처리할 것으로 예상됩니다. 또한 곧 출시될 Beancount v3는 새로운 C++ 코어와 Python API를 도입해 처리량이 한 단계 더 향상될 전망입니다.
- GnuCash (C/Scheme): GUI 애플리케이션으로 전체 데이터를 메모리로 로드하기 때문에 규모가 커질수록 성능이 눈에 띄게 저하됩니다. **50 MB XML 파일(100k+ 거래)**을 여는 데 77초가 걸렸으며, SQLite 백엔드로 전환해도 55초로 약간만 개선되었습니다.
결론: Beancount는 예측 가능한 확장성을 갖춘 뛰어난 성능을 제공하므로 장기 데이터 관리에 필수적인 특성입니다. Ledger에서 나타나는 성능 절벽과 GnuCash UI 기반 지연을 회피할 수 있습니다.
데이터 구조: 평문 텍스트 vs. 불투명 데이터베이스 📄
시스템이 데이터를 저장하는 방식은 투명성, 이식성, 내구성을 결정합니다. Beancount는 인간이 읽기 쉬운 평문 텍스트 형식을 사용해 기술 사용자에게 최적화된 환경을 제공합니다.
- 컴팩트하고 효율적: 100,000건 거래가 포함된 Beancount 파일은 8.8 MB에 불과합니다. 이는 Ledger 파일(≈10 MB)보다 작으며, Beancount 문법이 거래의 최종 균형 금액을 추론해 중복을 줄이기 때문입니다.
- 구조적 강제: Beancount는
YYYY-MM-DD open Account
지시문을 명시적으로 요구합니다. 이 규칙은 계정명 오타가 새로운 잘못된 계정을 자동 생성하는 것을 방지해, Ledger·hledger와 달리 데이터 신뢰성을 높입니다. - 버전 관리 친화적: 평문 원장은 Git과 같은 버전 관리 시스템에 최적화되어 있어, 모든 재무 변경 내역을 완전하고 감사 가능한 형태로 기록할 수 있습니다.
- GnuCash와의 대비: GnuCash는 기본적으로
gzip
압축된 XML 파일을 사용하며, 각 엔티티마다 GUID가 포함된 태그가 늘어납니다. SQLite, MySQL, PostgreSQL 백엔드를 제공하지만, 이는 단순 텍스트 편집·버전 관리와 거리를 두게 합니다. 원시 XML을 편집할 수는 있지만 Beancount 파일을 편집하는 것보다 훨씬 번거롭습니다.
결론: Beancount의 데이터 형식은 단순 텍스트를 넘어 명확성을 극대화하고 정확성을 강제하며 git
, grep
등 개발자 도구와 자연스럽게 통합되는 정형 언어입니다.