이 글에서는 영수증 이미지에서 OCR로 필요한 정보를 추출하고, 월말정산용 Excel과 PDF 파일을 만드는 반자동화 흐름을 정리한다.
실제 회사명, 개인명, 영수증 이미지, 금액, 승인번호, 카드 정보, 내부 정산 기준은 공개하지 않는다. 대신 어떤 문제를 어떻게 나눴고, Codex Skill과 Python 스크립트를 어떤 역할로 사용했는지 중심으로 설명한다.
문제 정의
월말정산 업무는 매달 반복되지만, 생각보다 손이 많이 간다. 영수증을 모으고, 사용일과 사용처와 금액을 확인한 뒤, 지출 명세 양식에 맞춰 입력해야 한다. 이후 영수증 이미지를 PDF로 묶고, 지출 명세 파일과 함께 제출 가능한 형태로 정리해야 한다.
반복 업무이지만 완전히 단순하지는 않다. 영수증 이미지 품질에 따라 OCR 결과가 달라지고, 항목에 따라 분류 기준도 필요하다. 어떤 항목은 일반 경비로 처리하고, 어떤 항목은 별도 확인이 필요할 수 있다. 일부 항목은 내부 기준에 따라 금액이나 비고를 다시 확인해야 할 수도 있다.
그래서 이 작업의 목표도 “완전 자동 제출”이 아니었다. 목표는 검수 가능한 정산 초안 생성이었다. 사람이 최종적으로 확인해야 할 부분은 남기되, 반복적인 입력과 파일 생성 작업을 줄이는 방향으로 접근했다.
구현 구조
월말정산 자동화 구조는 크게 세 부분으로 나눴다.
WORKFLOW-AGENT/
├── scripts/generate_monthly_settlement.py
├── skills/monthly-settlement/
├── data/monthly-settlement/
│ └── receipts/
└── reports/monthly-settlement/
입력은 data/monthly-settlement/receipts/에 들어 있는 PNG 또는 JPG 형식의 영수증 이미지다.
스크립트를 실행하면 OCR 원본과 구조화된 CSV/JSON 파일은 data/monthly-settlement/에 저장하고, 최종 Excel/PDF 파일은 reports/monthly-settlement/에 저장한다.
처리 흐름은 아래와 같이 잡았다.
영수증 이미지
→ OCR 텍스트 추출
→ 사용일 / 사용처 / 금액 / 식별 정보 파싱
→ 항목 분류 및 확인 필요 여부 표시
→ raw CSV / JSON 저장
→ 지출 명세 Excel 생성
→ 영수증 PDF 생성
→ 최종 통합 PDF 생성
여기서 Python 스크립트는 반복 실행 로직을 맡는다. OCR로 영수증 텍스트를 읽고, 정규식으로 날짜와 금액 같은 값을 찾고, openpyxl로 Excel 파일을 만들고, PyMuPDF로 PDF를 생성하거나 합친다.
반면 monthly-settlement Skill은 업무 규칙을 맡는다. 예를 들어 정산 기간은 어떻게 볼지, 파일명은 어떤 형식으로 저장할지, 영수증 이미지는 어디에서 읽을지, 어떤 항목을 확인 필요로 표시할지 같은 기준을 문서화한다.
왜 중간 데이터를 저장했나
이 자동화에서 가장 중요하게 본 부분은 중간 데이터를 남기는 것이었다.
OCR은 틀릴 수 있다. 이미지가 흐리거나, 일부가 잘렸거나, 글자가 작거나, 줄 배치가 복잡하면 사용처나 금액이 잘못 읽힐 수 있다. 그래서 최종 Excel/PDF만 만들지 않고 중간 산출물을 따로 저장했다.
data/monthly-settlement/
├── monthly_settlement_raw.csv
└── monthly_settlement_ocr.json
CSV에는 스크립트가 추출한 사용일, 사용처, 원금액, 정산금액, 분류, 비고 같은 구조화 데이터가 들어간다. JSON에는 영수증별 OCR 원문을 저장한다.
이렇게 해두면 최종 파일을 검수하다가 이상한 값이 보였을 때 원인을 다시 확인할 수 있다. 예를 들어 Excel에서 금액이 이상하게 들어간 경우, CSV를 확인하고, 필요하면 OCR 원문까지 돌아가서 어떤 텍스트가 잘못 읽혔는지 볼 수 있다.
실무 자동화에서 이 부분은 중요하다. 자동화 결과를 믿으려면, 틀렸을 때 어디서 틀렸는지 추적할 수 있어야 한다.
Excel과 PDF 생성
정산 결과는 먼저 Excel 지출 명세로 만들어진다. 기존에 사용하는 양식이 있다면 그 구조를 참고해 값을 채우고, 별도 양식이 없다면 기본 양식으로 생성할 수 있다.
Excel에는 보통 아래와 같은 열이 들어간다.
| 사용일 | 사용처 | 금액 | 분류 | 비고 | 카드여부 |
이때 실제 카드번호, 승인번호, 개인 식별 정보처럼 외부 공유가 불필요하거나 민감한 값은 최종 산출물에 넣지 않도록 처리하는 것이 좋다. 필요한 경우 내부 검수용 raw 파일에만 남기고, 제출용 파일에서는 제외하는 식으로 구분할 수 있다.
PDF는 두 종류로 만든다. 하나는 지출 명세 PDF이고, 다른 하나는 영수증 이미지들을 A4 페이지에 배치한 영수증 PDF다. 마지막에는 두 PDF를 합쳐 최종 검수용 PDF를 만든다.
지출 명세 Excel
→ 지출 명세 PDF
영수증 이미지들
→ 영수증 PDF
지출 명세 PDF + 영수증 PDF
→ 최종 통합 PDF
이 흐름 덕분에 사람이 해야 할 일은 최종 Excel과 PDF를 열어 값이 맞는지 확인하는 쪽으로 줄어든다.
Skill과 Script의 역할 분리
이번 작업에서 중요하게 본 것은 Skill과 Script의 역할을 나누는 것이었다.
Python 스크립트는 기계적으로 반복 가능한 작업을 맡는다.
- 영수증 이미지 읽기
- OCR 실행
- 날짜와 금액 파싱
- CSV / JSON 저장
- Excel 생성
- PDF 생성 및 병합
반면 Skill은 사람이 정리해야 하는 업무 기준을 맡는다.
- 어떤 입력 폴더를 사용할지
- 어떤 파일명 규칙을 따를지
- 어떤 항목을 확인 필요로 표시할지
- 최종 산출물을 어디에 저장할지
- 민감정보를 어떻게 다룰지
- 자동 제출이 아니라 검수용 초안을 만든다는 점
이렇게 나누면 장점이 있다. OCR이나 PDF 생성 방식은 코드에서 관리하고, 정산 기준이나 파일 운영 규칙은 SKILL.md에서 관리할 수 있다. 나중에 저장 위치나 파일명 규칙이 바뀌어도 코드 전체를 수정하기보다 Skill 문서를 먼저 확인하면 된다.
좋았던 점
가장 큰 장점은 반복적인 파일 작업이 줄었다는 것이다.
영수증 이미지를 하나씩 보고 날짜와 금액을 옮기고, Excel 양식에 맞춰 입력하고, PDF로 다시 묶는 과정은 생각보다 실수하기 쉽다. 이 부분을 스크립트가 처리하게 하니, 사람은 최종 값이 맞는지 검수하는 데 더 집중할 수 있었다.
또 하나는 규칙이 문서화된다는 점이다. 정산 기간, 파일명, 저장 위치, 확인 필요 항목, 민감정보 처리 기준이 Skill에 적혀 있으니 다음 달에도 같은 기준을 적용할 수 있다.
자동화는 코드를 만드는 일이기도 하지만, 반복되는 업무 기준을 명확히 적는 일이기도 했다.
한계와 주의할 점
첫째, OCR 품질이 전체 결과의 품질을 좌우한다.
영수증 사진이 흔들렸거나 일부가 잘렸다면 결과가 틀릴 수 있다. 그래서 원본 이미지와 raw OCR 결과를 함께 확인할 수 있게 남겨두는 것이 필요했다.
둘째, 분류 규칙은 계속 관리해야 한다.
처음에는 단순한 분류만으로 충분할 수 있지만, 업무가 늘어나면 더 많은 예외가 생긴다. 예를 들어 일반 경비, 소모품, 회의비, 구독료처럼 항목이 늘어나면 분류 기준도 함께 정리해야 한다.
셋째, 정산 데이터는 민감하다. 영수증에는 사용처, 시간, 금액, 카드 정보 일부가 포함될 수 있다. 따라서 저장 위치, 공유 범위, 블로그 공개 여부를 조심해야 한다. 실제 영수증 이미지나 실제 금액을 공개하지 않는 것이 안전하다.
넷째, 이 방식은 자동 제출 시스템이 아니다. OCR 결과는 반드시 사람이 확인해야 한다. 자동화의 목적은 최종 검수를 없애는 것이 아니라, 반복적인 입력과 파일 생성 작업을 줄이는 데 있다.
정리
이번 월말정산 자동화에서 Codex Skill은 정산 업무의 운영 규칙을 맡고, Python 스크립트는 OCR, Excel, PDF 생성 같은 반복 처리를 맡았다.
이 둘을 나누니 사람이 판단해야 할 기준과 기계가 반복할 작업이 더 분명해졌다.
영수증 이미지
→ OCR 텍스트 추출
→ 구조화 데이터 저장
→ Excel 생성
→ PDF 생성
→ 사람이 최종 검수
이 작업을 통해 다시 느낀 점은 자동화의 목표가 사람을 없애는 것이 아니라는 점이다. 좋은 자동화는 사람이 검수해야 할 지점을 줄이고, 검수할 수 있는 근거를 더 잘 남긴다.
주간보고 자동화와 월말정산 자동화는 입력 데이터도, 산출물도 다르다. 하지만 공통 원리는 같았다. 반복 업무는 먼저 입력, 규칙, 산출물로 쪼개야 한다. 그리고 Skill에는 판단 기준을, Script에는 기계적 처리를 맡기는 편이 안정적이다.
참고
'Automation' 카테고리의 다른 글
| Codex Skill로 Notion 주간보고 자동화하기: PM 업무를 반복 가능한 워크플로로 만들기 (0) | 2026.06.01 |
|---|