AI가 먹을 수 있게 요리하라, 회계 데이터 자동수집기 (ETL)
AI가 엑셀 파일을 그대로 알아들을 수는 없습니다. 거래처마다 제멋대로인 엑셀 파일(거래일자, 전표일 등)과 스캔된 세금계산서 PDF를 Python(Pandas)과 OCR 기술로 읽어들이고, 누락과 오류를 솎아내어 규격화된 데이터베이스에 저장(ETL)하는 가장 실무적인 자동화 파이프라인을 배웁니다.
왜 이 과정이 회계사에게 가장 중요한가?
AI가 아무리 똑똑해도 "거래일시", "전표일", "거래일" 등 중구난방인 데이터를 던져주면 오류를 뿜어냅니다.
Python을 사용하여 비정형/반정형 파일(Excel, CSV, PDF)을 읽어들이고 표준화, 정제, 검증, 저장하는 과정(ETL)이야말로 매월 기장/결산 시 회계사와 직원들이 겪는 수작업 고통을 해결하는 열쇠입니다.
Pandas로 엑셀과 CSV 읽기
회계 실무 자동화의 영원한 친구 pandas 라이브러리를 사용합니다.
import pandas as pd from pathlib import Path file = Path("transactions.xlsx") ext = file.suffix.lower() if ext == ".xlsx": df = pd.read_excel(file) elif ext == ".csv": # 한글 깨짐 방지를 위해 utf-8-sig 인코딩 사용 권장 df = pd.read_csv(file, encoding="utf-8-sig")
💡 팁: 파일 내에 1월~12월까지 여러 시트(Sheet)가 있다면 pd.read_excel("file.xlsx", sheet_name=None)으로 전부 읽은 뒤 pd.concat()으로 하나의 표로 합칠 수 있습니다.
컬럼명 통일과 데이터 정제 (Normalization)
다양한 이름의 컬럼을 DB 스키마에 맞게 덮어쓰고, 문자로 입력된 금액(예: `1,200,000원`)을 숫자형으로 변경합니다.
def normalize_transactions(df): # 1. 컬럼명 표준화 df = df.rename(columns={ "거래일": "transaction_date", "전표일자": "transaction_date", "거래처명": "customer", "적요": "description", "금액": "amount" }) # 2. 날짜 및 금액 형변환 (결측치는 강제로 NaT, NaN 처리) df["transaction_date"] = pd.to_datetime(df["transaction_date"], errors="coerce") df["amount"] = df["amount"].astype(str).str.replace(",", "").str.replace("원", "") df["amount"] = pd.to_numeric(df["amount"], errors="coerce") return df
데이터 검증 (Validation)
정제된 데이터를 맹신해선 안 됩니다. 거래처나 금액이 누락되었는지, 또는 중복 결제(df.duplicated())가 있는지 찾아내 행 단위로 에러 태그를 붙입니다.
df["error"] = "" df.loc[df["customer"].isnull(), "error"] = "거래처 누락" df.loc[df["amount"].isnull(), "error"] = "금액 오류" # 에러가 있는 행만 골라서 엑셀로 떨궈줍니다. (회계사가 고쳐서 다시 올릴 수 있게) errors_df = df[df["error"] != ""] errors_df.to_excel("error_report.xlsx", index=False)
정상 데이터 DB 저장 (SaaS 연동)
검증을 통과한 데이터(`df["error"] == ""`)는 앞서 37단계 SaaS에서 배운 대로 반드시 `office_id` (Tenant 식별자)를 주입한 뒤 MariaDB로 밀어 넣습니다.
valid_df = df[df["error"] == ""] valid_df["office_id"] = current_office_id valid_df["customer_id"] = customer_id from sqlalchemy import create_engine engine = create_engine("mysql+pymysql://user:pass@localhost/accounting") valid_df.to_sql("transactions", engine, if_exists="append", index=False)
PDF / 스캔 이미지 OCR 파이프라인
전자세금계산서, 은행거래내역 같은 컴퓨터가 생성한 PDF(텍스트 PDF)는 PyMuPDF로 텍스트를 바로 긁어옵니다.
하지만 종이 영수증이나 스캔본(이미지 PDF)은 글씨가 그림 형태로 저장되어 있습니다. 이때는 Google Vision, Naver CLOVA OCR 또는 Tesseract 같은 OCR을 1차적으로 돌려 텍스트를 추출한 뒤, AI에게 "이 텍스트에서 공급가액, 부가세를 JSON으로 뽑아줘"라고 지시해야 합니다.
[명심] AI와 Python Rule의 결합
AI가 "공급가액: 1,000,000 / 부가세: 100,000 / 합계: 1,200,000" 라고 뽑아줄 수 있습니다. AI의 결과물을 그대로 DB에 맹신해 넣으면 안 됩니다.
AI는 '추출과 의미 판단'까지만 수행합니다.
반드시 파이썬 단에서 if total != supply_amount + vat: status="ERROR" 라는 룰 기반 논리 검증(Rule Validation)을 거친 후에만 정상 데이터로 편입시켜야 합니다.
39단계 예고: 엑셀 업무 자동화 스크립트 구축
이제 데이터를 AI 플랫폼 안으로 밀어 넣는 강력한 깔때기(ETL)가 생겼습니다.
다음 39단계에서는 웹 서버 백엔드가 아니라, 회계사분들이 로컬 PC에서 매일 수십 번씩 반복하는 "엑셀 파일 취합 ➡️ 피벗테이블 생성 ➡️ 증감률 계산 ➡️ 보고서 생성" 과정을 버튼 한 번으로 끝내는 궁극의 파이썬 실무 스크립팅을 직접 코딩해 보겠습니다.