본문으로 건너뛰기

"회계" 태그로 연결된 67개 게시물개의 게시물이 있습니다.

모든 태그 보기

Beancount 원장 해부: 비즈니스 회계를 위한 사례 연구

· 약 2분
Mike Thrift
Mike Thrift
Marketing Manager

오늘 블로그 포스트에서는 비즈니스를 위한 Beancount 원장을 상세히 분석하여, 이 평문 복식부기 회계 시스템의 복잡성을 이해하도록 도와드리겠습니다.

Beancount 원장 해부: 비즈니스 회계를 위한 사례 연구

먼저 코드를 살펴보겠습니다:

2023-05-22-business-template

1970-01-01 open Assets:Bank:Mercury
1970-01-01 open Assets:Crypto

1970-01-01 open Equity:Bank:Chase

1970-01-01 open Income:Stripe
1970-01-01 open Income:Crypto:ETH

1970-01-01 open Expenses:COGS
1970-01-01 open Expenses:COGS:Contabo
1970-01-01 open Expenses:COGS:AmazonWebServices

1970-01-01 open Expenses:BusinessExpenses
1970-01-01 open Expenses:BusinessExpenses:ChatGPT

2023-05-14 * "CONTABO.COM" "Mercury Checking ••1234"
Expenses:COGS:Contabo 17.49 USD
Assets:Bank:Mercury -17.49 USD

2023-05-11 * "Amazon Web Services" "Mercury Checking ••1234"
Expenses:COGS:AmazonWebServices 14490.33 USD
Assets:Bank:Mercury -14490.33 USD

2023-03-01 * "STRIPE" "Mercury Checking ••1234"
Income:Stripe -21230.75 USD
Assets:Bank:Mercury 21230.75 USD

2023-05-18 * "customer_182734" "0x5190E84918FD67706A9DFDb337d5744dF4EE5f3f"
Assets:Crypto -19 ETH {1,856.20 USD}
Income:Crypto:ETH 19 ETH @@ 35267.8 USD

코드 이해

  1. 계정 개설: 코드는 1970‑01‑01에 일련의 계정을 개설하면서 시작합니다. 여기에는 자산 계정(Assets:Bank:Mercury, Assets:Crypto), 자본 계정(Equity:Bank:Chase), 수익 계정(Income:Stripe, Income:Crypto:ETH), 그리고 비용 계정(Expenses:COGS, Expenses:COGS:AmazonWebServices, Expenses:BusinessExpenses, Expenses:BusinessExpenses:ChatGPT)이 포함됩니다.

  2. 거래: 이후 2023‑03‑01부터 2023‑05‑18까지 여러 거래가 기록됩니다.

    • 2023‑05‑14 거래는 CONTABO.COM에 $17.49를 Mercury Checking ••1234에서 지불한 내용이며, 비용(Expenses:COGS:Contabo)과 Assets:Bank:Mercury 계정에서의 차감으로 기록됩니다.

    • 2023‑05‑11 거래는 Amazon Web Services에 $14,490.33을 동일한 은행 계좌에서 지불한 것으로, Expenses:COGS:AmazonWebServices 아래에 기록됩니다.

    • 2023‑03‑01 거래는 STRIPE로부터 수익이 입금된 것으로, 총액 $21,230.75가 Assets:Bank:Mercury에 추가되고, 수익(Income:Stripe)으로 기록됩니다.

    • 2023‑05‑18 마지막 거래는 고객으로부터 19 ETH를 받은 암호화폐 거래이며, Assets:CryptoIncome:Crypto:ETH에 각각 기록됩니다. {1,856.20 USD}는 거래 시점의 ETH 가격을, @@ 35267.8 USD는 19 ETH 전체 가치(USD)를 나타냅니다.

모든 거래에서 복식부기 원칙이 적용되어 자산 = 부채 + 자본 방정식이 항상 성립하도록 유지됩니다.

최종 생각

이 Beancount 원장은 재무 거래를 추적하기 위한 간단하면서도 강력한 시스템을 제공합니다. 특히 마지막 거래에서 보듯이 Beancount는 암호화폐와 같은 비전통적 자산도 손쉽게 기록할 수 있어, 디지털 금융 환경에 매우 적합합니다.

이번 분석이 Beancount의 구조와 기능을 이해하는 데 도움이 되었기를 바랍니다. 회계 전문가이든 개인 재무를 처음 관리하는 초보자이든, Beancount는 여러분의 요구에 맞는 유연한 솔루션을 제공합니다. 다음 포스트에서는 보다 고급 Beancount 활용법을 다룰 예정이니 많은 기대 바랍니다.

새 고객을 위한 무료 플랜 재도입

· 약 2분
Mike Thrift
Mike Thrift
Marketing Manager

우리는 2023년 5월 1일부터 신규 고객을 위한 무료 플랜을 재도입하게 되어 매우 기쁩니다. 이번 결정은 플랫폼을 크게 개선하고 자원을 최적화하여 무료 및 유료 고객 모두에게 더 나은 서비스를 제공하기 위해 이루어졌습니다.

새로운 무료 플랜을 소개합니다

무료 플랜은 모두에게 접근 가능하고 사용하기 쉬운 서비스를 제공하겠다는 우리의 비전에서 언제나 핵심적인 부분이었습니다. 지난 몇 달 동안 우리가 만든 변화가 사용자에게 더욱 뛰어난 경험을 제공하면서 Pro 플랜 고객에게는 서비스 품질을 유지할 수 있게 할 것이라 믿습니다.

2023-04-28-start-serving-free-users

2023년 5월 1일 이후에 등록하는 신규 고객은 무료 플랜을 이용할 수 있습니다.

여러분의 지원과 충성도가 이번 무료 플랜 재도입을 재정적으로 가능하게 했습니다. 여러분의 기여 덕분에 우리는 인프라와 지원 시스템에 투자할 수 있었으며, 기대하시는 고품질 서비스를 지속적으로 제공하면서 새로운 사용자를 위한 플랫폼 접근성을 확대할 수 있었습니다. 여러분이 우리의 비전에 보여준 헌신은 우리를 성장하고 진화하게 만들었으며, 진심으로 감사드립니다. 함께 우리는 활기찬 커뮤니티를 구축하고 모든 배경의 사용자가 목표를 달성하도록 돕고 있습니다.

궁금한 점이나 우려 사항이 있으면 언제든지 연락해 주세요. 여러분의 피드백을 듣고 문제를 해결하기 위해 항상 대기하고 있습니다. 지속적인 지원에 감사드리며, 최상의 서비스를 제공하기 위해 최선을 다하겠습니다.

Beancount 치트 시트

· 약 2분
Mike Thrift
Mike Thrift
Marketing Manager

예시 계정명

Assets:US:BofA:Checking

치트시트

계정 유형

Assets          +
Liabilities -
Income -
Expenses +
Equity -

상품

CNY, EUR, CAD, AUD
GOOG, AAPL, RBF1005
HOME_MAYST, AIRMILES
HOURS

지시문

일반 구문

YYYY-MM-DD <Directive> <Parameters...>

계정 개설 및 종료

2001-05-29 open Expenses:Restaurant
2001-05-29 open Assets:Checking USD,EUR ; 통화 제약

2015-04-23 close Assets:Checking

상품 선언 (선택 사항)

1998-07-22 commodity AAPL
name: "Apple Computer Inc."

가격

2015-04-30 price AAPL   125.15 CNY
2015-05-30 price AAPL 130.28 CNY

메모

2013-03-20 note Assets:Checking "Called to ask about rebate"

문서

2013-03-20 document Assets:Checking "path/to/statement.pdf"

거래

2015-05-30 * "Some narration about this transaction"
Liabilities:CreditCard -101.23 CNY
Expenses:Restaurant 101.23 CNY

2015-05-30 ! "Cable Co" "Phone Bill" #tag ˆlink
id: "TW378743437" ; 메타데이터
Expenses:Home:Phone 87.45 CNY
Assets:Checking ; 금액을 하나 생략할 수 있습니다

포스팅

  ...    123.45 USD                             Simple
... 10 GOOG {502.12 USD} With per-unit cost
... 10 GOOG {{5021.20 USD}} With total cost
... 10 GOOG {502.12 # 9.95 USD} With both costs
... 1000.00 USD @ 1.10 CAD With per-unit price
... 10 GOOG {502.12 USD} @ 1.10 CAD With cost & price
... 10 GOOG {502.12 USD, 2014-05-12} With date
! ... 123.45 USD ... With flag

잔액 검증 및 패딩

; 지정된 통화에 대해서만 금액을 검증합니다:
2015-06-01 balance Liabilities:CreditCard -634.30 CNY

; 다음 검증을 만족시키기 위해 자동으로 거래를 삽입합니다:
2015-06-01pad Assets:Checking Equity:Opening-Balances

이벤트

2015-06-01 event "location" "New York, USA"
2015-06-30 event "address" "123 May Street"

옵션

option "title" "My Personal Ledger"

기타

pushtag #trip-to-peru
...
poptag #trip-to-peru
; 주석은 세미콜론으로 시작합니다

Beancount와 함께하는 플레인 텍스트 회계의 마법

· 약 4분
Mike Thrift
Mike Thrift
Marketing Manager

Discover the Magic of Plain Text Accounting with Beancount

Beancount.io banner

Introduction

2023-04-18-introduction-to-beancount

플레인 텍스트 회계가 더 이상 두려운 작업이 아닌 세상에 오신 것을 환영합니다. 오늘은 강력하고 유연하며 직관적인 플레인 텍스트 회계 도구인 Beancount를 소개합니다. Beancount는 투명하고 직관적인 접근 방식을 제공함으로써 여러분이 재무를 직접 관리할 수 있도록 돕습니다.

이 포괄적인 가이드에서는 Beancount의 기본 개념을 살펴보고 핵심 개념을 설명하며, 간단하지만 강력한 기능들을 단계별로 안내합니다. 이 블로그를 모두 읽고 나면 Beancount에 대한 확고한 이해를 갖게 되며, 재무 생활을 조직하고 분석하는 데 바로 활용할 수 있게 됩니다.

What is Beancount?

Beancount는 Martin Blais가 만든 오픈 소스 플레인 텍스트 회계 시스템입니다. John Wiegley의 Ledger 시스템에서 영감을 받아, 플레인 텍스트 파일만으로 개인 및 소규모 사업 재무를 관리할 수 있는 견고하고 신뢰할 수 있는 방법을 제공하고자 합니다. Beancount를 사용하면 수입, 지출, 투자 등을 손쉽게 추적할 수 있습니다.

Why Beancount?

플레인 텍스트 회계는 전통적인 스프레드시트 기반 또는 소프트웨어 기반 회계 시스템에 비해 여러 장점을 제공합니다.

  • 투명성: Beancount 파일은 사람이 읽을 수 있는 형식이므로 재무 데이터를 이해하고 감사하기가 쉽습니다.
  • 유연성: Beancount는 필요에 맞게 쉽게 커스터마이징할 수 있으며, 좋아하는 텍스트 편집기와 버전 관리 시스템을 사용해 재무 데이터를 관리할 수 있습니다.
  • 휴대성: 재무 데이터는 어떤 기기에서도 접근 가능하며, 시스템 간 이전이나 다른 사람과 공유도 간편합니다.
  • 미래 대비: 플레인 텍스트 파일은 보편적으로 호환되므로 기술이 변하더라도 재무 데이터에 계속 접근할 수 있습니다.

Beancount's Core Concepts

Beancount를 효과적으로 사용하려면 핵심 개념을 이해하는 것이 중요합니다.

  • 트랜잭션: 수입, 지출, 계정 간 이체 등 재무 이벤트는 트랜잭션으로 기록됩니다.
  • 계정: 트랜잭션은 자산, 부채, 수입, 지출 등 하나 이상의 계정을 포함합니다.
  • 복식부기: Beancount는 복식부기를 강제하여 모든 트랜잭션이 차변과 대변이 균형을 이루도록 합니다.
  • 지시문: Beancount는 트랜잭션, 계정 개설, 기타 재무 이벤트를 정의하기 위해 일련의 지시문을 사용합니다.

Getting Started with Beancount

Beancount를 시작하려면 다음 간단한 단계를 따르세요.

  • Beancount 설치: 운영 체제에 맞는 설치 안내에 따라 Beancount를 설치합니다.
  • Beancount 파일 생성: .beancount 확장자를 가진 새 플레인 텍스트 파일을 만듭니다 (예: my_finances.beancount).
  • 계정 정의: open 지시문을 사용해 트랜잭션에 사용할 계정을 정의합니다.
  • 트랜잭션 기록: txn 지시문을 사용해 재무 트랜잭션을 기록합니다.

또는 https://beancount.io 에서 바로 가입할 수도 있습니다. 아래는 플레인 텍스트 회계 예시입니다.

Example 1: Basic Transaction

2023-04-01 open Assets:Checking
2023-04-01 open Expenses:Groceries

2023-04-10 txn "Grocery Store" "Buying groceries"
Assets:Checking -50.00 USD
Expenses:Groceries 50.00 USD

이 예시에서는 Assets:CheckingExpenses:Groceries 두 계정을 개설합니다. 2023년 4월 10일에 식료품 구매 트랜잭션을 50에기록합니다.트랜잭션은Assets:Checking잔액을50에 기록합니다. 트랜잭션은 `Assets:Checking` 잔액을 50 차감(차변)하고, Expenses:Groceries 잔액을 $50 증가(대변)시킵니다.

Example 2: Income and Expense Transaction

2023-04-01 open Assets:Checking
2023-04-01 open Income:Salary
2023-04-01 open Expenses:Rent

2023-04-05 txn "Employer" "Salary payment"
Assets:Checking 2000.00 USD
Income:Salary -2000.00 USD

2023-04-06 txn "Landlord" "Monthly rent payment"
Assets:Checking -1000.00 USD
Expenses:Rent 1000.00 USD

이 예시에서는 Assets:Checking, Income:Salary, Expenses:Rent 세 계정을 개설합니다. 2023년 4월 5일에 2,000급여트랜잭션을기록하면Assets:Checking잔액이2,000 급여 트랜잭션을 기록하면 `Assets:Checking` 잔액이 2,000 증가(대변)하고 Income:Salary 잔액이 2,000감소(차변)합니다.46일에2,000 감소(차변)합니다. 4월 6일에 1,000 월세 트랜잭션을 기록하면 Assets:Checking 잔액이 1,000차감(차변)하고Expenses:Rent잔액이1,000 차감(차변)하고 `Expenses:Rent` 잔액이 1,000 증가(대변)합니다.

Example 3: Transfer Between Accounts

2023-04-01 open Assets:Checking
2023-04-01 open Assets:Savings

2023-04-15 txn "Bank" "Transfer from Checking to Savings"
Assets:Checking -500.00 USD
Assets:Savings 500.00 USD

이 예시에서는 Assets:CheckingAssets:Savings 두 계정을 개설합니다. 2023년 4월 15일에 체크 계좌에서 저축 계좌로 500을이체하는트랜잭션을기록하면Assets:Checking잔액이500을 이체하는 트랜잭션을 기록하면 `Assets:Checking` 잔액이 500 차감(차변)하고 Assets:Savings 잔액이 $500 증가(대변)합니다.

위 예시들은 Beancount의 복식부기 시스템 기본 개념을 보여줍니다. 트랜잭션을 올바르게 기록함으로써 사용자는 정확한 재무 기록을 유지하고, 재무 상황을 파악할 수 있는 보고서를 생성할 수 있습니다.

Generating Reports and Analyzing Data

Beancount는 대차대조표, 손익계산서 등 다양한 재무 보고서를 생성할 수 있는 강력한 도구 세트를 제공합니다. 또한 웹 기반 사용자 인터페이스인 Fava를 사용해 재무 데이터를 시각화하고 상호작용할 수 있습니다. https://beancount.io 는 MIT 라이선스로 제공되는 Fava 위에 구축되었습니다.

Conclusion

플레인 텍스트 회계의 힘과 단순함을 Beancount와 함께 누려보세요. 핵심 개념을 이해하고 이 가이드의 단계들을 따라 하면 개인이나 소규모 사업 재무를 손쉽고 정확하게 관리할 수 있습니다. Beancount에 익숙해지면 고급 기능과 커스터마이징 옵션을 탐색해 여러분만의 요구에 맞게 시스템을 최적화할 수 있습니다.

지출을 추적하든, 미래를 계획하든, 재무 습관을 분석하든, Beancount는 목표 달성을 위한 유연성과 투명성을 제공합니다. 사용자 친화적인 접근 방식을 통해 Beancount는 여러분의 재무 관리 방식을 혁신하고, 재무 미래를 스스로 통제할 수 있게 해줍니다.

이제 Beancount에 대한 탄탄한 기반을 갖추었으니 플레인 텍스트 회계 여정을 시작할 시간입니다. 번거로운 스프레드시트와 복잡한 소프트웨어는 이제 안녕하고, Beancount의 세계를 환영하세요. 즐거운 회계 되세요!

맞춤 링크와 쿼리로 Beancount 경험 향상

· 약 3분
Mike Thrift
Mike Thrift
Marketing Manager

Beancount는 개발자와 재무 매니아 모두에게 사랑받는 복식부기 회계 시스템으로, 단순함 속에 강력함을 가지고 있습니다. 하지만 Fava와 같은 Beancount 웹 인터페이스에서 더 많은 제어와 빠른 탐색을 원하는 사용자에게는 맞춤 사이드바 링크와 SQL 쿼리가 워크플로우를 한 단계 끌어올릴 수 있습니다.

이 가이드에서는 다음과 같은 방법을 보여드립니다:

  • Fava 사이드바에 빠른 접근 링크 추가
  • 고급 필터링 및 분석을 위한 SQL 쿼리 사용
  • 월간 검토 또는 이상 탐지를 위한 워크플로우 맞춤화

왜 Fava를 맞춤화할까요?

Fava는 이미 Beancount 원장을 보기 위한 아름다운 인터페이스이지만, 저널이 커짐에 따라 더 나은 바로가기와 스마트한 쿼리에 대한 필요성도 커집니다.

해결되는 문제점:

  • 시간 범위를 반복적으로 탐색
  • 중첩된 계정 전체의 거래 필터링
  • 음수 잔액이나 이상 현상을 더 빠르게 발견

✨ 맞춤 사이드바 링크

간단한 사이드바 바로가기로 일일 워크플로우를 개선해봅시다. 이 링크들은 Fava 왼쪽 사이드바에 표시되며 이번 달 거래나 지난 달 수입과 같은 필터링된 뷰로 바로 이동할 수 있습니다.

2021-01-01 custom "fava-sidebar-link" "Current Month" "/jump?time=month"
2021-01-01 custom "fava-sidebar-link" "Last Month" "/jump?time=month-1"
2021-01-01 custom "fava-sidebar-link" "Clear All" "/jump?account=&time=&filter="

동작 방식:

  • Current Month: 현재 달로 필터링된 거래 뷰를 엽니다.
  • Last Month: 이전 달로 즉시 이동합니다—월말 검토에 유용합니다.
  • Clear All: 필터를 초기화하여 모든 항목을 다시 표시합니다.

이 바로가기는 수동 시간 입력을 없애고 Fava 사용 경험을 보다 유연하고 개인화된 느낌으로 만들어 줍니다.

🔍 맞춤 SQL 쿼리

보다 깊은 인사이트를 위해 Fava의 SQL 인터페이스는 매우 강력합니다. 아래 쿼리는 패턴에 맞는 계정에서 모든 음수 잔액을 찾아줍니다—비정상적이거나 문제 있는 거래를 표시하기에 완벽합니다.

SELECT account, units(sum(position)), sum(position)
WHERE number(units(position)) < 0
AND account '.*:BCM:.*'
AND date >= DATE(2021,12,9)
AND date < DATE(2022,1,9)

상세 설명:

  • account '.*:BCM:.*': 이름에 :BCM:을 포함하는 계정을 필터링합니다.
  • number(units(position)) < 0: 음수 잔액을 표시합니다(예: 초과 지출된 예산).
  • 날짜 필터는 결과를 특정 1개월 기간으로 제한합니다.

활용 사례:

  • 중복 지출이나 잘못된 전표와 같은 오류 발견
  • 특정 공급업체나 카테고리 감사
  • 예산 책정을 위한 실행 가능한 인사이트를 빠르게 추출

🛠 전문가 팁: 링크와 쿼리 결합

Fava는 맞춤 쿼리로 직접 연결을 지원하지 않지만, 다음과 같이 월간 검토 습관을 만들 수 있습니다:

  • “Current Month” 링크를 사용해 검토 시작
  • 다른 창에서 저장된 쿼리 탭 열기
  • 두 화면을 동시에 검토—먼저 필터링하고, 그 다음 깊이 파고들기

이 조합은 이상이 확대되기 전에 포착하고 원장을 깨끗하게 유지하는 데 도움이 됩니다.

마무리 생각

Beancount는 설계상 최소주의이지만, 이러한 작은 개선이 효율성을 크게 높입니다. 예산을 검토하든, 이상한 잔액을 디버깅하든, 클릭을 절약하든, 맞춤 링크와 SQL 쿼리는 더 많은 힘과 적은 마찰을 제공합니다.

보너스: Fava의 맞춤 보고서를 사용한다면, 개인 재무 루틴에 맞춘 전체 대시보드까지 구축할 수 있습니다.

통제할 준비가 되셨나요?

작게 시작하세요: “Current Month” 링크를 추가합니다. 그런 다음 자신만의 쿼리를 구축하세요. 미래의 자신이 감사할 것입니다.

이와 같은 팁을 더 원하신다면, 뉴스레터를 구독하거나 Beancount.io에서 더 많은 Beancount 레시피를 살펴보세요.

Beancount에서 미래 거래 예측

· 약 1분
Mike Thrift
Mike Thrift
Marketing Manager

Beancount에는 미래 반복 거래를 예측하는 플러그인이 있습니다. beancount.io에 적용하려면 어떻게 할까요? 다음 내용을 귀하의 원장 파일에 넣으세요.

; import the plugin
plugin "fava.plugins.forecast"

; add a monthly HOA fee
2022-05-30 # "HOA fee [MONTHLY]"
Expenses:Hoa 1024.00 USD
Assets:Checking -1024.00 USD

예측 플러그인 스크린샷

2022-05-30-예측 플러그인

그럼 순이익 차트에서 예측 결과를 확인할 수 있습니다.

예측 플러그인

위의 [MONTHLY] 태그는 해당 거래가 영원히 반복됨을 의미합니다. 적용할 조건이 더 있다면 [MONTHLY UNTIL 2022-06-01], [MONTHLY REPEAT 5 TIMES], [YEARLY REPEAT 5 TIMES], 혹은 [WEEKLY SKIP 1 TIME REPEAT 5 TIMES] 를 시도해 보세요.

Beancount와 청구서 만들기 및 추적

· 약 5분
Mike Thrift
Mike Thrift
Marketing Manager

플레인‑텍스트 템플릿, 반복 가능한 워크플로, 그리고 “누가 아직 나에게 빚을 지고 있나요?” 라는 단일 쿼리


2022-02-12-crafting-tracking-invoices-with-beancount

청구서는 끝낸 작업과 기다리는 결제 사이에 끼어 있는 번거로운 일처럼 느껴질 수 있습니다. 하지만 좋은 청구서 프로세스는 건전한 현금 흐름의 핵심입니다. 두 가지 역할을 수행합니다: 고객에게 무엇을 언제 지불해야 하는지 명확히 알려주고, 회계 시스템에 필요한 확실한 사실을 제공합니다.

전용 SaaS 앱은 깔끔하고 자동화된 PDF를 보낼 수 있지만, 월 구독료가 발생하고 데이터를 독점적인 사일로에 가두는 경우가 많습니다. Beancount를 활용한 가볍고 플레인 텍스트 방식은 강력한 대안을 제공합니다. 각 청구서를 명확한 회계 항목 집합으로 전환하면 버전 관리, 풍부한 메타데이터, 즉시 쿼리와 같은 모든 이점을 누릴 수 있습니다—구독이 필요 없습니다.

최소 실행 가능한 청구서 (절대 빼먹어서는 안 될 항목들)

장부에 기록하기 전에 전문적인 청구서가 필요합니다. 형식은 간단할 수 있지만 내용은 정확해야 합니다. 오랜 시간 검증된 소기업 관행에서 차용한 이 항목들은 절대 협상할 수 없습니다.

  • 판매자 정보: 사업자명 및 실제 주소.
  • 고객 정보: 고객 이름 및 (가능하면) 주소.
  • 청구서 번호: 재사용되지 않는 고유하고 순차적인 ID. INV-045INV-044 다음 번호입니다.
  • 발행일 및 만기일: 청구서 발행일과 결제 예정일을 명확히 기재합니다.
  • 항목: 서비스 또는 제품에 대한 명확한 설명, 수량, 단가, 그리고 항목 합계.
  • 소계, 세금 및 총액: 계산식을 보여줘서 고객이 쉽게 이해할 수 있게 합니다.
  • 선택 메모: 감사 인사, 송금 안내, 혹은 고객이 제공한 구매 주문 번호 등을 적을 수 있습니다.

시작을 돕기 위해 모든 필드를 포함한 바로 편집 가능한 템플릿 세트를 만들었습니다. 스프레드시트 버전은 합계를 미리 계산해 줍니다.

Note: 청구서 템플릿은 곧 제공됩니다! 그 사이에 위에 나열된 필드를 사용해 Google Docs, Word, Sheets, Excel 또는 기타 문서 형식으로 직접 만들 수 있습니다.

청구서를 장부에 기록하기

청구서 PDF를 고객에게 보낸 후에는 Beancount에 기록해야 합니다. 이는 수익을 발생 시점에 인식하는 중요한 단계이며, 결제 시점이 아니라 수익이 발생했을 때 인식합니다. 이 과정은 두 개의 별도 거래로 구성됩니다.

1. 청구서를 발행할 때:

총액을 Income 계정에서 Assets:AccountsReceivable 로 이동하는 거래를 생성합니다. 이는 장부에 디지털 IOU를 만들게 됩니다.

; 2025‑07‑21 Invoice #045  Web design sprint for Acme Corp.
2025-07-21 * "Acme Corp" "INV-045 Web design sprint"
Assets:AccountsReceivable 3500.00 USD ; due:2025-08-04
Income:Design:Web
invoice_id: "INV-045"
contact_email: "ap@acme.example"
link: "docs/invoices/2025-07-21_Acme_INV-045.pdf"

여기서 AccountsReceivable 를 차변에, Income 계정을 대변에 기록합니다. 풍부한 메타데이터에 주목하세요: 만기일, 고유 invoice_id, 그리고 보낸 PDF에 대한 직접 link: 가 포함됩니다.

2. 고객이 결제할 때:

현금이 은행 계좌에 들어오면 두 번째 거래를 기록해 IOU 를 “정산”합니다. 이는 AccountsReceivable 잔액을 체크 계좌로 옮깁니다.

2025-08-01 * "Acme Corp" "Payment INV-045"
Assets:Bank:Checking 3500.00 USD
Assets:AccountsReceivable
invoice_id: "INV-045"

INV-045Assets:AccountsReceivable 잔액이 이제 0이 되었으며, 장부는 완벽히 균형을 이룹니다.

PDF 첨부: link: 메타데이터 키는 Fava( Beancount의 웹 인터페이스)와 함께 사용할 때 특히 강력합니다. Fava는 거래 보기에서 클릭 가능한 링크를 바로 렌더링하므로 원본 문서를 클릭 한 번으로 열 수 있습니다. 이 워크플로는 2016년 기능 요청에서 이미 구상되었습니다(GitHub).

모든 미결 청구서를 나열하는 하나의 쿼리

그렇다면 아직 누가 나에게 돈을 빚지고 있나요? 이 시스템을 사용하면 이메일이나 스프레드시트를 뒤질 필요가 없습니다. 단 하나의 간단한 쿼리만 있으면 됩니다.

open-invoices.sql 라는 파일로 저장하세요:

SELECT
meta('invoice_id') AS id,
payee,
narration,
date,
number(balance) AS outstanding
WHERE
account = "Assets:AccountsReceivable"
AND balance != 0
ORDER BY
date;

터미널에서 실행합니다:

bean-query books.beancount open-invoices.sql

몇 초 만에 모든 미결 청구서에 대한 최신 연령 보고서를 받아볼 수 있습니다. 청구서 ID, 고객, 발행일, 미지급 금액이 표시됩니다. 별도의 소프트웨어는 필요 없습니다.

반복 작업 자동화

플레인 텍스트의 가장 큰 장점은 스크립트화가 가능하다는 점입니다. 이 워크플로의 지루한 부분을 자동화할 수 있습니다.

  • 템플릿 + Pandoc = PDF: 청구서 템플릿을 Markdown 으로 유지합니다. 작은 Python 스크립트가 변수(고객명, 항목, 청구서 번호 등)를 채워주고, 명령줄 도구 Pandoc이 즉시 전문 PDF 로 변환합니다.
  • Git Pre‑commit Hook: 장부를 Git 으로 관리한다면, 간단한 pre‑commit 훅을 만들어 커밋 전에 검사를 실행할 수 있습니다. 새 invoice_id 가 고유한지, 거래 포스팅이 0 으로 균형을 이루는지, link: 메타데이터에 지정된 파일이 실제 존재하는지 확인합니다.
  • Cron Job: 예약 작업(cron)을 설정해 open-invoices.sql 쿼리를 매일 밤 실행하고 요약을 이메일로 받아보세요. 매일 아침 누가 친절히 리마인드가 필요한지 바로 알 수 있습니다.

현실적인 주의사항

Beancount는 회계 도구이며 청구서 서비스가 아닙니다. 고객에게 자동 결제 알림을 보내거나 신용카드 결제를 처리해 주지는 않습니다. 워크플로는 다음과 같습니다: 템플릿 등을 사용해 청구서를 만들고 전송한 뒤, 장부에 회계 항목을 기록합니다.

대부분의 프리랜서와 소규모 사업체에게 이 수동 단계는 견고하고 감사 가능한 무료 회계 시스템을 완전히 소유하고 제어할 수 있다는 큰 장점에 비해 작은 비용에 불과합니다(beancount.io).

다음 단계

청구서를 직접 관리하고 싶으신가요? 시작 방법은 다음과 같습니다.

  1. 템플릿을 다운로드하고 다음 실제 청구서를 만들 때 순차적인 청구서 번호를 사용하세요.
  2. 보낸 PDF 를 docs/invoices/ 와 같은 전용 폴더에 저장하고, Beancount 거래에 link: 메타데이터 키로 참조하세요.
  3. open-invoices.sql 쿼리를 저장하고 주간 재무 검토 시 실행하도록 습관화하세요.

플레인 텍스트 회계가 폴리시나 제어를 포기한다는 의미는 아닙니다— 데이터베이스가 grep 가능할 뿐입니다. 간단한 템플릿과 위 스니펫만 있으면 더 빨리 결제받고 장부는 언제나 깔끔하게 유지됩니다.

Beancount에서 조정 분개: 월말 정비

· 약 4분
Mike Thrift
Mike Thrift
Marketing Manager

회계는 마지막 매출이 은행에 입금될 때 끝나는 것이 아닙니다. 비즈니스 건전성을 진정으로 파악하려면 월말 정비가 필요합니다. 매 기간 마감 시 조정 분개를 수행하게 되며, 이는 수익과 비용을 올바른 기간에 배치하고 대차대조표를 정확하게 유지하는 저널 수정 작업입니다.

플레인‑텍스트 Beancount 원장에서는 이러한 핵심 분개가 투명하게 버전 관리되고 감사하기 쉬워, 번거로운 작업을 명확하고 반복 가능한 프로세스로 전환합니다.

2022-01-25-조정-분개-Beancount-월말-정비


조정 분개의 중요성

이러한 조정을 수행하는 것은 건전한 회계의 기본입니다. 재무제표가 정확하고 신뢰할 수 있게 됩니다.

  • 발생주의 정확성: 조정 분개는 발생주의 회계의 엔진입니다. 현금 흐름과 무관하게 실제로 수익이 발생하거나 비용이 발생한 기간으로 소득과 비용을 이동시킵니다. 이는 현대 회계의 핵심인 수익 인식대응 원칙을 충족합니다 (AccountingCoach.com).

  • 신뢰할 수 있는 KPI: 핵심 성과 지표는 그 뒤에 있는 데이터가 정확할 때만 의미가 있습니다. 총이익률, 순이익, 현금 흐름 예측 등은 이연, 발생 및 추정이 올바르게 반영될 때만 진실을 말합니다 (Corporate Finance Institute).

  • 깨끗한 감사 흔적: 명시적인 월말 조정은 재무 판단의 명확한 기록을 남깁니다. 이는 감사인(및 미래의 자신)이 무엇이 왜 변경되었는지 쉽게 추적하도록 도와주어 숫자에 대한 신뢰를 구축합니다 (Accountingverse).


여섯 가지 일반적인 카테고리 (Beancount 스니펫 포함)

아래는 가장 흔히 사용되는 여섯 가지 조정 분개 유형과 Beancount 원장에 기록하는 예시입니다. adj:"accrual" 같은 메타데이터를 활용해 나중에 쉽게 찾고 분석할 수 있습니다.

1. 발생 수익

이미 획득했지만 아직 청구하거나 결제받지 않은 수익에 대한 분개입니다.

2025-07-31 * "Consulting—July hours"
Assets:AccountsReceivable 12000.00 USD
Income:Consulting
; adj:"accrual" period:"Jul-25"

2. 발생 비용

이미 발생했지만 아직 지급하지 않은 비용, 예를 들어 다음 달에 청구될 공과금에 대한 분개입니다.

2025-07-31 * "Attorney—July retainer"
Expenses:Legal 2500.00 USD
Liabilities:AccruedPayables
; adj:"accrual"

3. 이연 (선수) 수익

고객이 미리 결제했을 때 적용합니다. 시간이 지나면서 수익을 점진적으로 인식합니다.

2025-07-31 * "Annual SaaS prepayment (recognize 1/12)"
Liabilities:UnearnedRevenue 833.33 USD
Income:SaaS
; adj:"deferral"

4. 선불 (이연) 비용

연간 보험료와 같이 비용을 미리 지급했을 때, 매월 일정 부분을 비용으로 전환합니다.

2025-07-31 * "Insurance—1 mo. expense from prepaid"
Expenses:Insurance 400.00 USD
Assets:PrepaidInsurance
; adj:"deferral"

5. 감가상각 및 무형자산 상각

컴퓨터나 차량 등 장기 자산의 비용을 사용 기간에 걸쳐 배분합니다.

2025-07-31 * "Mac Studio depreciation"
Expenses:Depreciation 1250.00 USD
Assets:Computers:AccumDepr
; asset_id:"MAC-03" adj:"estimate"

6. 대손충당금

수금이 어려울 것으로 예상되는 매출채권에 대한 추정으로, 대손비용으로 기록합니다.

2025-07-31 * "Bad-debt provision (2% of A/R)"
Expenses:BadDebt 700.00 USD
Assets:AllowanceForBadDebt
; basis:"A/R" rate:0.02 adj:"estimate"

반복 가능한 워크플로우

월말 마감을 효율적이고 오류 없이 진행하려면 일관된 워크플로우를 채택하세요.

  • 별도 파일 사용: adjustments-2025-07.bean 와 같이 기간별 조정을 한 파일에 모아두고, 메인 원장 파일에서는 include 지시문으로 마지막에 불러옵니다. 이렇게 하면 최종 보고서를 생성하기 직전에 조정이 적용됩니다.

  • 메타데이터 표준화: adj:"accrual|deferral|estimate"period:"Jul-25" 와 같이 일관된 키와 값을 항상 사용합니다. 이렇게 하면 특정 유형의 조정을 쿼리하고 검토하기가 쉬워집니다.

  • 사전 검증 실행: Git에 커밋하기 전에 bean-check 로 조정 파일을 검사해 오타나 불균형 포스팅을 잡아냅니다.

  • 한 줄 검증 수행: 아래 쿼리는 해당 기간의 모든 조정이 균형을 이루는지 확인해 주어 오류가 없음을 확신시켜 줍니다.

    bean-query main.bean "SELECT account, SUM(number) WHERE meta('adj') AND meta('period') = 'Jul-25' GROUP BY account"

빠른 문제 해결 팁 🤔

  • Liabilities:UnearnedRevenue 잔액이 계속 늘어나나요? 계약 마일스톤을 검토하세요. 작업 진행에 비해 수익 인식이 너무 늦어질 수 있습니다.

  • Assets:PrepaidInsurance 잔액이 음수인가요? 자산 일정보다 빠르게 비용을 인식하고 있을 가능성이 높습니다. 상각 일정을 다시 확인하세요.

  • 이연 후 DSO(매출채권 회수일)가 악화되나요? 발생 수익이 실제 회수 문제를 가릴 수 있습니다. KPI와 함께 A/R 에이징 보고서를 활용해 연체 고객을 조기에 파악하고 현금 흐름 문제를 예방하세요.


마무리 생각

조정 분개는 번거롭게 느껴질 수 있지만, “조정 전”과 “조정 후” 손익계산서를 비교하면 그 가치가 명확히 드러납니다. Beancount와 함께라면 이러한 조정은 작은 검색 가능한 패치가 되어 코드처럼 자동화하고 검토할 수 있습니다.

월말 습관을 길들여 두면 숫자는 엔지니어링만큼 정확하게 유지됩니다.

행복한 대차대조!

Beancount.io와 함께하는 개인 재무 관리 혁신

· 약 3분
Mike Thrift
Mike Thrift
Marketing Manager

Beancounters는 전통적으로 명령줄 도구나 사설 네트워크가 있는 자체 호스팅 서버를 사용했으며, 모바일에서는 컴퓨터나 일반 텍스트 편집기를 통해 작업해야 했습니다. Beancount.io는 오픈소스 Android 및 iOS 모바일 앱과 보안 클라우드를 제공하여 원장을 이제 지문 몇 번만으로 접근할 수 있게 하여 번거로움을 크게 줄였습니다.

Beancount는 텍스트 파일에서 복식부기를 가능하게 하는 컴퓨터 언어입니다. 파일에 금융 거래를 정의하면 다양한 보고서를 생성합니다. 이 언어의 설계자인 Martin Blais는 명령줄 회계가 빠르고, 휴대 가능하며, 개방적이고, 맞춤화가 가능하다고 주장합니다.

우리는 그의 주장을 강력히 지지하며, Beancount 언어가 제공하는 힘을 체감합니다. 그리고 더 많은 사람에게 이 기술을 소개하고 싶었습니다. 이는 사용성을 개선하고 더 넓은 청중에게 접근성을 높여야 함을 의미합니다.

2022-01-08-instant-access-to-your-beancount-cloud-ledger-anytime-anywhere

모두가 명령줄을 좋아하는 것은 아니기에, Beancount.io를 만들었습니다—모두를 위한 개인 재무 관리 도구입니다. 작동 방식은 다음과 같습니다:

무거운 작업을 위해 Beancounters는 여전히 컴퓨터에서 https://beancount.io에 접속하거나 Dropbox와 동기화하여 원장을 편집·조회할 수 있습니다. 이렇게 하면 명령줄 도구의 유연성을 유지하면서도 클라우드 기반 솔루션의 크로스 디바이스 접근성을 잃지 않습니다.

일상적인 가벼운 작업, 예를 들어 즉시 항목을 추가하고 싶을 때는 모바일 앱을 통해 보안 클라우드에 연결하면 됩니다.

이 제품의 백엔드 엔지니어인 Mike Thrift는 이렇게 말합니다.

매일 노트북을 열어 bean 파일에 기록을 입력하라는 알림을 설정하곤 했습니다. 이제 Beancount.io 덕분에 외출 중에 매장에서 물건을 구매하면서도 언제든지 원장을 수정할 수 있어 훨씬 편리합니다.

Facebook 출신 소프트웨어 엔지니어 Zhi Li는 이렇게 전합니다.

모든 Beancount 파일을 Beancount.io로 이전했으며, 이제 일상 사용에 완벽히 맞습니다. 자동 데이터 백업 같은 Pro 기능을 이용하고 있지만, 서비스 개선을 위해 여러분이 더 할 수 있는 부분이 있다고 생각합니다.

지금 바로 https://beancount.io/sign-up/ 에서 가입하거나 iOS 또는 Android App 을 다운로드하세요. 우리는 최소한의 정보만 수집하도록 회원가입 과정을 간소화했습니다. 그러면 바로 사용할 수 있는 빈 원장이 제공되어 즉시 항목을 추가할 수 있습니다.

자주 묻는 질문

Beancount.io가 내 원장 데이터를 제3자에게 판매하나요?

  • 아니요. 우리는 여러분의 데이터를 안전하고 비공개로 유지하기 위해 최선을 다하며, 원장 데이터를 절대 판매하지 않습니다.

내 데이터는 안전한가요?

  • 네. 우리는 이메일과 원장을 AES256으로, 비밀번호는 BCrypt으로, 네트워크 요청은 SSL로 보호합니다.

내 원장 데이터가 종단 간 암호화되어 있나요?

  • 아니요. 기술적 제약으로 인해 프로덕션 서버에서 원장 파일을 인덱싱할 때 데이터를 메모리로 복호화해야 합니다. 따라서 팀 구성원 중 누구도 직접 접근할 수 없도록 제한하고 있습니다. 비용 문제로 Intel SGX나 기타 보안 금고를 사용할 수 없습니다.

앞으로 몇 년간 신뢰할 수 있는 서비스인가요?

  • 네. 우리는 2019년 7월 4일 Beancount.io를 처음 출시했으며, 2년 이상 안전하고 안정적으로 서비스를 운영해 왔습니다. 따라서 앞으로도 서비스를 지속할 충분한 이유가 있습니다.

새로운 기능을 요청하거나 프로젝트를 후원할 수 있나요?

QuickBooks에서 Beancount로 마이그레이션 플레이북

· 약 25분
Mike Thrift
Mike Thrift
Marketing Manager

1단계: QuickBooks에서 데이터 내보내기

5년치 데이터를 마이그레이션하는 작업은 모든 QuickBooks 기록을 사용 가능한 형식으로 내보내는 것부터 시작됩니다. QuickBooks Desktop과 QuickBooks Online은 서로 다른 내보내기 옵션을 제공합니다:

1.1 QuickBooks Desktop – 내보내기 옵션

IIF (Intuit Interchange Format): QuickBooks Desktop은 목록(계정과목표, 고객, 공급업체 등)을 .IIF 텍스트 파일로 내보낼 수 있습니다. QuickBooks Desktop에서 파일 → 유틸리티 → 내보내기 → IIF로 목록 내보내기로 이동한 다음 필요한 목록(예: 계정과목표, 고객, 공급업체)을 선택하세요. 이렇게 하면 계정 이름, 유형 및 목록 데이터가 포함된 텍스트 파일이 생성됩니다. IIF는 독점적이지만 일반 텍스트 형식이므로 분석하기가 비교적 쉽습니다. 이를 사용하여 계정과목표와 연락처 목록을 캡처하여 Beancount에서 참조용으로 사용하세요.

CSV를 통한 총계정원장/분개장: 거래 데이터의 경우 QuickBooks Desktop은 원클릭 전체 내보내기 기능을 제공하지 않지만, 보고서를 사용할 수 있습니다. 권장되는 방법은 원하는 기간 동안의 분개장(모든 거래)을 내보내는 것입니다. QuickBooks Desktop에서 보고서 → 회계 및 세금 → 분개장을 열고, 날짜를 가장 빠른 거래부터 오늘까지로 설정한 다음, 내보내기 → Excel을 클릭하세요. 보고서 머리글/바닥글과 빈 열을 제거한 후 결과를 CSV로 저장하세요. 숫자 데이터가 깨끗한지 확인하세요: 센트 포함(예: 3이 아닌 3.00), 불필요한 따옴표 없음, CSV에 통화 기호나 이중 음수 부호 없음. CSV에는 Date, Trans #, Name, Account, Memo, Debit, Credit, Balance와 같은 열이 있어야 합니다(또는 보고서 형식에 따라 단일 Amount 열).

팁: QuickBooks Desktop 2015+ 버전에서는 찾기 대화상자를 통해서도 거래를 내보낼 수 있습니다. 편집 → 찾기 → 고급을 사용하고, 날짜 범위를 5년으로 설정한 다음, 결과를 CSV로 내보내세요. 경고: 일부 버전에서는 내보내기가 32,768줄로 제한됩니다. 데이터가 매우 큰 경우 잘림을 방지하기 위해 연도별(또는 더 작은 단위)로 내보낸 다음 나중에 결합하세요. 중복을 방지하기 위해 날짜 범위가 겹치지 않도록 하세요.

기타 형식 (QBO/QFX/QIF): QuickBooks Desktop은 .QBO (Web Connect) 또는 .QFX/.OFX 파일을 통해 은행 거래를 가져올 수 있지만, QuickBooks에서 내보내는 데는 일반적이지 않습니다. 목표가 은행 거래만 추출하는 것이라면 이미 은행에서 QBO/OFX 형식으로 가지고 있을 수 있습니다. 하지만 전체 원장 내보내기를 위해서는 IIF와 CSV를 사용하는 것이 좋습니다. QuickBooks Desktop은 타사 도구 없이는 QIF(Quicken Interchange Format)로 직접 내보낼 수 없습니다. 만약 QIF를 얻을 방법을 찾았다면, 일부 원장 도구(구 버전 Ledger 2.x)는 QIF를 읽을 수 있었지만, 저희 파이프라인에서는 CSV로 작업하는 것이 더 낫다는 점을 유의하세요.

1.2 QuickBooks Online – 내보내기 옵션

내장된 Excel/CSV 내보내기: QuickBooks Online (QBO)은 데이터 내보내기 도구를 제공합니다. 설정 ⚙ → 도구 → 데이터 내보내기로 이동하세요. 내보내기 대화상자에서 보고서 탭을 사용하여 데이터(예: 총계정원장 또는 거래 목록)를 선택하고 목록 탭에서 목록(계정과목표 등)을 선택한 후, 모든 날짜를 선택하고 Excel로 내보내세요. QuickBooks Online은 선택한 보고서 및 목록(예: 손익계산서, 재무상태표, 총계정원장, 고객, 공급업체, 계정과목표 등)에 대한 여러 Excel 파일이 포함된 ZIP 파일을 다운로드합니다. 그런 다음 이 Excel 파일들을 처리하기 위해 CSV로 변환할 수 있습니다.

거래 세부 정보 보고서: QBO의 기본 내보내기에 단일 총계정원장 파일이 포함되지 않은 경우, 수동으로 상세 보고서를 실행할 수 있습니다:

  1. 보고서로 이동하여 계정별 거래 세부 정보(또는 일부 QBO 버전에서는 총계정원장)를 찾습니다.
  2. 보고 기간을 전체 5년 범위로 설정합니다.
  3. 보고서 옵션에서 그룹화 기준 = 없음으로 설정합니다(소계 없이 개별 거래를 나열하기 위해).
  4. 열을 사용자 정의하여 최소한 다음을 포함하도록 합니다: 날짜, 거래 유형, 번호, 이름(수취인/고객), 메모/설명, 계정, 차변, 대변(또는 단일 금액 열), 그리고 잔액. 사용했다면 클래스나 위치도 포함합니다.
  5. 보고서를 실행한 다음 Excel로 내보내기를 합니다.

이렇게 하면 모든 거래의 상세 원장을 얻을 수 있습니다. 이것을 CSV로 저장하세요. 각 줄은 거래의 한 분개(posting)를 나타냅니다. 나중에 변환을 위해 거래별로 줄을 그룹화해야 합니다.

계정과목표 및 기타 목록: QuickBooks Online은 회계 → 계정과목표 → 일괄 작업 → Excel로 내보내기를 통해 계정과목표를 내보낼 수 있습니다. 계정 이름과 유형을 얻기 위해 이 작업을 수행하세요. 마찬가지로, 메타데이터로 이름을 가져오려면 고객, 공급업체 등을 내보내세요.

QuickBooks Online API (선택 사항): 프로그래밍 방식의 접근을 위해 Intuit는 QBO 데이터용 REST API를 제공합니다. 고급 사용자는 QuickBooks Online 앱을 생성하고(개발자 계정 필요) API를 사용하여 JSON 형식으로 데이터를 가져올 수 있습니다. 예를 들어, Account 엔드포인트를 쿼리하여 계정과목표를, JournalEntry 또는 GeneralLedger 보고서 엔드포인트를 쿼리하여 거래를 가져올 수 있습니다. API를 래핑하는 python-quickbooks와 같은 Python SDK가 있습니다. 그러나 API를 사용하는 것은 OAuth 인증을 포함하며, 자동화를 선호하지 않는 한 일회성 마이그레이션에는 과도한 작업입니다. 대부분의 경우, CSV/Excel로 수동 내보내기하는 것이 더 간단하고 오류가 적습니다.

2단계: 데이터 변환 및 정리

QuickBooks 데이터를 CSV(및/또는 IIF)로 얻었다면, 다음 단계는 이를 Beancount의 일반 텍스트 원장 형식으로 변환하는 것입니다. 여기에는 내보낸 파일을 파싱하고, QuickBooks 계정을 Beancount 계정과목표에 매핑하며, 거래를 Beancount 구문으로 형식화하는 작업이 포함됩니다.

2.1 Python으로 QuickBooks 내보내기 파일 파싱하기

Python을 사용하면 변환의 정확성과 재현성을 보장할 수 있습니다. 두 가지 주요 작업인 계정과목표 가져오기거래 변환을 위한 스크립트 개요를 설명하겠습니다.

계정 가져오기 및 매핑: 거래를 추가하기 전에 Beancount에서 계정을 설정하는 것이 중요합니다. QuickBooks 계정에는 유형(은행, 매출채권, 비용 등)이 있으며, 이를 Beancount의 계층 구조(자산, 부채, 수익, 비용 등)에 매핑할 것입니다. 예를 들어, 다음과 같은 매핑을 사용할 수 있습니다:

# QuickBooks 계정 유형을 Beancount 루트 카테고리에 매핑
AccountTypeMap = {
'BANK': 'Assets',
'CCARD': 'Liabilities',
'AR': 'Assets', # 매출채권을 자산으로
'AP': 'Liabilities', # 매입채무를 부채로
'FIXASSET': 'Assets',
'OASSET': 'Assets', # 기타 자산
'OCASSET': 'Assets', # 기타 유동 자산
'LTLIAB': 'Liabilities', # 장기 부채
'OCLIAB': 'Liabilities', # 기타 유동 부채
'EQUITY': 'Equity',
'INC': 'Income',
'EXP': 'Expenses',
'EXINC': 'Income', # 기타 수익
'EXEXP': 'Expenses', # 기타 비용
}

QuickBooks Desktop IIF 내보내기 파일 또는 QBO의 계정 목록 CSV를 사용하여 각 계정의 이름과 유형을 검색합니다. 그런 다음:

  • Beancount 계정 이름 생성: QuickBooks는 때때로 계정 이름에 콜론(:)을 사용하여 하위 계정을 나타냅니다(예: "Current Assets:Checking"). Beancount도 계층 구조에 동일한 콜론 표기법을 사용합니다. 종종 이름을 직접 재사용할 수 있습니다. QuickBooks 계정 이름이 카테고리로 시작하지 않으면 매핑된 카테고리를 앞에 붙입니다. 예를 들어, 유형이 BANK이고 이름이 "Checking"인 QuickBooks 계정은 Beancount에서 Assets:Checking이 됩니다. EXP(비용) 계정 "Meals"는 Expenses:Meals이 됩니다.

  • 유효한 이름 지정 보장: Beancount를 혼란스럽게 할 수 있는 문자를 제거하거나 대체합니다. QuickBooks는 이름에 &/와 같은 문자를 허용합니다. 특수 문자를 제거하거나 대체하는 것이 좋습니다(예: &and로 바꾸고, 슬래시나 공백 제거). 또한, 변환 후 모든 계정 이름이 고유한지 확인하세요. QuickBooks는 다른 상위 계정 아래에 동일한 하위 계정 이름을 허용했을 수 있지만, Beancount에서는 전체 이름(상위 포함)이 고유해야 합니다. 필요한 경우 이름을 바꾸거나 구분자를 추가하여 구별하세요.

  • 계정 개설(open) 구문 출력: Beancount에서는 사용되는 모든 계정이 open 지시어로 개설되어야 합니다. 첫 거래 이전 날짜를 선택할 수 있습니다(예: 2019-2023 데이터를 마이그레이션하는 경우 모든 개설에 2018-12-31 또는 더 이른 날짜 사용). 스크립트는 다음과 같은 줄을 작성합니다: 2018-12-31 open Assets:Checking USD 2018-12-31 open Expenses:Meals USD 각 계정에 대해 위와 같이 작성합니다(USD가 주 통화라고 가정). 각 계정에 적합한 통화를 사용하세요(아래 다중 통화 참고).

거래 변환: 가장 큰 과제는 QuickBooks 거래 내보내기 파일(CSV)을 Beancount 항목으로 변환하는 것입니다. 각 QuickBooks 거래(송장, 청구서, 수표, 분개 등)는 여러 개의 분개(줄)를 가질 수 있으며, 이를 하나의 Beancount 거래로 모아야 합니다.

Python의 CSV 리더를 사용하여 내보낸 줄을 반복하고 분개를 누적할 것입니다:

import csv
from collections import defaultdict

# QuickBooks 분개장 CSV에서 모든 줄 읽기
rows = []
with open('quickbooks_exported_journal.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for line in reader:
rows.append(line)

# 거래별로 줄 그룹화('Trans #'가 거래를 식별한다고 가정)
transactions = defaultdict(list)
for line in rows:
trans_id = line.get('Trans #') or line.get('Transaction ID') or line.get('Num')
transactions[trans_id].append(line)

이제 transactions는 각 키가 거래 ID/번호이고 값이 해당 거래의 분개 목록인 딕셔너리가 되었습니다. 다음으로, 각 그룹을 Beancount로 변환합니다:

def format_date(qb_date):
# QuickBooks 날짜는 "12/31/2019"와 같을 수 있음
m, d, y = qb_date.split('/')
return f"{y}-{int(m):02d}-{int(d):02d}"

output_lines = []
for trans_id, splits in transactions.items():
# 필요한 경우 줄 순서대로 분개 정렬 (보통 순서대로 나옴)
splits = sorted(splits, key=lambda x: x.get('Line') or 0)
first = splits[0]
date = format_date(first['Date'])
payee = first.get('Name', "").strip()
memo = first.get('Memo', "").strip()
# 거래 헤더
output_lines.append(f"{date} * \"{payee}\" \"{memo}\"")
if first.get('Num'): # 참조 번호가 있으면 포함
output_lines.append(f" number: \"{first['Num']}\"")
# 각 분개/포스팅 반복
for split in splits:
acct_name = split['Account'].strip()
# QuickBooks 계정 이름을 Beancount 계정으로 매핑 (이전 매핑 사용)
beancount_acct = account_map.get(acct_name, acct_name)
# 부호가 있는 금액 결정:
amount = split.get('Amount') or ""
debit = split.get('Debit') or ""
credit = split.get('Credit') or ""
if amount:
# 일부 내보내기 파일은 단일 Amount 열을 가짐 (크레딧은 음수)
amt_str = amount
else:
# 별도의 차변/대변 열이 있는 경우
amt_str = debit if debit else f"-{credit}"
# 안전을 위해 숫자의 쉼표 제거
amt_str = amt_str.replace(",", "")
# 통화 추가
currency = split.get('Currency') or "USD"
amt_str = f"{amt_str} {currency}"
# 분개에 대한 메모/설명
line_memo = split.get('Memo', "").strip()
comment = f" ; {line_memo}" if line_memo else ""
output_lines.append(f" {beancount_acct:<40} {amt_str}{comment}")
# 거래 끝 – 빈 줄
output_lines.append("")

이 스크립트 로직은 다음을 수행합니다:

  • 날짜를 Beancount를 위해 YYYY-MM-DD 형식으로 바꿉니다.

  • 수취인(Name)과 메모를 거래 설명으로 사용합니다. 예를 들어: 2020-05-01 * "ACME Corp" "Invoice payment" (수취인이 없는 경우 QuickBooks 거래 유형을 사용하거나 수취인을 빈 따옴표로 남길 수 있습니다).

  • 참조 번호(수표 번호, 송장 번호 등)가 있는 경우 number 메타데이터를 추가합니다.

  • 각 분개 줄을 반복합니다:

    • account_map 딕셔너리(계정과목표 단계에서 채워짐)를 사용하여 QuickBooks 계정 이름을 Beancount 계정으로 매핑합니다.
    • 금액을 결정합니다. 내보내기 파일에 따라 단일 Amount 열(양수/음수 값) 또는 별도의 차변 및 대변 열이 있을 수 있습니다. 위 코드는 두 경우 모두 처리합니다. Beancount에서는 포스팅당 부호가 있는 단일 숫자를 사용하므로 대변이 음수 금액으로 표시되도록 합니다.
    • 통화를 첨부합니다(다른 통화 열이 없는 한 USD로 가정).
    • 계정, 금액 및 줄 메모가 있는 주석과 함께 Beancount 포스팅 줄을 작성합니다. 예를 들어: Assets:Checking 500.00 USD ; Deposit Income:Sales -500.00 USD ; Deposit 이는 $500 입금(수익에서 예금으로)을 반영합니다.
  • 모든 분개를 나열한 후 빈 줄로 거래를 구분합니다.

다중 통화 처리: QuickBooks 데이터에 여러 통화가 포함된 경우, 각 포스팅에 통화 코드를 포함하세요(위에서 보인 바와 같이). 외화로 된 계정은 해당 통화로 개설되었는지 확인하세요. 예를 들어, EUR 은행 계좌가 있다면 open Assets:Bank:Checking EUR를 출력하고 해당 계좌의 거래는 EUR를 사용할 것입니다. Beancount는 다중 통화 원장을 지원하며 암묵적인 환산을 추적하지만, 보고서에서 기준 통화로의 환산을 원한다면 환율에 대한 가격 항목을 추가해야 할 수도 있습니다. Beancount 파일 상단에 주 운영 통화를 선언하는 것도 권장됩니다(예: option "operating_currency" "USD").

변환 실행: Python 스크립트(예: qb_to_beancount.py)를 저장하고 내보낸 파일에 대해 실행하세요. 모든 계정과 거래가 포함된 .beancount 파일을 생성해야 합니다.

2.2 특이 사례 및 데이터 정리 처리하기

변환 중에는 다음과 같은 일반적인 문제점과 해결 방법을 유념해야 합니다:

  • 계정 이름 불일치: QuickBooks 계정 이름이 Beancount의 계층적 이름과 충돌할 수 있습니다. 예를 들어, QuickBooks에는 각각 "Insurance"라는 하위 계정을 가진 두 개의 다른 상위 계정이 있을 수 있습니다. Beancount에서 Expenses:Insurance는 고유해야 합니다. 내보내기 전에 하나를 ("Insurance-Vehicle" vs "Insurance-Health")로 이름을 바꾸거나 스크립트에서 고유한 Beancount 계정으로 매핑하여 해결하세요. 일관된 이름 지정 규칙(특수 문자 없음, 계층 구조 사용)은 골칫거리를 줄여줍니다. 필요한 경우 재매핑 파일 접근 방식을 사용하세요: 이전 이름 → 새 Beancount 이름의 CSV 또는 딕셔너리를 유지하고 변환 중에 적용합니다(예제 코드는 account_map을 사용하며 파일에서 재정의를 로드할 수 있습니다).

  • 날짜 및 형식: 모든 날짜가 일관되게 형식화되었는지 확인하세요. 위 스크립트는 M/D/Y를 ISO 형식으로 정규화합니다. 또한, 5년 기간이 연말을 넘는 경우 회계 연도 대 달력 연도 문제에 주의하세요. Beancount는 회계 연도 경계를 신경 쓰지 않지만, 나중에 편의를 위해 파일을 연도별로 분할하고 싶을 수 있습니다.

  • 수치 정밀도: QuickBooks는 센트 단위로 통화를 처리하므로 센트로 작업하는 것은 보통 괜찮습니다. 모든 금액은 CSV에서 이상적으로 두 자리 소수점을 가져야 합니다. 금액이 정수(소수점 없음)로 바뀌거나 쉼표/괄호(음수용)가 있는 경우 스크립트에서 정리하세요(쉼표 제거, (100.00)-100.00으로 변환 등). 지침에 따라 올바르게 CSV를 내보냈다면 이러한 형식 문제는 이미 피했을 것입니다.

  • 음수 금액 및 부호: QuickBooks 보고서는 때때로 음수를 -100.00 또는 (100.00)로, 특정 Excel 내보내기에서는 --100.00로 표시하기도 합니다. 정리 단계에서 이를 처리해야 합니다. 각 거래의 차변과 대변이 합계가 0이 되는지 확인하세요. Beancount는 이를 강제합니다(균형이 맞지 않으면 가져오기 시 오류 발생).

  • 거래 중복: 거래를 배치로 내보내야 했다면(예: 연도별 또는 계정별), 중복 없이 병합하도록 주의하세요. 한 해의 첫 거래가 이전 배치의 마지막 거래가 아닌지 확인하세요. 경계에서 몇 개의 거래를 실수로 중복하기 쉽습니다. 중복이 의심되면 최종 Beancount 항목을 날짜순으로 정렬하고 동일한 항목을 찾거나, Beancount의 고유한 거래 태그를 사용하여 잡아낼 수 있습니다. 한 가지 전략은 QuickBooks 거래 번호를 메타데이터로 포함하고(예: Trans # 또는 송장 번호를 txn 태그 또는 quickbooks_id 메타데이터로 사용) 해당 ID의 중복이 없는지 확인하는 것입니다.

  • 불균형 분개 / 미결산 계정: QuickBooks는 QuickBooks가 "기초자본금" 또는 "이익잉여금"으로 자동 조정한 불균형 거래와 같은 이상한 사례가 있을 수 있습니다. 예를 들어, 초기 계정 잔액을 설정할 때 QuickBooks는 종종 차액을 자본 계정으로 게시합니다. 이것들은 내보낸 거래에 나타날 것입니다. Beancount는 명시적인 균형을 요구합니다. QuickBooks를 모방하기 위해 기초 잔액을 위한 자본 계정(일반적으로 Equity:Opening-Balances)을 도입해야 할 수도 있습니다. 원장의 첫날에 모든 계정의 시작 잔액을 설정하는 기초 잔액 항목을 두는 것이 좋습니다(5단계 참조).

  • 다중 통화 특이 사례: 다중 통화를 사용하는 경우, QuickBooks의 내보내기는 모든 금액을 자국 통화 또는 원래 통화로 나열할 수 있습니다. 이상적으로는 각 계정에 대해 원래 통화로 데이터를 얻으세요(QuickBooks Online의 보고서는 보통 그렇게 합니다). Beancount에서는 각 포스팅이 통화를 가집니다. QuickBooks가 환율이나 자국 통화 환산을 제공했다면, 그것들을 무시하고 Beancount의 가격 항목에 의존할 수 있습니다. QuickBooks가 환율을 내보내지 않았다면, 가치 평가를 맞추기 위해 주요 날짜에 대한 가격 기록(예: Beancount의 price 지시어 사용)을 수동으로 추가하고 싶을 수 있습니다. 그러나 기본 원장 무결성을 위해, 거래가 원래 통화로 균형을 맞추는 것만으로도 충분합니다. 미실현 손익은 동일한 보고서를 원하지 않는 한 명시적으로 기록할 필요가 없습니다.

  • 매출채권 / 매입채무: QuickBooks는 송장 및 청구서 세부 정보(만기일, 지급 상태 등)를 추적하지만 일반 원장에서는 완전히 이전되지 않습니다. A/R 및 A/P 거래(A/R을 증가시키는 송장, A/R을 감소시키는 지불 등)는 얻을 수 있지만, 송장 문서나 송장별 고객 잔액은 얻을 수 없습니다. 결과적으로, 마이그레이션 후 Beancount의 A/R 및 A/P 계정 잔액이 QuickBooks의 고객/공급업체 미결제 잔액과 동일한지 확인해야 합니다. 송장을 추적해야 하는 경우 Beancount의 메타데이터를 사용할 수 있습니다(예: invoice 태그 또는 링크 포함). QuickBooks 송장 번호는 Num 또는 Memo 필드를 통해 전달되었어야 합니다. 저희 스크립트는 Num을 거래 메타데이터에 number: "..."로 보존합니다.

  • 비활성 또는 폐쇄된 계정: IIF 내보내기에는 비활성 계정이 포함될 수 있습니다(포함하도록 선택한 경우). 가져와도 괜찮습니다(거래가 없고 정말 비활성이면 잔액이 0일 것입니다). 마지막 거래 날짜 이후에 Beancount에서 close 지시어로 폐쇄된 것으로 표시할 수 있습니다. 이렇게 하면 원장이 깔끔하게 유지됩니다. 예를 들어: 2023-12-31 close Expenses:OldAccount ; closed after migration 이것은 선택 사항이며 주로 깔끔함을 위한 것입니다.

위와 같이 데이터를 신중하게 정리하고 매핑함으로써, 구조적으로 QuickBooks 데이터를 미러링하는 Beancount 원장 파일을 갖게 될 것입니다. 다음 단계는 그것이 수치적으로도 QuickBooks를 미러링하는지 확인하는 것입니다.

3단계: 데이터 검증 및 조정

검증은 회계 데이터 마이그레이션에서 매우 중요한 단계입니다. Beancount 원장이 QuickBooks 장부와 한 푼도 틀림없이 일치하는지 확인해야 합니다. 여러 전략과 도구를 사용할 수 있습니다:

3.1 시산표 조정

시산표 보고서는 모든 계정의 기말 잔액(차변과 대변 또는 양수/음수로 표시)을 나열하며 합계가 0이 되어야 합니다. 두 시스템에서 동일한 날짜에 대한 시산표를 실행하는 것이 전반적인 정확성을 확인하는 가장 빠른 방법입니다.

  • QuickBooks에서: 마지막 해의 마지막 날(예: 2023년 12월 31일)에 대한 시산표 보고서를 실행하세요. 이 보고서는 각 계정의 잔액을 보여줍니다. 내보내거나 주요 수치를 기록해 두세요.

  • Beancount에서: Beancount의 보고 기능을 사용하여 시산표를 생성하세요. 쉬운 방법 중 하나는 명령줄을 이용하는 것입니다:

    bean-report migrated.beancount balances

    balances 보고서는 모든 계정과 그 잔액을 나열하는 시산표입니다. Fava(Beancount의 웹 UI)에서 파일을 열고 잔액 또는 재무상태표 섹션을 볼 수도 있습니다. Beancount의 모든 계정 잔액은 QuickBooks 시산표와 일치해야 합니다. 예를 들어, QuickBooks가 *매출채권 = 5,000를표시하면BeancountAssets:AccountsReceivable계정의합계는5,000*를 표시하면 Beancount의 Assets:Accounts Receivable 계정의 합계는 5,000(차변)이 되어야 합니다. *매출 수익 = 200,000이면BeancountIncome:Sales200,000*이면 Beancount의 Income:Sales는 200,000(대변)를 보여주어야 합니다 (대변을 음수로 표시하는 시산표를 사용하면 -200,000으로 표시될 수 있음).

불일치가 있는 경우, 원인을 찾아내세요:

  • 계정 전체가 누락되었거나 추가되었는지 확인하세요(계정을 잊었거나 마이그레이션 기간 전에 이미 폐쇄된 계정을 포함했는지?).
  • 잔액이 틀리면, 더 깊이 파고드세요: QuickBooks는 해당 계정에 대한 계정 빠른 보고서 또는 원장 세부 정보를 실행할 수 있으며, Beancount의 해당 계정 원장(bean-report migrated.beancount register -a AccountName)과 비교할 수 있습니다. 때로는 누락된 거래나 중복으로 인해 차이가 발생합니다.

또한 Beancount의 시산표에서 모든 계정의 합계가 0인지 확인하세요(0 또는 0에 매우 가까워야 하는 총계를 인쇄합니다). Beancount는 복식 부기를 강제하므로, 0이 아닌 불균형이 있다면 자산에서 부채-자본을 뺀 값이 0이 되지 않았음을 의미하며, 이는 문제를 나타냅니다(QuickBooks도 보통 허용하지 않지만 데이터가 일부 누락되면 발생할 수 있음).

3.2 계정 잔액 비교

시산표 외에도 특정 재무제표를 비교할 수 있습니다:

  • 재무상태표: QuickBooks 재무상태표를 마지막 날짜에 대해 실행하고 Beancount 재무상태표(bean-report migrated.beancount balsheet)를 실행하세요. 이는 시산표와 유사하지만 자산, 부채, 자본별로 정리되어 있습니다. 숫자는 범주별로 일치해야 합니다. 더 세분화된 확인을 위해 주요 계정 총액(현금, A/R, 고정 자산, 매입채무, 자본 등)을 비교하세요.

  • 손익계산서: QuickBooks와 Beancount에서 5년 기간(또는 연도별)에 대한 손익계산서를 실행하세요(bean-report migrated.beancount income은 전체 기간 손익계산서). Beancount의 순이익은 각 기간 동안 QuickBooks와 동일해야 합니다. 5년 전체를 마이그레이션했다면 누적 순이익이 일치해야 합니다. 또한 개별 수익 및 비용 총액을 비교하여 누락되거나 중복된 범주가 없는지 확인할 수 있습니다.

  • 무작위 거래 샘플링: 몇 개의 무작위 거래(특히 각 연도 및 각 주요 계정에서)를 선택하여 올바르게 마이그레이션되었는지 확인하세요. 예를 들어, 3년 전의 송장을 QuickBooks에서 찾은 다음 Beancount 파일에서 그 금액이나 메모를 검색하세요(모든 거래가 텍스트이므로 .beancount 파일을 텍스트 편집기에서 열거나 검색 도구를 사용할 수 있음). 날짜, 금액 및 계정이 일치하는지 확인하세요. 이는 날짜 형식 문제나 잘못 매핑된 계정을 찾는 데 도움이 됩니다.

3.3 자동 무결성 검사

Beancount 자체의 검증 도구를 활용하세요:

  • bean-check: bean-check migrated.beancount를 실행하세요. 이 명령은 파일을 파싱하고 구문이나 잔액 오류를 보고합니다. 스크립트가 개설되지 않은 계정이나 균형이 맞지 않는 거래와 같은 것을 놓쳤다면 bean-check가 이를 표시할 것입니다. 깨끗한 통과(출력 없음)는 파일이 최소한 내부적으로 일관성이 있다는 것을 의미합니다.

  • 잔액 검증(Balance Assertions): 추가적인 확인을 위해 주요 계정에 대한 명시적인 잔액 검증을 원장에 추가할 수 있습니다. 예를 들어, 특정 날짜의 은행 계좌 잔액을 알고 있다면 다음과 같은 줄을 추가하세요: 2023-12-31 balance Assets:Bank:Checking 10000.00 USD 그러면 bean-check는 원장에서 해당 날짜에 잔액이 실제로 $10,000인지 확인할 것입니다. 이것은 선택 사항이지만 중요도가 높은 계정에 유용할 수 있습니다. QuickBooks에서 기말 잔액(예: 각 연말)을 가져와 Beancount 파일에서 검증할 수 있습니다. 검증에 실패하면 Beancount가 차액을 보고합니다.

  • 시산표 롤포워드: 선호한다면, 기간별 확인을 할 수 있습니다. 각 연도에 대해 순 변화를 비교하세요. 예를 들어, QuickBooks 2020년 순이익 대 Beancount 2020년 순이익 등을 비교하여 각 연도가 자본으로 제대로 마감되었는지 확인합니다(QuickBooks는 매년 순이익을 이익잉여금으로 자동 이월합니다. Beancount에서는 누적 자본만 보게 될 것입니다). 차이가 보인다면 특정 연도 데이터에 문제가 있음을 나타낼 수 있습니다.

  • 거래 수 및 중복: QuickBooks 대 Beancount의 거래 수를 세어보세요. QuickBooks는 직접적인 수를 쉽게 보여주지 않지만, CSV의 줄 수를 세어(각 거래 헤더 대 분개) 가늠할 수 있습니다. Beancount에서는 파일에서 txn 또는 * "의 발생 횟수를 세는 것이 빠른 방법입니다. QuickBooks와 같거나 약간 높아야 합니다(기초 잔액 거래나 조정을 추가한 경우). 상당한 불일치는 무언가 생략되었거나 중복되었을 수 있음을 의미합니다. 메타데이터에 고유 ID를 사용하면 도움이 될 수 있습니다. 중복이 의심되면 Beancount 파일에서 동일한 수표 번호나 송장 번호가 두 번 나타나는지 검색해 보세요.

  • 대사 상태: 저희 스크립트에서는 QuickBooks의 확인된 상태에 따라 rec: "y" 또는 "n" 메타데이터를 포함했습니다(예제에서 rec로). 이것은 표준 Beancount 기능은 아니지만(Beancount는 Ledger와 같은 방식으로 확인/미결제 상태를 추적하지 않음), 유용한 메타데이터가 될 수 있습니다. QuickBooks에서 대사된 모든 거래가 있는지 확인할 수 있습니다. 궁극적으로 Beancount에서 은행 계좌를 새로 대사하는 것(명세서 사용)이 누락된 것이 없다는 최종 증거가 될 수 있습니다.

이러한 검증을 수행함으로써, 마이그레이션이 데이터를 보존했다는 확신을 가질 수 있습니다. 이 단계에 시간을 충분히 할애하세요 – 몇 달 후 장부에 의존하게 될 때보다 지금 이상 현상을 수정하는 것이 더 쉽습니다. 검증 실패 시 일반적인 문제는 계정의 기초 잔액 누락, 범위를 벗어난 날짜의 거래, 또는 항목의 부호 반전 등입니다. 모두 식별되면 수정할 수 있습니다.

4단계: Beancount 원장으로 커밋하기

정리 및 검증 후에는 데이터를 Beancount 원장 구조로 공식화할 차례입니다. 여기서 "커밋"이란 원장 파일을 최종화하고 감사 가능성을 위해 버전 관리 시스템에 체크인하는 것을 의미합니다.

4.1 원장 파일 및 구성 정리하기

Beancount 원장 파일을 어떻게 구성할지 결정하세요. 5년치 데이터의 경우 모든 것을 한 파일에 보관하거나 연도별 또는 카테고리별로 분할할 수 있습니다. 일반적이고 명확한 구조는 다음과 같습니다:

  • 메인 원장 파일: 예: ledger.beancount – 이것은 다른 파일을 include할 수 있는 진입점입니다. 전역 옵션을 포함하고 연간 파일을 포함할 수 있습니다.
  • 계정 파일: 계정과목표와 기초 잔액을 정의합니다. 예를 들어, 모든 open 지시어가 있는 accounts.beancount(스크립트에 의해 생성됨). 여기에 상품(통화)을 나열할 수도 있습니다.
  • 거래 파일: 연도별로 하나씩, 예: 2019.beancount, 2020.beancount 등, 해당 연도의 거래를 포함합니다. 이렇게 하면 각 파일을 관리 가능한 크기로 유지하고 필요할 때 특정 연도에 집중할 수 있습니다. 또는 엔티티나 계정별로 분할할 수도 있지만, 시간 기반 분할이 금융 데이터에 직관적입니다.

메인 파일 예시:

option "title" "내 사업 원장"
option "operating_currency" "USD"

include "accounts.beancount"
include "2019.beancount"
include "2020.beancount"
...
include "2023.beancount"

이렇게 하면 보고서를 실행할 때 모든 데이터가 집계되지만, 순서를 유지할 수 있습니다.

Beancount는 여러 파일을 요구하지 않으므로 하나의 큰 파일을 가질 수도 있지만, 위 구조는 명확성과 버전 관리를 향상시킵니다. Beancount 모범 사례에 따르면, 명확한 섹션 헤더를 사용하고 관련 항목을 논리적으로 그룹화하는 것이 좋습니다.

4.2 기초 잔액 및 자본 설정하기

마이그레이션이 절대적인 0에서 시작하는 것이 아니라면, 기초 잔액을 처리해야 합니다. 두 가지 시나리오가 있습니다:

  • 처음부터 시작하는 장부: 5년 기간이 사업 시작 시점부터 시작한다면(예: 2019년 1월에 모든 계정이 0이고 초기 자본만 있는 상태에서 QuickBooks 사용 시작), 별도의 기초 잔액 거래가 필요하지 않을 수 있습니다. 2019년의 첫 거래(은행 계좌로의 초기 자금 조달 등)가 자연스럽게 시작 잔액을 설정할 것입니다. 초기 자본금이나 이전 이익잉여금이 자본 거래를 통해 회계 처리되었는지 확인하기만 하면 됩니다.

  • 중간부터 시작하는 장부(부분 이력): QuickBooks를 더 일찍 시작했고 2019년이 중간 지점이라면, 2019년 1월 1일 기준으로 각 계정에는 이월된 잔액이 있었습니다. QuickBooks는 이를 기초 잔액 또는 이익잉여금으로 가지고 있었을 것입니다. Beancount에서는 시작 날짜 전날에 기초 잔액 항목을 만드는 것이 일반적입니다:

    • Equity:Opening-Balances(또는 유사한 이름)라는 자본 계정을 사용하여 모든 기초 금액의 합계를 상쇄합니다.
    • 예: 2018년 12월 31일에 현금이 10,000,A/R10,000, A/R이 5,000, A/P가 3,000(대변)이었다면다음과같은거래를작성합니다:20181231"기초잔액"Assets:Cash10000.00USDAssets:AccountsReceivable5000.00USDLiabilities:AccountsPayable3000.00USDEquity:OpeningBalances12000.00USD이렇게하면OpeningBalances는음수합계(3,000(대변)이었다면 다음과 같은 거래를 작성합니다: `2018-12-31 * "기초 잔액"` `Assets:Cash 10000.00 USD` `Assets:Accounts Receivable 5000.00 USD` `Liabilities:Accounts Payable -3000.00 USD` `Equity:Opening-Balances -12000.00 USD` 이렇게 하면 Opening-Balances는 음수 합계(-12k)를 가지게 되어 항목의 균형을 맞춥니다. 이제 모든 자산/부채 계정은 2019년을 올바른 잔액으로 시작합니다. 이것은 QuickBooks의 "이익잉여금"이나 이월 잔액을 반영해야 합니다.
    • 또는 Beancount의 padbalance 지시어를 사용합니다: 각 계정에 대해 Opening-Balances에서 pad하고 잔액을 balance로 검증할 수 있습니다. 이것은 더 자동화된 방법입니다. 예를 들어: 2018-12-31 pad Assets:Cash Equity:Opening-Balances 2018-12-31 balance Assets:Cash 10000.00 USD 이는 Beancount에게 해당 날짜에 현금이 10000 USD가 되도록 필요한 항목(Opening-Balances로)을 삽입하라고 지시합니다. 각 계정에 대해 이 작업을 수행하세요. 결과는 비슷하지만, 첫 번째 방법처럼 명시적인 거래를 작성하는 것도 간단합니다.
  • 이익잉여금: QuickBooks는 "이익잉여금" 거래를 명시적으로 내보내지 않으며, 단지 계산만 합니다. 마이그레이션 후, 생성하지 않았다면 Equity:Retained Earnings가 0인 것을 발견할 수 있습니다. Beancount에서 이익잉여금은 단지 이전 연도들의 이익입니다. 이익잉여금 계정을 만들어 매년 첫날에 이전 이익을 이체하거나, 자본이 모든 수익/비용의 합이 되도록 할 수 있습니다(보고서의 자본 섹션에 나타남). 투명성을 위해 일부 사용자는 매년 마감 분개를 합니다. 이것은 선택 사항이며 주로 표현을 위한 것입니다. 모든 거래를 마이그레이션했으므로, 매년 이익은 연간 보고서를 실행하면 자연스럽게 합산될 것입니다.

  • 비교 검사: 기초 잔액을 설정한 후, 시작 날짜에 재무상태표를 실행하여 모든 것이 올바른지 확인하세요(기초 잔액 대 기초 자본이 상쇄되어 0이 되는 것을 보여야 함).

4.3 최종화 및 버전 관리

이제 데이터가 Beancount 형식으로 정리되고 구조화되었으므로, 파일을 버전 관리 저장소(예: git)에 커밋하는 것이 현명합니다. 원장에 대한 각 변경 사항을 추적할 수 있으며, 모든 수정 사항에 대한 감사 추적을 가질 수 있습니다. 이것은 일반 텍스트 회계의 주요 장점입니다. 예를 들어, QuickBooks에서는 변경 사항을 쉽게 비교(diff)할 수 없지만, Beancount에서는 줄 단위 차이를 볼 수 있습니다. 일부 사용자들이 언급했듯이, Beancount를 사용하면 투명성을 얻고 필요할 때 변경 사항을 되돌릴 수 있는 능력을 갖게 됩니다. 모든 항목은 변경 이력에 연결될 수 있습니다.

이 초기 마이그레이션의 커밋을 v1.0 등으로 태그를 지정하여 QuickBooks에서 가져온 책의 상태를 나타내도록 하세요. 앞으로는 Beancount에 직접 새로운 거래를 입력하거나(또는 은행 피드에서 가져오기 등), 일반적인 소프트웨어 개발 관행(매월 또는 매일 커밋, 실험을 위한 브랜치 사용 등)을 사용할 수 있습니다.

Fava 또는 다른 도구 설정: Fava는 Beancount용 웹 인터페이스로 보고서를 쉽게 볼 수 있게 해줍니다. 커밋 후 fava ledger.beancount를 실행하여 재무제표를 탐색하고 QuickBooks 보고서와 마지막으로 한 번 더 비교하세요. UI에서는 작은 차이점을 더 쉽게 발견할 수 있습니다(예: 0이어야 할 계정이 작은 잔액을 보이는 것은 마감 항목이 누락되었거나 잘못된 거래가 있음을 나타냄).

이름 지정 규칙 및 일관성: 이제 완전한 통제권을 가졌으므로 일관성을 확보하세요:

  • 모든 계정은 대문자 카테고리 이름(Assets, Liabilities 등)으로 시작하는 명확한 이름을 가져야 합니다. 이상하게 보이는 것이 있다면(예: QuickBooks의 대소문자 불일치로 인한 Assets:assets:SomeAccount), 계정 파일에서 이름을 바꾸고 거래를 업데이트하세요(파일에서 빠른 찾기/바꾸기를 하거나 Beancount의 bean-format 또는 편집기의 다중 커서 사용).
  • 상품 기호(통화 코드)는 일관성이 있어야 합니다. USD의 경우 모든 곳에서 USD를 사용하세요($US$가 아님). 다른 통화의 경우 표준 코드(EUR, GBP 등)를 사용하세요. 이 일관성은 Beancount의 가격 조회 및 보고서에 중요합니다.
  • 생성되었을 수 있는 임시 또는 더미 계정을 제거하세요(예: 스크립트에서 알 수 없는 계정을 위해 Expenses:Miscellaneous를 포괄적으로 사용했다면, 모든 계정을 올바르게 매핑하여 제거하도록 노력하세요).

QuickBooks 닫기: 이 시점에서 QuickBooks와 일치하는 병렬 장부를 Beancount에 가지고 있어야 합니다. 일부는 누락된 것이 없는지 확인하기 위해 짧은 기간 동안 두 시스템을 병행하여 실행하기도 합니다. 그러나 검증이 확실하다면 QuickBooks 장부를 "닫을" 수 있습니다:

  • 이것이 기업 환경이라면, QuickBooks 원본 문서(송장, 청구서, 영수증)를 모두 기록용으로 내보내는 것을 고려하세요. 수동으로 첨부하지 않는 한 Beancount에는 존재하지 않을 것입니다.
  • QuickBooks 데이터의 백업(회사 파일과 내보내기 파일 모두)을 보관하세요.
  • 앞으로는 Beancount 원장을 기본 기록 시스템으로 유지하세요.

Beancount 원장에 데이터를 커밋함으로써 마이그레이션 파이프라인을 완료했습니다. 마지막 단계는 감사 및 재무제표의 일관성을 입증하여, 마이그레이션이 성공적이었음을 자신(그리고 모든 이해관계자나 감사인)에게 만족시키는 것입니다.

5단계: 마이그레이션 후 감사 및 예시

마이그레이션의 성공을 입증하기 위해, 재무제표의 전후 비교와 가능한 경우 거래의 차이(diff)를 준비하세요. 이는 장부가 일관성이 있다는 증거를 제공합니다.

5.1 재무제표 검증

QuickBooks와 Beancount 모두에서 동일한 날짜에 대한 주요 재무 보고서를 생성하고 비교하세요:

  • 2023년 12월 31일 기준 재무상태표: 자산, 부채, 자본 총액을 줄 단위로 비교하세요. 일치해야 합니다. 예를 들어, QuickBooks가 총 자산 = 150,000총부채+자본=150,000** 및 **총 부채 + 자본 = 150,000를 보였다면, Beancount 재무상태표도 동일한 총액을 보여야 합니다. 계정을 약간 다르게 구성했다면(예: 일부 하위 계정을 병합했다면), 비교 시 이를 조정하거나 다음 수준으로 세분화하여 합계가 동일한지 확인하세요.

  • 2019–2023 손익계산서: 각 연도(또는 전체 기간)의 총 수익, 총 비용, 순이익이 동일한지 확인하세요. QuickBooks가 보고서에서 일부 반올림을 했다면 사소한 차이가 발생할 수 있지만, 거래는 보통 센트 단위까지 정확하게 전달되므로 순이익은 정확해야 합니다. 특정 연도의 이익이 다른 경우, 해당 연도의 데이터를 자세히 살펴보세요. 종종 해당 기간의 누락 또는 중복 항목을 나타내는 지표입니다.

  • 시산표 차이: 가능하다면, 각 계정과 QuickBooks 대 Beancount의 잔액을 나열하는 스프레드시트를 만드세요. 일치할 것으로 예상되므로, 차이 열은 모두 0이 될 수 있습니다. 이것은 본질적으로 우리가 논의한 시산표 교차 확인이지만, 작성해 두면 문서화에 도움이 됩니다.

5.2 예시 비교 (전 vs 후)

아래는 데이터 일관성을 보여주는 예시 스니펫입니다. 2023년 12월 31일의 QuickBooks 시산표가 다음과 같다고 가정해 봅시다:

계정QuickBooks 잔액 (2023년 12월 31일)
자산
Assets:Bank:Checking$12,500.00 (차변)
Assets:Accounts Receivable$3,200.00 (차변)
부채
Liabilities:Credit Card$-1,200.00 (대변)
Liabilities:Loans Payable$-5,000.00 (대변)
자본
Equity:Opening-Balances$-7,500.00 (대변)
Equity:Retained Earnings$-2,000.00 (대변)
Equity:Current Year Profit$0.00

Beancount에서 2023년까지 모든 거래를 가져오고 게시한 후, bean-report balances(시산표)는 다음을 출력합니다:

계정Beancount 잔액 (2023년 12월 31일)
자산
Assets:Bank:Checking12,500.00 USD (차변)
Assets:Accounts Receivable3,200.00 USD (차변)
부채
Liabilities:Credit Card-1,200.00 USD (대변)
Liabilities:Loans Payable-5,000.00 USD (대변)
자본
Equity:Opening-Balances-7,500.00 USD (대변)
Equity:Retained Earnings-2,000.00 USD (대변)
Equity:Profit (2019-2023)0.00 USD

(참고: 자본 섹션은 다르게 구성될 수 있습니다. 중요한 것은 총액이 일치한다는 것입니다. 여기서 Beancount의 "Profit (2019-2023)"은 당기 순이익/이익잉여금을 합친 역할을 하며, 이익이 이익잉여금으로 마감되었기 때문에 0을 보여줍니다.)

보시다시피, 모든 계정이 센트 단위까지 일치합니다. 양쪽 모두 차변의 합계와 대변의 합계가 같습니다.

또한, 2023년 손익계산서를 실행하면:

  • QuickBooks: 수익 50,000,비용50,000, 비용 48,000, 순이익 $2,000.
  • Beancount: 수익 50,000,비용50,000, 비용 48,000, 순이익 $2,000 (이후 이익잉여금으로 마감되거나 연말 재무상태표의 자본 항목 아래에 나타남).

필요하다면 거래의 차이(diff)를 생성할 수 있지만, QuickBooks 데이터는 원장 형태가 아니므로 보고서에 의존하는 것이 더 효과적입니다. QuickBooks CSV와 Beancount 거래를 모두 날짜순으로 정렬하고 주요 필드를 비교하는 것을 최종 확인으로 할 수 있습니다(Excel이나 스크립트로 가능). 그러나 이전 검증을 신뢰한다면, 재무제표 확인만으로도 보통 충분합니다.

5.3 감사 팁

  • 감사인이나 이해관계자가 확신을 필요로 한다면, 전후 재무제표를 나란히 제시하세요. Beancount의 투명성은 실제로 감사를 단순화할 수 있습니다. 왜냐하면 재무제표의 모든 숫자를 원본 항목까지 신속하게 추적할 수 있기 때문입니다(특히 Fava의 드릴다운 기능 사용).
  • QuickBooks 백업과 내보낸 CSV를 감사 추적의 일부로 보관하세요. 마이그레이션 중에 이루어진 모든 조정 사항을 문서화하세요(예: "일관성을 위해 계정 X를 Y로 이름 변경" 또는 "명확성을 위해 거래 Z를 두 항목으로 분할" 등).
  • 앞으로는 Beancount에서 정기적인 확인을 구현하세요. 예를 들어, 은행 계좌의 월별 대사와 기말 잔액 검증은 데이터 문제나 입력 실수를 잡는 데 도움이 됩니다. 마이그레이션은 좋은 기준선을 제공합니다. 새로운 시스템에서 규율을 유지하면 지속적인 정확성을 보장할 수 있습니다.

마지막으로, 마이그레이션 완료를 축하하세요: QuickBooks에서 Beancount로 5년간의 회계 데이터를 성공적으로 이전했습니다. 이제 데이터는 완벽한 복식 부기 무결성을 갖춘 가볍고 버전 관리되는 텍스트 형식으로 존재합니다. 데이터를 내보내고, Python 스크립트로 변환하고, 시산표와 보고서를 통해 무결성을 검증했으며, 잘 정리된 Beancount 원장으로 커밋했습니다. 이 포괄적인 과정은 Beancount 원장이 5년 동안 QuickBooks 장부의 정확하고 충실한 복제본임을 보장하며, 앞으로의 회계 작업을 간소화할 수 있도록 준비시켜 줍니다.