Beancount vs hledger: 나에게 맞는 텍스트 기반 회계 도구는?
플레인 텍스트 회계(Plain-text accounting)로 재무 관리를 하기로 결정했다면 이미 현명한 선택을 내린 것입니다. 재무 데이터는 귀하가 완전히 제어하고 버전 관리가 가능하며 벤더 종속(vendor lock-in)이 없는, 사람이 읽을 수 있는 파일에 저장됩니다. 하지만 이제 다음 질문이 생깁니다. 어떤 도구를 사용해야 할까요?
Beancount와 hledger는 현재 가장 인기 있는 두 가지 플레인 텍스트 회계(PTA) 도구입니다. 둘 다 오픈 소스이며 활발하게 유지 관리되고 있으며, 개인 예산 관리부터 복잡한 투자 포트폴리오에 이르기까지 모든 것을 처리할 수 있습니다. 하지만 재무 데이터를 기록, 검증 및 분석하는 방식에 있어서는 근본적으로 다른 접근 방식을 취합니다.
이 가이드는 워크플로, 경험 수준 및 재무 추적 요구 사항에 맞는 도구를 선택할 수 있도록 주요 차이점을 분석합니다.
핵심 철학: 엄격함 vs. 유연함
Beancount와 hledger의 가장 큰 차이점은 기능이 아니라 사고방식입니다.
Beancount는 엄격한 선생님과 같습니다. 사용자가 데이터 입력 실수를 할 것이라고 가정하고 이를 조기에 발견할 수 있는 안전 장치를 구축합니다. 모든 계정은 사용하기 전에 명시적으로 열어야(open) 합니다. 모든 거래의 합계는 0으로 균형이 맞아야 합니다. 통화는 엄격한 형식을 따라야 합니다. 무언가 잘못된 것이 있으면 Beancount는 사용자가 수정할 때까지 파일 처리를 거부합니다.
hledger는 관대한 친구와 같습니다. 더 완화된 구문을 사용하며, 계정 사전 선언을 건너뛸 수 있게 해주고, 심지어 균형 항목을 유추할 수도 있습니다. 최소한의 설정으로 재무 추적을 시작하고 필요에 따라 점진적으로 구조를 추가할 수 있습니다.
두 가지 접근 방식 중 어느 것도 객관적으로 더 낫다고 할 수 없습니다. 오류가 눈덩이처럼 불어나 몇 시간 동안 디버깅해야 하는 상황이 오기 전에 미리 잡아내는 것을 중요하게 생각한다면 Beancount의 엄격함은 훌륭한 기능입니다. 빠르게 시작하고 싶고 유연성을 선호한다면 hledger의 관대함이 장점이 될 것입니다.
구문 및 데이터 형식
두 도구 모두 거래 내역을 일반 텍스트 파일로 저장하지만, 구문 규칙에는 유의미한 차이 가 있습니다.
Beancount 구문
2026-03-15 * "Whole Foods" "Weekly groceries"
Expenses:Food:Groceries 85.42 USD
Liabilities:CreditCard:Visa
주요 규칙:
- 날짜는 ISO 8601 형식(
YYYY-MM-DD)을 사용합니다. - 통화는 반드시 대문자(예:
USD,EUR)여야 하며,$나€와 같은 기호는 사용할 수 없습니다. - 계정 이름은 콜론으로 구분된 최소 두 개의 구성 요소가 필요합니다 (예:
Expenses:Food). - 설명(Description)은 따옴표로 묶인 문자열이어야 합니다.
- 모든 계정은
open지시어를 통해 명시적으로 열어야 합니다.
hledger 구문
2026-03-15 Whole Foods | Weekly groceries
expenses:food:groceries $85.42
liabilities:creditcard:visa
주요 규칙:
- 더 유연한 날짜 형식을 지원합니다.
$및€와 같은 통화 기호를 사용할 수 있습니다.- 계정 이름은 소문자일 수 있으며 더 자유로운 형태를 가집니다.
- 설명에 따옴표가 필요하지 않습니다.
- 계정을 미리 선언할 필요가 없습니다.
결론: Beancount의 더 엄격한 구문은 초기 작업이 더 많지만 모호성이 적다는 것을 의미합니다. hledger의 완화된 구문은 시작하기 쉽지만 일관성을 유지하기 위해 더 많은 자제력이 필요합니다.
데이터 무결성 및 검증
이 부분에서 Beancount는 진정으로 차별화됩니다.
잔액 검증 (Balance Assertions)
두 도구 모두 기록된 잔액이 은행 명세서와 일치하는지 확인하는 잔액 검증(Balance Assertions) 기능을 지원합니다. 하지만 작동 방식이 다릅니다.
Beancount는 순서에 무관한 날짜 기반 잔액 검증을 사용합니다. 거래 파일의 순서를 원하는 대로 재배치해도 검증은 여전히 올바르게 작동합니다. 반면 hledger의 검증은 파일 내의 순서에 의존하므로 거래 위치를 옮기면 검증이 깨질 수 있습니다.
재고 및 투자 자산 추적
투자를 추적하는 사람에게 이 점은 매우 중요합니다. Beancount는 엄격한 재고 기록(Inventory Booking)을 강제합니다. 사지 않은 주식을 팔 수 없으며, 취득 원가를 정밀하게 추적합니다. 이는 자본 이득 계산이 실제와 어긋나는 미묘한 버그인 "취득 원가 누수"를 방지합니다.
hledger도 상품(Commodities)과 로트(Lots)를 처리하지만 강제성은 적습니다. 더 유연하지만, 이는 세금 신고 때까지 눈치채지 못할 실수를 허용할 수도 있음을 의미합니다.
계정 카테고리
Beancount는 모든 계정이 자산(Assets), 부채(Liabilities), 수익(Income), 비용(Expenses), 자본(Equity)의 다섯 가지 카테고리 중 하나에 속해야 합니다. 이러한 제약 덕분에 적절한 대차대조표와 손익계산서를 자동으로 생성할 수 있습니다.
hledger는 필수 루트 카테고리 없이 임의의 계정 계층 구조를 허용합니다. 이는 더 많은 자유를 주지만, 유의미한 재무 보고서를 얻으려면 수동으로 관례를 따라야 함을 의미합니다.
사용자 인터페이스 및 보고
Beancount + Fava
Beancount의 가장 돋보이는 기능은 Fava입니다. Fava는 다음과 같은 기능을 제공하는 세련된 웹 인터페이스입니다.
- 대화형 차트 및 그래프 (순자산 추이, 지출 내역 분석, 수입 vs 지출)
- 소비 카테고리에 대한 트리맵(Treemap) 시각화
- 계정, 태그, 기간 및 수취인별 강력한 필터링
- 맞춤형 보고서를 위한 쿼리 언어
- 원장 파일을 위한 내장 에디터
Fava는 플레인 텍스트 회계 생태계에서 최고의 UI로 널리 인정받고 있습니다. 대시보드와 차트를 원하는 시각적인 사람이라면 이는 Beancount를 선택하게 만드는 강력한 요인입니다.
hledger 인터페이스
hledger는 다중 인터페이스 접근 방식을 취합니다:
- CLI: 수십 개의 내장 명령(
balance,register,incomestatement,cashflow등)을 갖춘 풍부한 명령줄 보고 기능 - hledger-ui: 계정 및 거래를 대화식으로 탐색하기 위한 터미널 기반 UI
- hledger-web: 기본적인 탐색 및 데이터 입력을 위한 간단한 웹 인터페이스
hledger의 CLI는 기본적으로 Beancount의 CLI보다 더 강력합니다. 터미널에서 주로 작업하며 빠르고 스크립트 작성이 가능한 보고서를 원한다면 hledger가 적합합니다.
성능
hledger는 Haskell로 작성되었으며 초당 약 25,000건의 트랜잭션을 처리합니다. 대부분의 개인 금융 사용자에게 두 도구 모두 사실상 즉각적인 속도를 보여줍니다. 하지만 여러 엔티티에 걸친 수년간의 거래와 같은 대규모 데이터 세트를 관리하는 경우, hledger의 원시 속도가 우위를 점합니다.
Beancount(v3)는 핵심 파서가 C++로 재작성되어 원래의 Python 구현에 비해 성능이 크게 향상되었습니다. 일반적인 개인 또는 소규모 비즈니스 용도에서는 차이를 느끼지 못할 것입니다.