본문으로 건너뛰기

회계 사이클, Beancount 스타일

게시됨 마지막 업데이트 약 6분Mike ThriftMike Thrift
회계 사이클, Beancount 스타일
이 페이지에서

재무제표는 마법처럼 나타나는 것이 아닙니다. 이는 회계 사이클이라 불리는 구조화되고 반복 가능한 프로세스의 최종 산물입니다. 원칙은 보편적이지만, 사용하는 도구에 따라 경험이 크게 달라질 수 있습니다. 이 가이드는 강력한 텍스트 기반 회계 도구인 Beancount에 초점을 맞춰 회계 사이클을 단계별로 안내합니다.

Beancount의 텍스트 우선 접근 방식이 어떻게 번거로운 단계를 없애는지, 자동화해야 할 부분은 무엇인지, 그리고 재무 건전성을 가장 명확히 파악할 수 있는 보고서는 무엇인지 살펴보겠습니다. 🧑‍💻


TL;DR: Beancount 워크플로우​

  • Capture & Journal: 모든 거래를 깔끔한 복식부기 포스팅으로 .beancount 텍스트 파일에 기록합니다.
  • Validate & Reconcile: balance 어설션을 사용해 원장이 은행 명세와 일치하는지 확인하고 bean-check로 오류를 잡습니다.
  • Review: 조정되지 않은 시산표를 생성해 빠르게 sanity check를 합니다.
  • Adjust: 발생비용, 이연비용, 감가상각 및 기타 기간 말 항목에 대한 조정 분개를 기록합니다.
  • Re-review: 조정된 시산표를 확인해 모든 것이 정확한지 검증합니다.
  • Publish & Close: 손익계산서, 대차대조표, 현금흐름표를 생성합니다. Beancount에서는 보고서가 날짜를 인식하므로 장부 마감은 선택 사항입니다.

이 흐름은 다음과 같이 시각화할 수 있습니다:

graph TD
  A[Raw data - bank exports, receipts, invoices] --> B[Beancount Journal .beancount file]
  B --> C[Validation & Reconciliation<br/><code>balance</code> assertions · <code>bean-check</code>]
  C --> D[Unadjusted Trial Balance<br/><code>bean-query</code> · Fava]
  D --> E[Adjusting Entries<br/>accruals · deferrals · tax]
  E --> F[Adjusted Trial Balance]
  F --> G[Financial Statements<br/>P&amp;L · Balance Sheet · Cash Flow]
  G --> H[Closing - Retained Earnings]
  H -- new period --> B

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를 사용해 매월 장부를 마감하는 반복 가능한 체크리스트입니다.

flowchart TD
  cap[Capture Transactions] --> rec[Reconcile Accounts]
  rec --> review[Unadjusted Review]
  review --> adj[Post Adjustments]
  adj --> atb[Adjusted Review & Validate]
  atb --> pub[Publish Reports]
  pub --> wrap[Wrap-up & Archive]
  wrap --> cap
  • 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와 영원한 회계 사이클을 연결하면 견고하고 투명하며 오래 지속되는 시스템을 구축할 수 있습니다. 즐거운 부기 되세요!

출처: https://beancount.io/ko/blog/2025/08/13/the-accounting-cycle-beancount-style

게시됨: 2025년 8월 13일

마지막 업데이트: 2026년 9월 15일