회계 사이클, Beancount 스타일
재무제표는 마법처럼 나타나는 것이 아닙니다. 이는 회계 사이클이라 불리는 구조화되고 반복 가능한 프로세스의 최종 산물입니다. 원칙은 보편적이지만, 사용하는 도구에 따라 경험이 크게 달라질 수 있습니다. 이 가이드는 강력한 텍스트 기반 회계 도구인 Beancount에 초점을 맞춰 회계 사이클을 단계별로 안내합니다.
Beancount의 텍스트 우선 접근 방식이 어떻게 번거로운 단계를 없애는지, 자동화해야 할 부분은 무엇인지, 그리고 재무 건전성을 가장 명확히 파악할 수 있는 보고서는 무엇인지 살펴보겠습니다. 🧑💻
TL;DR: Beancount 워크플로우
- Capture & Journal: 모든 거래를 깔끔한 복식부기 포스팅으로
.beancount
텍스트 파일에 기록합니다. - Validate & Reconcile:
balance
어설션을 사용해 원장이 은행 명세와 일치하는지 확인하고bean-check
로 오류를 잡습니다. - Review: 조정되지 않은 시산표를 생성해 빠르게 sanity check를 합니다.
- Adjust: 발생비용, 이연비용, 감가상각 및 기타 기간 말 항목에 대한 조정 분개를 기록합니다.
- Re-review: 조정된 시산표를 확인해 모든 것이 정확한지 검증합니다.
- Publish & Close: 손익계산서, 대차대조표, 현금흐름표를 생성합니다. Beancount에서는 보고서가 날짜를 인식하므로 장부 마감은 선택 사항입니다.
이 흐름은 다음과 같이 시각화할 수 있습니다:
Step 1: 거래 캡처 및 기록
이것이 기본 단계입니다. 모든 재무 이벤트—판매, 구매, 은행 수수료—는 반드시 기록되어야 합니다. Beancount에서는 main.beancount
와 같이 간단한 텍스트 파일에 거래를 생성함으로써 이를 수행합니다. 파일을 연도별로 나누어 관리할 수도 있습니다.
각 거래는 복식부기 규칙을 따라야 하며, 모든 포스팅의 합은 반드시 0이어야 합니다. Beancount이 이를 자동으로 강제합니다.
2025-08-10 * "Walmart" "사무용품 구매"
Expenses:Office:Supplies 45.67 USD
Assets:Bank:Checking -45.67 USD
- Pro-Tip:
#project-phoenix
또는#client-acme
와 같은 태그를 사용해 데이터에 차원을 추가하세요. 나중에 쿼리와 보고서를 훨씬 유연하게 만들 수 있습니다.
조정 위생 ✅
정확성을 보장하는 가장 강력한 기능은 balance 어설션입니다. 명세 기간 말(예: 월말)에는 해당 계정의 잔액이 어떠해야 하는지 선언합니다.
2025-08-31 balance Assets:Bank:Checking 12345.67 USD
Assets:Bank:Checking
에 영향을 주는 모든 거래의 합이 12345.67 USD
와 일치하지 않으면 Beancount이 오류를 발생시킵니다. 이 간단한 지시문은 원장을 자체 감사 문서로 전환합니다.
역사 데이터를 뒤늦게 입력하는 경우, pad
지시문을 사용해 개시 잔액이 첫 어설션과 맞도록 자동으로 균형 거래를 생성할 수 있습니다.
Step 2: "원장에 포스팅" (무료!)
전통 회계 시스템에서는 먼저 "분개장(journal)"에 입력하고, 별도의 "포스팅" 단계에서 이를 "총계정원장(general ledger)"에 복사합니다.
Beancount에서는 .beancount
파일 자체가 분개장과 원장을 동시에 겸합니다. 거래를 작성하고 저장하면 이미 포스팅이 완료된 것입니다. 별도의 단계가 없습니다. 이 직접성은 텍스트 기반 회계의 핵심 장점이며, 보는 그대로가 결과가 됩니다.
Step 3: 조정되지 않은 시산표 준비
조정을 시작하기 전에 빠르게 “모두 맞는가?”를 확인해야 합니다. 시산표는 모든 계정과 그 총액을 나열하는 간단한 보고서이며, 차변 총액과 대변 총액이 일치해야 합니다.
다음과 같은 간단한 쿼리로 생성할 수 있습니다:
bean-query main.beancount \
"SELECT account, sum(position) GROUP BY 1 ORDER BY 1"
또는 Fava(Beancount 웹 인터페이스)를 열어 “Trial Balance” 보고서를 확인하세요. 자산 계정에 대변 잔액이 있거나, 비용 계정에 이상한 값이 있는지 살펴보세요.
Step 4: 조정 분개 기록
조정 분개는 발생주의 회계에 따라 정확한 보고를 위해 필수적입니다. 현금 흐름과 무관하게 수익은 발생 시점에, 비용은 발생 시점에 인식됩니다.
일반적인 조정 항목:
- 발생비용(Accruals): 아직 청구하지 않은 매출이나 아직 지급하지 않은 비용을 기록합니다.
- 이연수익(Deferrals): 선불을 처리합니다. 고객이 1년 서비스 비용을 선불로 지급하면
Liabilities:UnearnedRevenue
로 부채를 잡고 매월 1/12씩 수익으로 인식합니다. - 비현금 항목: 감가상각 등.
- 수정(Corrections): 오류 수정 또는 은행 피드에서 누락된 항목(예: 소액 이자 지급) 반영.
예시: 매출 발생(Accruing Revenue)
8월 31일에 프로젝트를 완료했지만 청구서는 9월에 보냅니다. 올바른 기간(8월)에 수익을 인식하려면 다음과 같이 조정 분개를 합니다:
2025-08-31 * "프로젝트 #1042 매출 발생"
Assets:AccountsReceivable 3000.00 USD
Income:Consulting -3000.00 USD
예시: 감가상각 기록
회사에 자산 감가상각 일정이 있습니다. 기간 말에 다음과 같이 비용을 기록합니다:
2025-12-31 * "컴퓨터 장비 연간 감가상각"
Expenses:Depreciation 4800.00 USD
Assets:Fixed:AccumulatedDepreciation -4800.00 USD
Step 5: 조정된 시산표 실행 및 검증
조정 분개를 모두 입력한 뒤 다시 시산표를 실행합니다. 이것이 조정된 시산표이며, 재무제표 작성에 사용될 최종 숫자입니다.
또한 Beancount 내장 검증 명령을 실행해 보세요:
bean-check main.beancount
출력이 없으면 구문, 균형 규칙, 어설션 모두 정상이라는 뜻입니다.
Step 6: 재무제표 발행 📊
이제 조정된 시 산표의 숫자를 활용해 핵심 재무 보고서를 생성합니다. 가장 쉬운 방법은 Fava를 이용하는 것으로, 인터랙티브하고 드릴다운 가능한 보고서를 바로 제공합니다.
- 손익계산서 (Income Statement / P&L): 기간 동안의 수익과 비용을 보여주며 순이익 또는 순손실을 나타냅니다.
- 대차대조표 (Balance Sheet): 특정 시점에 자산, 부채, 자본(Equity)을 한눈에 보여줍니다.
- 현금흐름표 (Cash Flow Statement): 시작 현금과 종료 현금을 연결해 현금이 어디서 들어오고 어디로 나갔는지 보여줍니다.
맞춤형 보고서는 Beancount Query Language (BQL)를 사용해 만들 수 있습니다. 아래는 월간 손익계산서 쿼리 예시입니다:
-- 2025년 8월 손익계산서
SELECT account, sum(position)
WHERE account '^(Income|Expenses)'
AND date >= 2025-08-01 AND date <= 2025-08-31
GROUP BY account ORDER BY account;
Step 7: 장부 마감 (선택)
전통 회계에서는 “마감” 절차를 통해 모든 임시 계정(수익·비용)을 0으로 만들고 순이익을 Retained Earnings(이익잉여금)으로 이전합니다. 이는 다음 회계 연도를 위해 임시 계정을 초기화하는 과정입니다.
Beancount에서는 보통 이 단계가 필요 없습니다. Fava 보고서는 날짜를 인식하므로 2025년 P&L을 요청하면 2025년 데이터만 사용합니다. 잔액이 “넘쳐” 나오지 않으며, 대부분의 사용자는 그대로 두고 작업합니다.
하지만 규정 준수나 주주 보고를 위해 공식 마감이 필요하다면, 연말에 총 수익·비용을 Equity:Retained-Earnings
로 옮기는 간단한 거래를 추가하면 됩니다.
실용적인 월간 마감 체크리스트
Beancount를 사용해 매월 장부를 마감하는 반복 가능한 체크리스트입니다.
- Capture: 모든 은행·신용카드 거래를 가져옵니다. 현금 지출이나 비정규 항목은 수동으로 입력합니다.
- Reconcile: 모든 은행·카드·대출 계정에
balance
어설션을 추가해 명세와 일치시키세요. - Review: Fava에서 조정되지 않은 시산표를 검토합니다. 이상하거나 예상치 못한 잔액을 조사합니다. 미수금(
Assets:AccountsReceivable
)이나 미지급금(Liabilities:AccountsPayable
)이 오래 남아 있지 않은지 확인합니다. - Adjust: 발생수익·발생비용, 이연수익·이연비용 및 필요한 수정 분개를 기록합니다.
- Validate:
bean-check
를 실행하고 최종 조정된 시산표를 검토합니다. - Publish: 손익계산서와 대차대조표를 생성해 이해관계자에게 전달하거나 보관합니다.
- Wrap-up: 필요 시 마감 분개를 수행하고, 해당 기간
.beancount
파일을 아카이브합니다.
Beancount가 회계 사이클에 강력한 이유
- 투명성 및 감사 가능성: 원장이 텍스트 파일이므로
git
으로 버전 관리하고diff
로 변경 사항을 검토하며 회계사와 명확하게 협업할 수 있습니다. - 완전한 제어: 차트 오브 어카운트를 직접 정의합 니다. 소프트웨어 공급업체의 구조에 얽매이지 않으며, 데이터는 영원히 열려 있는 포맷으로 여러분의 소유입니다.
- 비할 데 없는 파워: SQL‑like 쿼리(BQL)와 풍부한 웹 인터페이스(Fava)의 조합으로 재무 데이터를 자유롭게 슬라이스·다이스·분석할 수 있습니다.
시작을 위한 복사·붙여넣기 스니펫
간단한 차트 오브 어카운트:
option "title" "My Personal Ledger"
option "operating_currency" "USD"
;; --- Accounts ---
1970-01-01 open Assets:Bank:Checking
1970-01-01 open Assets:AccountsReceivable
1970-01-01 open Liabilities:CreditCard
1970-01-01 open Liabilities:UnearnedRevenue
1970-01-01 open Equity:Owner:Capital
1970-01-01 open Equity:Retained-Earnings
1970-01-01 open Income:Consulting
1970-01-01 open Expenses:Office:Supplies
1970-01-01 open Expenses:Software
1970-01-01 open Expenses:Depreciation
유용한 BQL 쿼리:
-- 미수금이 남아 있는 고객 찾기
SELECT payee, sum(position)
WHERE account = 'Assets:AccountsReceivable'
GROUP BY payee
HAVING sum(position) > 0
ORDER BY sum(position) DESC;
텍스트 기반 도구인 Beancount와 영원한 회계 사이클을 연결하면 견고하고 투명하며 오래 지속되는 시스템을 구축할 수 있습니다. 즐거운 부기 되세요!