수만 건의 개별 분개, 거대한 결산 장부로 뭉치다
28단계까지 우리는 '개별 거래'를 미시적으로 처리하는 데 집중했습니다.
이제 시야를 거시적으로 넓힐 때입니다. 수천, 수만 건의 승인된 분개 데이터를 Pandas로 집계하여 총계정원장 ➡️ 시산표 ➡️ 손익계산서 ➡️ 재무상태표를 관통하는 월말 결산(Closing) 파이프라인을 완성합니다.
거시적 회계: 결산(Closing)의 흐름
결산은 흩어져 있는 개별 거래 내역들을 한 달 치, 일 년 치 단위로 묶어 '기업의 성적표'를 발급하는 과정입니다. 시스템적으로는 완벽히 정해진 파이프라인을 탑니다.
Pandas 분개 집계와 총계정원장 생성
28단계에서 회계사가 승인한 journal_lines 테이블의 데이터가 다음과 같이 리스트업 되었다고 가정해 봅시다.
| date | account | debit | credit |
|---|---|---|---|
| 2026-08-01 | 보통예금 | 1000000 | 0 |
| 2026-08-05 | 임차료 | 300000 | 0 |
| 2026-08-06 | 소모품비 | 100000 | 0 |
| 2026-08-10 | 매출 | 0 | 500000 |
가장 중요한 Pandas 기술은 groupby 와 cumsum(누적합) 입니다. 총계정원장(특정 계정의 내역만 추려낸 장부)을 만들어 봅니다.
import pandas as pd # '보통예금' 원장만 필터링 후 날짜순 정렬 ledger = df[df["account"] == "보통예금"].copy() ledger = ledger.sort_values("date") # 누적 잔액(balance) 계산 ledger["balance"] = (ledger["debit"] - ledger["credit"]).cumsum()
이렇게 하면 건별 거래가 발생할 때마다 1,000,000 ➡️ 700,000 ➡️ 590,000 처럼 깎여나가는 잔액을 확인할 수 있습니다.
합계잔액시산표(Trial Balance)와 절대 검증
결산의 꽃이자 검문소인 시산표를 만듭니다. 모든 계정의 차/대변 합계를 싹 다 모아놓은 표입니다.
# 1. 모든 계정별 차변/대변 합산 trial = df.groupby("account")[["debit", "credit"]].sum().reset_index() # 2. 각 계정별로 순잔액(balance)을 차변/대변 위치에 맞춰 생성 (음수는 0처리) trial["debit_balance"] = (trial["debit"] - trial["credit"]).clip(lower=0) trial["credit_balance"] = (trial["credit"] - trial["debit"]).clip(lower=0) # 3. 절대 검증: 시산표의 차변합계와 대변합계는 무조건 일치해야 함 if trial["debit"].sum() == trial["credit"].sum(): print("✓ 시산표 정상: 결산 확정 프로세스로 진입") else: print("❌ 차대변 불일치: 결산 중단")
시스템은 이 차대변 일치 검증을 통과하지 못하면 "결산 확정 불가" 상태로 락(Lock)을 걸어버려야 합니다.
손익계산서와 재무상태표 분리 추출
시산표가 완성되면 28단계에서 만든 account_master 정보(계정 타입이 자산/부채/자본/수익/비용인지)와 Merge(병합) 합니다.
그리고 자산, 부채, 자본 계정만 빼내어 재무상태표(BS)를 만듭니다.
재무상태표 역시 자산 = 부채 + 자본 이라는 회계 항등식을 코드로 assert assets == liabilities + equity 하여 무조건 검증해야 합니다.
결산조정: 감가상각 룰 엔진과 조정분개
수동 분개만으로는 결산이 끝나지 않습니다. 시스템이 스스로 계산해서 떨궈야 하는 결산조정(Closing Adjustments) 로직을 구현합니다.
예를 들어 12,000,000원짜리 장비를 정액법 5년(60개월)으로 감가상각한다면 파이썬이 매달 자동으로 분개를 생성해냅니다.
def closing_adjustments(data): adjustments = [] # 매월 감가상각 계산 (12,000,000 / 60개월) monthly_depreciation = 12000000 / 60 # 200,000 # 결산 조정 분개 후보 생성 adjustments.append({ "debit": [{"account": "감가상각비", "amount": monthly_depreciation}], "credit": [{"account": "감가상각누계액", "amount": monthly_depreciation}] }) # (미수수익, 미지급비용, 선급비용, 재고자산 조정 로직 추가) return adjustments
전월 비교 증감률과 AI 결산 대시보드
숫자만 덜렁 나오면 안 됩니다. 파이썬으로 전월 데이터를 가져와 증감률(change / previous * 100)을 계산합니다. 만약 "비용이 50% 이상 급증"했거나 "미수금이 비정상적으로 늘었다면" AI에게 그 원인을 파악하라고 지시합니다.
결산보고서 자동 출력 (Excel & PDF)
모든 데이터가 준비되면, pd.ExcelWriter()를 이용해 시트별로 쪼개진 아름다운 엑셀 보고서를 1초 만에 생성해냅니다.
with pd.ExcelWriter("closing_report_202608.xlsx") as writer: trial.to_excel(writer, sheet_name="시산표", index=False) comparison.to_excel(writer, sheet_name="전월비교", index=False) balance_sheet.to_excel(writer, sheet_name="재무상태표", index=False) income_stmt.to_excel(writer, sheet_name="손익계산서", index=False)
향후엔 ReportLab 라이브러리를 추가하여, 고객사(경영진)에게 바로 보낼 수 있는 디자인된 PDF 결산 브리핑 리포트까지 자동 생성하게 됩니다.
30단계 예고: 단순 장부를 넘어선 'CFO 재무분석'
이제 우리는 완벽한 장부와 결산 데이터를 확보했습니다.
다음 30단계에서는 여기서 멈추지 않고, 만들어진 재무제표를 바탕으로 매출성장률, 영업이익률, 유동비율, 부채비율, 회전율 등 핵심 KPI를 도출하고 AI가 경영진단 브리핑을 해주는 "경영분석 시스템"을 완성해 보겠습니다.