Beancount 생태계: 종합 분석
Beancount의 핵심 기능과 철학
Beancount는 일반 텍스트 파일을 사용하여 거래를 기록하는 오픈소스 복식 부기 회계 시스템입니다. 핵심적으로 Beancount는 당신의 원장을 단순하고 엄격한 문법으로 정의된 _데이터셋_으로 취급합니다. 모든 금융 이벤트(거래, 계좌 개설, 상품 가격 등)는 텍스트 파일의 지시어(directive)이며, Beancount는 이를 파싱하여 인메모리(in-memory) 데이터베이스의 항목으로 변환합니다. 이 설계는 복식 부기 원칙을 강제합니다: 모든 거래는 계좌 간의 차변과 대변이 균형을 이루어야 합니다. 그 결과, 버전 관리가 가능하고, 쉽게 검사하고 질의할 수 있는 매우 투명하고 감사 가능한 원장이 만들어집니다.
철학 – 정확성과 미니멀리즘: Beancount의 설계는 데이터 무결성과 단순성을 우선시합니다. 개발자인 마틴 블레이스(Martin Blais)는 Beancount가 사용자가 실수를 할 것이라고 가정하는 "비관적(pessimistic)"인 태도를 취하며, 따라서 추가적인 검사와 제약을 부과한다고 설명합 니다. 예를 들어, Beancount는 한 번도 추가된 적 없는 자산을 제거하는 것을 허용하지 않으며(마이너스 주식 보유나 현금 잔액 방지), 모든 계좌가 사용 전에 개설되도록 강제할 수 있습니다. Ledger의 "가상(virtual)" 또는 자동 균형 조정 전기(posting) 개념이 없는데, 이는 완전하게 균형 잡힌 항목을 강제하기 위한 의도적인 선택입니다. Beancount는 기본적인 복식 부기가 제공하는 것보다 더 많은 교차 검증을 통해 정확성에 대해 매우 엄격한 입장을 취합니다. 이러한 신중한 접근 방식은 "자기 자신을 너무 신뢰하지 않고" 소프트웨어가 자신의 실수를 잡아주기를 원하는 사용자들에게 매력적입니다.
최소한의 옵션, 최대한의 일관성: Ledger의 수많은 커맨드 라인 플래그와 튜닝 옵션과는 대조적으로, Beancount는 미니멀리즘을 선택합니다. 전역 옵션은 거의 없으며, 원장 파일 외부에서 거래의 의미를 변경하는 옵션은 전혀 없습니다. 회계에 영향을 미치는 모든 설정(예: 상품 원가 기준법이나 예약 가정)은 파일 내 지시어나 플러그인을 통해 이루어지므로, 보고서가 어떻게 생성되든 동일한 파일을 로드하면 항상 동일한 결과가 나옵니다. 이 설계는 Ledger의 많은 설정과 그들 사이의 미묘한 상호작용의 복잡성을 피합니다. Beancount의 철학은 회계 도구가 입력 파일에서 보고서까지 _안정적이고 결정론적인 파이프라인_이어야 한다는 것입니다. 이는 원장을 순차적으로 프로그래밍 방식으로 처리할 수 있는 지시어의 순서 있는 스트림으로 취급함으로써 달성됩니다. Ledger가 특별한 구문으로 취급하는 것들(예: 기초 잔액이나 가격 명세)조차도 Beancount의 데이터 모델에서는 일급 지시 어이므로, 시스템의 확장성이 매우 높습니다.
플러그인과 쿼리 언어를 통한 확장성: Beancount는 Python으로 구현되었으며, 처리 파이프라인에 사용자 정의 로직을 주입할 수 있는 훅(hook)을 제공합니다. 사용자는 Python으로 플러그인을 작성하여 거래 스트림에 작용하게 할 수 있습니다(예: 사용자 정의 규칙을 강제하거나 자동 항목을 생성). 이 플러그인들은 파일이 처리될 때 실행되어, 소스 코드를 수정할 필요 없이 Beancount의 핵심 기능을 효과적으로 확장합니다. Beancount에는 또한 원장을 분석하기 위한 강력한 쿼리 언어(SQL에서 영감 받음)가 포함되어 있습니다. bean-query
도구는 파싱된 원장을 데이터베이스로 취급하고, 분석적인 쿼리를 실행할 수 있게 해줍니다. 예를 들어, 카테고리별 비용을 합산하거나 특정 수취인에 대한 모든 거래를 추출할 수 있습니다. Beancount 3.x에서는 이 쿼리 기능이 독립적인 beanquery
패키지로 옮겨졌지만, 사용자 관점에서는 여전히 SQL과 유사한 쿼리를 통해 유연한 보고를 제공합니다.
일반 텍스트와 버전 관리: 일반 텍스트 회계 도구로서, Beancount는 _사용자 제어_와 데이터의 장기 보존을 강조합니다. 원장은 단순히 어떤 텍스트 편집기에서나 편집할 수 있는 .beancount
텍스트 파일입니다. 이는 전체 금융 기록이 사람이 읽을 수 있는 형태로 저장되고, Git이나 다른 VCS에 넣어 시간 경과에 따른 변경 사항을 추적할 수 있음을 의미합니다. 사용자들은 종종 모든 편집의 감사 추적(변경 사항을 설명하는 커밋 메시지와 함께)을 유지하기 위해 Beancount 파일을 버전 관리 하에 둡니다. 이 접근 방식은 회계 데이터, 특히 개인이나 소규모 사업체의 재무 정보는 투명하고 "미래에도 사용 가능(future-proof)"해야 하며, 독점적인 데이터베이스에 갇혀 있어서는 안 된다는 Beancount의 철학과 일치합니다. 마틴 블레이스의 말에 따르면, Beancount는 커뮤니티를 위해 단순하고, 내구성 있고, 무료로 만들어진 "사랑의 노동(labor of love)"입니다. 이는 2007년경에 처음 개발되었으며, 주요 재작성(v1에서 v2로, 그리고 2024년의 v3)을 통해 미니멀리즘과 정확성이라는 핵심 철학을 유지하면서 설계를 개선해 왔습니다.
Beancount 생태계의 도구, 플러그인 및 확장 기능
Beancount 생태계는 핵심 원장 기능을 향상시키는 풍부한 도구, 플러그인 및 확장 기능을 갖추게 되었습니다. 이들은 데이터 가져오기, 원장 편집, 보고서 보기, 그리고 전문화된 회계 기능 추가 등을 다룹니다. 다음은 Beancount 세계의 주요 구성 요소 및 애드온에 대한 개요입니다.
데이터 가져오기 유틸리티 (임포터)
실용적인 사용을 위해 가장 중요한 요구 사항 중 하나는 은행, 신용카드 및 기타 금융 기관에서 거래를 가져오는 것입니다. Beancount는 이를 위해 임포트 프레임워크와 커뮤니티가 기여한 임포트 스크립트를 제공합니다. Beancount 2.x에서는 내장 모듈 beancount.ingest
(bean-extract
및 bean-identify
와 같은 명령어 포함)를 사용하여 Python으로 임포터 플러그인을 정의하고 다운로드한 명세서에 적용했습니다. Beancount 3.x에서는 이것이 Beangulp라는 외부 프로젝트로 대체되었습니다. Beangulp는 beancount.ingest
에서 발전한 전용 임포터 프레임워크이며, 현재 Beancount 3.0의 거래 임포트 자동화를 위한 권장 방법입니다. 이는 외부 파일(CSV나 PDF 명세서 등)을 읽고 Beancount 항목을 출력하는 Python 스크립트나 커맨드 라인 도구를 작성할 수 있게 해줍니다. 이 새로운 접근 방식은 임포트 로직을 Beancount 코어와 분리합니다. 예를 들어, 오래된 bean-extract
명령어는 v3에서 제거되었고, 대신 당신의 임포트 스크립트 자체가 Beangulp의 CLI 인터페이스를 통해 거래를 생성합니다.
다양한 은행과 형식을 위한 수십 개의 기성 임포터가 커뮤니티의 기여로 존재합니다. 중국의 Alipay와 WeChat Pay부터 다양한 유럽 은행(Commerzbank, ING, ABN AMRO 등), 미국의 Chase와 Amex 같은 은행에 이르기까지 전 세계 기관을 위한 임포터 스크립트가 있습니다. 이들 중 다수는 공개 저장소(주로 GitHub)나 beancount-importers
와 같은 패키지에 수집되어 있습니다. 예를 들어, Tarioch Beancount Tools 프로젝트(tariochbctools
)는 스위스와 영국 은행을 위한 임포터를 제공하며 암호화폐 거래 임포트까지 처리합니다. 또 다른 예는 Lazy Beancount로, 일반적인 임포터 세트(Wise, Monzo, Revolut, IBKR 등)를 패키징하고 쉬운 자동화를 위한 Docker 기반 설정을 제공합니다. 당신이 어떤 은행이나 금융 서비스를 사용하든, 누군가가 그것을 위한 Beancount 임포터를 작성했을 가능성이 높습니다. 그렇지 않다면 Beangulp의 프레임워크를 사용하여 직접 작성할 수 있습니다. Python의 유연성은 임포터가 CSV/Excel 파일 파싱, OFX/QIF 다운로드, 심지어 API 스크래핑까지 처리한 다음, 표준화된 Beancount 형식으로 거래를 내보낼 수 있음을 의미합니다.
편집 및 편집기 통합
Beancount 원장은 단지 텍스트이기 때문에, 사용자들은 종종 자신이 선호하는 텍스트 편집기나 IDE를 사용하여 관리합니다. 생태계는 이 경험을 더 원활하게 만들기 위해 편집기 지원 플러그인을 제공합니다. 많은 인기 편집기를 위한 확장 기능이 있어 구문 강조, 계정 이름 자동 완성, 실시간 오류 검사 등을 추가합니다.
- Emacs Beancount-Mode: .beancount 파일을 편집하기 위한 Emacs 메이저 모드(
beancount-mode
)가 있으며, 구문 색상 지정 및 Beancount의 검사기와의 통합과 같은 기능을 제공합니다. 백그라운드에서bean-check
를 실행하여 원장의 오류(예: 불균형 거래)를 편집하는 동안 플래그를 지정할 수도 있습니다. - VS Code 확장 프로그램: VSCode Marketplace의 Beancount 확장 프로그램은 Visual Studio Code 사용자에게 유사한 편의를 제공합니다. 구문 강조, 금액 정렬, 계정/수취인 자동 완성, 그리고 파일을 저장할 때 즉석 잔액 검사까지 지원합니다. 또한 Fava와 통합되어 VSCode 내에서 Fava 웹 인터페이스를 시작할 수 있습니다.
- Vim, Atom 및 기타 편집기를 위한 플러그인이나 모드도 존재합니다. 예를 들어, Beancount용 Tree-sitter 문법이 있어 최신 편집기에서 구문 강조를 지원하며, Fava의 웹 기반 편집기 컴포넌트에도 채택되었습니다. 요컨대, 당신의 편집 환경이 무엇이든, 커뮤니티는 Beancount 파일 편집을 편리하고 오류 없이 만들기 위한 플러그인을 제공했을 가능성이 높습니다.
전통적인 편집기 외부에서 빠르게 거래를 입력하기 위해, Bean-add와 모바일 앱과 같은 도구도 있습니다. _Bean-add_는 프롬프트나 한 줄 명령어를 통해 새로운 거래를 추가할 수 있게 해주는 커맨드 라인 도구로, 날짜와 계정 제안을 처리합니다. 모바일에서는 Beancount Mobile이라는 프로젝트가 이동 중에 거래를 입력할 수 있는 간단한 인터페이스를 제공합니다(예: 휴대폰에서 현금 구매 기록). 또한, 메시지를 통해 거래를 캡처하는 Beancount Telegram Bot이 존재합니다. 거래 세부 정보와 함께 메시지를 보내면 봇이 이를 원장 파일에 형식화해 줍니다.
웹 프론트엔드 및 시각화 도구
(Fava) Fava의 웹 인터페이스는 Beancount를 위한 대화형 대시보드를 제공하며, 계정과 잔액 테이블과 함께 시각화된 손익계산서(여기서는 카테고리별 비용의 트리맵으로 표시됨)와 같은 보고서를 특징으로 합니다.
Beancount의 대표적인 프론트엔드는 현대적인 웹 인터페이스인 Fava입니다. Fava는 로컬 웹 앱으로 실행되어 Beancount 파일을 읽고 브라우저에서 풍부한 대화형 경험을 제공합니다. 대차대조표, 손익계산서, 시간 경과에 따른 순자산, 포트폴리오 보유 현황, 성과 차트, 예산 등 모든 보고서 제품군을 기본적으로 제공합니다. 사용자들은 종종 다른 일반 텍스트 회계 도구보다 Beancount를 선택하는 주요 이유로 Fava를 꼽습니다. fava ledger.beancount
라는 단일 명령어로, 텍스트 대신 그래프와 표로 재무 상태를 탐색할 수 있습니다. Fava는 다음과 같은 기능을 지원합니다: 계정 드릴다운, 수취인 또는 태그별 거래 필터링, 쿼리 편집기(브라우저에서 Beancount 쿼리를 실행하고 결과를 볼 수 있음), 그리고 원장을 위한 통합 웹 기반 편집기까지. 사용성이 매우 뛰어나 시각적 인터페이스를 선호하는 사람들에게 일반 텍스트 회계를 접근하기 쉽게 만듭니다.
내부적으로 Fava는 Python(백엔드는 Flask)과 JavaScript(프론트엔드는 Svelte)로 작성되었습니다. 자체 출시 주기를 가지며 활발하게 유지 관리됩니다. 특히, Fava는 Beancount의 개발과 보조를 맞추어 왔습니다. 예를 들어, Fava 1.30은 Beancount v3 지원을 추가하여 내부적으로 새로운 beanquery
및 beangulp
패키지를 사용하도록 전환했습니다. (오래된 원장을 위해 Beancount 2도 여전히 지원합니다.) Fava의 사용성에 대한 집중은 웹 편집기의 자동 완성, 다크 모드와 반응형 차트를 갖춘 세련된 UI와 같은 멋진 기능들을 포함합니다. 또한 Fava-GTK라는 파생 프로젝트 도 있는데, 이는 Fava를 데스크톱 애플리케이션으로 패키징하여 네이티브 앱 느낌을 선호하는 GNOME/Linux 사용자를 위한 것입니다.
Fava 외에도 다른 시각화 및 분석 옵션이 존재합니다. Beancount 데이터를 테이블로 내보내거나 쿼리할 수 있기 때문에, 사용자들은 종종 Jupyter 노트북이나 Pandas와 같은 도구를 사용하여 사용자 정의 분석을 수행합니다. 예를 들어, 한 사용자는 사용자 정의 보고서를 준비하기 위해 쿼리 인터페이스를 통해 Beancount에서 데이터를 Pandas DataFrame으로 가져온다고 설명합니다. 특정 보고서를 위한 커뮤니티 기여 스크립트도 있습니다. 예를 들어, 포트폴리오 배분 분석 도구나 지출 대 순자산의 공정 관리도 등이 있습니다. 그러나 대부분의 사람들에게 Fava는 코드를 작성할 필요 없이 충분한 보고 기능을 제공합니다. 심지어 확장 기능도 지원합니다: 새로운 보고서 페이지나 차트를 Fava에 추가하는 Python 파일을 드롭인할 수 있습니다. 주목할 만한 확장 기능은 Fava 내에서 봉투 예산 관리를 위한 fava-envelope입니다. 전반적으로 Fava는 Beancount 생태계의 중앙 시각화 허브 역할을 합니다.
커맨드 라인 유틸리티 및 스크립트
Beancount는 다양한 CLI 도구와 함께 제공됩니다(특히 오래된 v2 브랜치에서, 일부는 v3에서 정리되었습니다). 이 도구들은 원장 파일을 조작하여 확인하거나 특정 보고서를 텍스트나 HTML로 생성합니다.
- bean-check: 파일의 구문 오류나 회계 오류를 확인하는 검사기입니다.
bean-check myfile.beancount
를 실행하면 불균형, 누락된 계정 또는 기타 문제를 알려주고, 파일에 오류가 없으면 아무것도 출력하지 않습니다. - bean-format: 소스 코드에 코드 포맷터를 실행하는 것과 같이 숫자를 깔끔한 열로 정렬하여 원장을 정리하는 포맷터입니다. 파일을 깨끗하고 읽기 쉽게 유지하는 데 도움이 됩니다.
- bean-query: 원장에 대한 Beancount의 쿼리 언어를 실행하기 위한 대화형 셸 또는 배치 도구입니다. 사용자 정의 테이블 형식 보고서를 생성하는 데 사용할 수 있습니다(예:
bean-query myfile.beancount "SELECT account, sum(amount) WHERE ..."
). - bean-report: 미리 정의된 보고서(대차대조표, 손익계산서, 시산표 등)를 콘솔이나 파일로 출력할 수 있는 다용도 보고서 생성기(v2에서)입니다. 예를 들어,
bean-report file.beancount balances
는 계정 잔액을 인쇄합니다. (실제로 이러한 텍스트 보고서 중 다수는 Fava의 더 나은 프레젠테이션으로 대체되었습니다.) - bean-web / bean-bake:
localhost
에서 보고서를 제공하거나 정적 HTML 파일로 "굽는(bake)" 오래된 웹 인터페이스입니다. 이들은 주로 Fava가 인기를 얻기 전에 사용되었습니다. bean-web은 bean-report가 생성할 수 있는 것과 동일한 보고서의 기본 웹 뷰를 제공했습니다. Beancount 3에서는 bean-web이 제거되었습니다(Fava가 이제 권장되는 웹 프론트엔드이며 우수한 경험을 제공하기 때문입니다). - bean-example: 예제 원장 파일을 생성하는 유틸리티입니다(새로운 사용자가 Beancount 항목의 템플릿을 보는 데 유용합니다).
- bean-doctor: 원장이나 환경의 문제를 진단할 수 있는 디버깅 도구입니다.
Beancount v3부터 이러한 도구 중 다수가 핵심 프로젝트에서 분리되었다는 점은 주목할 가치가 있습니다. 핵심 Beancount 패키지는 간소화되었고, 쿼리 엔진 및 임포터와 같은 도구는 유지 관리를 용이하게 하기 위해 별도의 패키지(beanquery, beangulp 등)로 분리되었습니다. 예를 들어, bean-query의 기능은 이제 별도로 설치되는 beanquery
도구에 의해 제공됩니다. 사용자 관점에서 기능은 여전히 사용 가능하지만, 모듈화된 것뿐입니다. Arch Linux 커뮤니티는 Fava를 업데이트할 때 이 변경 사항을 주목했습니다: Fava 패키지는 Beancount 3.x를 지원하기 위해 beanquery와 beangulp에 대한 의존성을 추가했습니다. 이 모듈식 접근 방식은 또한 커뮤니티의 다른 사람들이 Beancount의 출시 주기와는 독립적으로 이러한 보조 도구에 더 쉽게 기여할 수 있게 합니다.
Beancount 플러그인 및 확장 기능
Beancount 생태계의 뛰어난 강점 중 하나는 플러그인 시스템입니다. Beancount 파일에 plugin "module.name"
줄을 추가함으로써, 원장 처리 중에 실행되는 사용자 정의 Python 로직을 통합할 수 있습니다. 커뮤니티는 Beancount의 기능을 확장하기 위해 많은 플러그인을 만들었습니다.
- 데이터 품질 및 규칙: 예를 들어, 여러 계정을 포함하는 방정식을 주장할 수 있게 해주는
beancount-balexpr
(예: 자산 A + 자산 B = 부채 X), 그리고 계정을 닫을 때 자동으로 잔액 검증을 삽입하여 순액이 0이 되도록 보장하는beancount-checkclosed
가 있습니다. 파일의 거래가 날짜순으로 정렬되었는지 확인하여 순서가 맞지 않는 항목을 잡아내는 플러그인(autobean.sorted
)도 있습니다. - 자동화:
beancount-asset-transfer
플러그인은 계정 간에 현물 이체 항목을 생성할 수 있습니다(원가 기준을 유지하면서 브로커 간에 주식을 옮기는 데 유용합니다). 또 다른 플러그인인autobean.xcheck
는 불일치를 찾기 위해 Beancount 원장을 외부 명세서와 교차 확인합니다. - 반복 거래 및 예산: Akuukis의 "repeat" 또는 보간 플러그인은 반복 거래를 정의하거나 연간 비용을 월별로 분산할 수 있게 해줍니다. 예산 관리를 위해,
fava-envelope
확장 기능(Fava를 통해 사용)은 일반 텍스트로 봉투 예산 관리 방법론을 지원합니다. Frank Davies의 MiniBudget도 있습니다. 이는 개인 또는 소규모 사업체 예산 관리를 돕기 위해 Beancount에서 영감을 받은 작은 독립형 도구입니다. - 세금 및 보고: 일부 플러그인은 세금 회계에 도움이 됩니다. 예를 들어, 자본 이득을 자동으로 단기 대 장기로 분류하는 플러그인이 있습니다. 또 다른 플러그인(
fincen_114
, Justus Pendleton 제작)은 해외 계좌를 가진 미국 납세자를 위한 FBAR 보고서를 생성하여 Beancount 데이터가 규제 보고에 어떻게 활용될 수 있는지를 보여줍니다. - 커뮤니티 플러그인 저장소: 감가상각 항목 등에 초점을 맞춘 beancount-plugins(Dave Stephens 제작)와 정렬 지시어와 같은 다양한 도우미를 포함하는 beancount-plugins-zack(Stefano Zacchiroli 제작)과 같은 큐레이션된 플러그인 세트가 있습니다.
플러그인 외에도, Beancount를 중심으로 한 다른 유틸리티 도구들이 특정 요구를 해결합니다. 예를 들어, beancount-black은 Black 코드 포맷터와 유사하지만 Beancount 원장 파일을 위한 자동 포맷터입니다. 앞서 언급했듯이 채팅을 통해 거래를 추가하기 위한 Beancount Bot(Telegram/Mattermost)이 있으며, macOS용 Alfred 워크플로우를 사용하여 파일에 거래를 빠르게 추가할 수 있습니다. Pinto라는 도구는 대화형 입력(향상된 bean-add와 같은)을 갖춘 "강화된" CLI를 제공합니다. 다른 시스템에서 마이그레이션하는 사람들을 위해, 다른 곳에서 데이터를 가져오는 데 도움이 되는 변환기(YNAB2Beancount, CSV2Beancount, GnuCash2Beancount, Ledger2Beancount)가 존재합니다.
요약하자면, Beancount 생태계는 매우 광범위합니다. 아래 표 1은 주요 도구와 확장 기능 및 그 역할을 나열합니다.
도구/확장 기능 | 설명 |
---|---|
Fava (웹 인터페이스) | Beancount 장부를 보고 편집하기 위한 모든 기능을 갖춘 웹 앱. 대화형 보고서(대차대조표, 손익계산서 등), 차트, 쿼리 기능 제공. Beancount의 사용성을 크게 향상시킴. |
Beangulp (임포트 프레임워크) | Beancount v3를 위한 독립적인 임포터 프레임워크로, 이전의 ingest 모듈을 대체. 플러그인 스크립트를 사용하여 은행 명세서(CSV, PDF 등)를 Beancount 항목으로 변환하는 데 도움. |
Beanquery (쿼리 도 구) | Beancount 데이터를 위한 독립적인 SQL과 유사한 쿼리 엔진. v3에서 bean-query 를 대체하며, 친숙한 SELECT-FROM-WHERE 구문을 통해 거래와 잔액에 대한 고급 쿼리 가능. |
Bean-check / Bean-format | Beancount 파일의 유효성을 검사하고(오류 확인) 일관성을 위해 자동 서식 지정하는 핵심 CLI 도구. 정확하고 깨끗한 원장을 유지하는 데 유용함. |
편집기 플러그인 (Emacs, VSCode, Vim 등) | 텍스트 편집기에서 Beancount 구문 지원과 린팅을 추가하는 플러그인/모드. 자동 완성 및 실시간 오류 강조 표시와 같은 기능으로 .beancount 파일을 수동으로 편집하는 경험을 개선함. |
커뮤니티 임포터 | 미국, 유럽, 아시아 등의 은행을 포함하는 은행 임포트 스크립트 모음(다수가 GitHub에 있음). 사용자가 금융 기관의 거래를 Beancount로 자동 수집할 수 있게 함. |
플러그인 (원장 확장 기능) | 규칙을 강제하거나 기능을 추가하기 위한 선택적 파일 내 플러그인(예: 비용 분담, 반복 항목, 사용자 정의 잔액 검증). Python으로 작성되어 파일 처리 중에 실행되어 사용자 정의 가능. |
변환기 (마이그레이션 도구) | 다른 형식의 데이터를 Beancount로 변환하는 유틸리티, 예: GnuCash나 Ledger CLI에서 Beancount 형식으로. 처음부터 시작하지 않고 Beancount를 채택하는 것을 용이하게 함. |
Ledger, hledger 및 유사 시스템과의 비교
Beancount는 일반 텍스트 복식 부기 회계 도구 제품군에 속하며, 그중에서도 Ledger CLI(존 위글리의 Ledger)와 hledger가 두드러집니다. 이 모든 시스템은 일반 텍스트 원장 파일과 복식 부기라는 핵심 아이디어를 공유하지만, 구문, 철학, 생태계 성숙도에서 차이가 있습니다. 다음 표는 Beancount, Ledger, hledger 간의 주요 차이점을 강조합니다.
측면 | Beancount (Python) | Ledger CLI (C++) | hledger (Haskell) |
---|---|---|---|
구문 및 파일 구조 | 공식 문법(BNF)으로 정의된 엄격하고 구조화된 구문. 거래는 명시적인 날짜 플래그 "수취인" "설명" 줄과 수량이 있는 전기가 있으며, 모든 계정은 명시적으로 개설/정의되어야 함. 암묵적 전기 없음; 모든 거래는 균형을 이루어야 함. | 더 자유로운 형식의 구문. 수취인/설명은 일반적으로 날짜와 같은 줄에 있음. 일부 암묵적 균형 조정을 허용함(예: 단일 전기 거래는 기본 계정에 대한 두 번째 전기를 암시할 수 있음). 계정 이름은 사전 선언 없이 사용 가능. 파싱에 영향을 줄 수 있는 많은 커맨드 라인 옵션 제공(예: 연도 가정, 상품 병합 규칙). | Ledger의 구문을 대체로 따르며 사소한 차이가 있음. hledger는 Ledger의 핵심 기능을 Haskell로 재구현한 것이므로, 저널 형식은 Ledger와 매우 유사함(일부 확장 기능과 기본적으로 더 엄격한 파싱 포함). 예를 들어, hledger는 Ledger보다 날짜와 상품 구문에 대해 약간 더 엄격하지만, Beancount만큼 엄격하지는 않음. |
철학 | 보수적이고 꼼꼼함. 사용자 실수를 잡아내고 데이터 무결성을 유지하는 것을 무엇보다 강조함. 기본적으로 많은 검사(잔액 검증, 로트 추적)를 부과함. 최소한의 구성 – 일관성을 위한 "한 가지 방법" 접근 방식. 확장성을 위해 플러그인을 갖춘 라이브러리로 설계됨(원장 데이터를 처리할 스트림으로 취급하여 사용자 정의 Python 로직 가능). | 낙관적이고 유연함. 사용자가 데이터를 올바르게 입력할 것이라고 신뢰함; 기본적으로 내장된 제약이 적음. 수십 개의 옵션과 커맨드 플래그로 동작을 조정할 수 있어 매우 사용자 정의 가능. 기능이 내장된(보고서, 플롯) 모놀리식 도구 경향이 있으며, 자동화된 거래 및 주기적 거래와 같은 것을 위해 원장 내에서 도메인 특정 언어를 사용함. 확장성은 일반적으로 외부 스크립트나 내장 쿼리 언어를 통해 이루어지며, 플러그인 API는 없음. | 실용적이고 일관됨. 예측 가능한 동작으로 Ledger의 접근 방식을 더 넓은 청중에게 제공하는 것을 목표로 함. hledger는 기본적으로 더 많은 일관성을 추구하며(명시적 계정 없이는 균형 가정 없음) Ledger의 가장 관대한 모드보다 실수를 유발할 여지가 적음. Ledger 기능의 일부를 가지고 있지만(Ledger의 일부 이국적인 옵션은 지원되지 않음), 자체적인 기능(웹 인터페이스 및 내장 CSV 임포트 등)을 추가함. Beancount와 같은 플러그인 시스템 없이 안정성과 정확성을 강조함. |
거래 및 균형 조정 | 엄격한 복식 부기: 모든 거래는 총 차변과 대변이 같아야 함. 불균형 항목이나 플레이스홀더를 허용하지 않음 (자동 균형을 맞추는 "가상 전기" 없음). 또한 순서 독립성을 강제함: 잔액 검증이 파일 순서에 의존하지 않고 날짜 범위로 지정되므로 원장은 날짜순으로 임의로 정렬될 수 있음. 상품에 대한 원가 추적은 엄격함 – 자산을 판매할 때 로트를 지정해야 하거나 Beancount가 FIFO/LIFO를 강제하여 추가하지 않은 것을 제거할 수 없도록 함. | 거래에 더 많은 관대함을 허용함. Ledger는 명시적인 균형 조정 계정이 필요 없는 "가상" 전기(대괄호 [ ] 또는 괄호 사용)를 허용함 – 종종 예산 관리나 암묵적 자본 균형 조정에 사용됨. Ledger에서는 불완전한 거래(한쪽을 생략)를 입력하고 Ledger가 균형 금액을 추론하게 하는 것이 가능함. 또한, Ledger는 로트별 자산 제거를 엄격하게 강제하지 않음; 특정 로트가 추적되지 않았더라도 총 상품 잔액에서 기꺼이 차감함. 이는 평균 원가 회계를 쉽게 하지만, 특정 로트에서 보유한 것보다 더 많은 주식을 파는 것과 같은 실수를 Ledger가 막아주지 않음을 의미함. | 가상 전기와 암묵적 균형 조정을 허용하는 점에서 Ledger와 유사하지만, 더 일관된 동작을 보임. hledger는 Ledger보다 더 엄격한 파싱 규칙을 적용하지만 Beancount보다는 관대함. |
재고 및 원가 기준 | 정밀한 로트 추적. Beancount는 상품 로트에 원가 정보를 첨부하며(예: 주당 100달러에 10주 구매), 재고를 줄일 때 특정 로트를 일치시키거나 정의된 전략을 사용하도록 요구함. 자본 이득과 원가 기준이 설계상 정확하게 계산되도록 보장함. Beancount는 각 로트를 개별적으로 취급하여 정확성을 보존하기 때문에, 명시적으로 로직을 작성하지 않는 한 평균 원가법이 기본값이 아님. | 더 추상적인 재고. Ledger는 상품 수량을 더 유동적으로 취급함; 기본적으로 모든 로트는 보고서에서 병합됨(총 수량만 표시). 필요하다면 로트별 또는 평균 원가별로 보고하는 옵션을 제공하지만, 이는 보고의 문제임. 역사적으로 Ledger는 다중 상품 거래에서 균형을 맞추기 위해 원가 정보를 사용하지 않았으며, 이는 미묘한 자본 이득 계산 오류로 이어질 수 있었음. 그러나 Ledger의 유연성 덕분에 사용자는 커맨드 라인 플래그를 통해 보고 시점에 FIFO, LIFO, 평균 등을 선택할 수 있음. | 유연한 재고 처리로 Ledger와 유사함. hledger는 지정될 때 로트를 추적할 수 있지만 Beancount만큼 엄격하게 로트별 추적을 강제하지는 않음. 자본 이득 계산은 가능하지만 더 많은 수동 설정이 필요함. |
보고 및 UI | 주로 Fava(웹 UI)와 bean-query/bean-report를 통해 이루어짐. Fava는 그래프와 차트가 있는 세련된 웹 대시보드를 제공하여 Beancount를 분석에 매우 사용자 친화적으로 만듦. 또한 bean-query를 통해 텍스트 보고서와 SQL과 유사한 쿼리를 지원함. 공식적인 TUI(텍스트 UI)는 없지만, 편집기/IDE 통합이 그 간극을 메움. | 주로 CLI 기반 보고. Ledger에는 터미널에 텍스트를 출력하는 많은 내장 보고서 명령어(balance, register, stats 등)가 있음. 차트(ASCII 또는 gnuplot을 통해)를 생성할 수 있고 HTML 보고서를 위한 애드온도 있지만, 프로젝트의 일부로 유지 관리되는 공식 웹 인터페이스는 없음. (Ledger용 웹 UI에 대한 제3자 시도가 있었지만, Beancount의 Fava만큼 두드러진 것은 없음.) UI를 위해 사용자들은 터미널이나 Ledger-Live(별도 프로젝트)와 같은 GUI에 의존함. | CLI와 간단한 웹 UI를 모두 제공함. hledger는 Ledger의 CLI 보고서를 계승하며(유사한 명령어 포함), 추가로 브라우저에서 계정과 거래를 볼 수 있는 기본 웹 인터페이스인 hledger-web |