부서별 운영결과 문서 (.hwp / .hwpx / .pdf) 를 자동으로 취합해 통계 엑셀 한 장으로 완성하는 실전 가이드
실전 경험을 통한 양파고의 한마디: 앞으로 자동화를 생각한다면 모든 양식은 .hwpx로 가자..(hwp버려)
목차
[깃허브]
[참고 영상]
0.자동화 프로젝트 구현 개요
0-1. 프로젝트 초기화
•
CLAUDE.md에 정의된 구조대로 초기화하면 툴·워크플로우 기본 뼈대 완성
•
Plan mode로 자동화 작업의 구체적 실행 계획 수립
•
지침(데이터 수집 방식, 스킬 등) 입력 → Claude가 적합한 실행 모드 제안
0-2. Claude와의 상호작용 및 계획 구체화
•
Claude가 질문을 통해 계획을 구체화함 — 유튜브 채널 추적, PDF 디자인 수준, Gmail 주소, Notion DB 여부 등
•
MCP 서버: AI가 외부 서비스를 직접 쓸 수 있게 해주는 연결 통로 (Gmail, Notion, 유튜브 등)
•
상황에 따라 MCP 대신 Python으로 API를 직접 호출하는 방식 선택 가능
•
플랜 완성 시 키워드 검색·PDF 생성·발송·데이터 누적·자동 실행 계획 수립
0-3. 파일 구조 및 워크플로우 생성
•
프로젝트 폴더 내 스케줄 설정, API 검색, 트렌드 분석, 리포트 생성, 발송, 저장 툴 자동 생성
•
워크플로우 문서: 주간 리포트 매뉴얼 · 최초 셋업 가이드 · 실행 파이프라인 · 각 툴 상세 설명 포함
1. 실전 미션: 자공고2.0 운영결과 통계 자동화
•
왜 양식은 똑같이 나가는데, 모여진 파일들은 제각각인가??
•
누군가는 양식을 바꾼다는 이야기(표도 바꾸고, 확장자도 바꾸고, 부서별 특징이 있으니 .. 그럴 수 있다!)
1-1. 미션 배경 및 문제 상황
[실제 예시파일]
▸ 실제 양식 핵심 항목 (샘플: 데이터과학 해커톤)
항목 | 예시값 |
프로그램명 | 2025. 데이터 과학 해커톤 |
운영장소 | 광양고등 1층 매화관, 기술실 |
계획 참가인원 | 24명 내외 |
실제 참여인원 | 2~3학년 학생 중 희망학생 43명 |
총 운영시간 | 2일, 10시간 |
운영기간 | 6.13.(금) ~ 6.14.(토) |
대상학년 | 2, 3학년 |
1-2. [핵심 이슈1] 파일 형식이 섞여있을 수 있음
파일 형식 | 특징 | 처리 방법 |
.hwpx | ZIP 구조 내 XML — 비교적 파싱 쉬움 | zipfile + xml 파싱 |
.hwp | 바이너리 형식 — 직접 파싱 어려움 | hwp5 라이브러리 또는 텍스트 추출 도구 |
.pdf | 레이아웃 고정 — 텍스트 추출 가능 | pdfplumber 또는 PyMuPDF |
✦ CLAUDE.md에 3가지 형식 처리 방법을 모두 명시해두면 Claude가 파일 확장자 자동 판별 후 적절한 파서를 선택함
1-3. [핵심 이슈2] 사람들이 양식을 파괴하기도 함
•
제출된 파일의 형식만 다른 게 아니라, 양식 자체가 변형되어 오는 경우도 빈번함.
•
Claude는 기준 양식과 비교해서 항목을 찾아야 하는데, 양식이 망가져 있으면 추출 자체가 실패함.
대표적인 양식 파괴 유형:
파괴 유형 | 실제 사례 | 문제 |
항목명 임의 변경 | "실제 참여인원" → "참가 학생 수" | 키워드 매칭 실패 |
표 행/열 추가·삭제 | 담당자가 칸을 늘리거나 합침 | 위치 기반 추출 오작동 |
셀 병합 변형 | 여러 항목을 하나의 셀에 합쳐서 입력 | 항목 분리 불가 |
내용을 표 밖에 작성 | 비고란 밖에 자유롭게 서술 | 파싱 범위 이탈 |
파일 내 이미지로 대체 | 표를 스크린샷으로 붙여넣기 | 텍스트 추출 불가 (OCR 필요) |
한글→PDF 변환 시 깨짐 | 폰트 임베딩 없이 PDF 저장 | 문자 깨짐 또는 공백 |
•
CLAUDE.md에 추가할 방어 로직(자동화 예시에 따라 달라질 수 있음)
## 양식 파괴 대응 전략
- 항목명이 정확히 일치하지 않아도 유사 표현으로 매핑할 것
예: "참가 학생 수" → 실제 참여인원, "운영 기간" → 운영기간
- 항목을 찾지 못한 경우 빈칸으로 처리하고 로그에 기록
- 표 구조가 무너진 경우 전체 텍스트에서 정규식으로 숫자 추출 시도
- 이미지 기반 내용이 감지되면 OCR 처리 후 재시도
- 처리 실패 파일은 처리로그.txt에 파일명 + 실패 사유 기록
Markdown
복사
•
Claude에게 줄 추가 지시(자동화 예시에 따라 달라질 수 있음)
양식이 변형된 파일도 있어.
항목명이 다르거나 표 구조가 바뀐 경우에도
최대한 내용을 추출하는 유연한 로직으로 만들어줘.
추출 실패 항목은 빈칸 처리하고 로그에 남겨줘.
Plain Text
복사
2. 실전 mission 시작
2-0. claude.md 파일 만들기
Claude.md란?
종합 명세서 같은 느낌!
•
이 파일역시 내가 모든 내용을 작성하는 것은 아님
•
초안을 만든 다음, 추가할 기능은 사람이 지시하는 것이 필요
[초안]
기능 00 (초기화) → AutoDocMerge/ 폴더 뼈대 + school-config.md 생성. 여기서 끝내고 파일 넣은 뒤 다음 단계로 넘어감
기능 01 (문서 취합) → input/ 안의 .hwp / .hwpx / .pdf 파싱 → output/통합통계.xlsx + 처리로그 생성
기능 04 (보고서) → 기능 01 결과물을 자동으로 물고 들어가서 output/보고서_초안.docx 생성. 기능 01을 먼저 돌리지 않으면 스스로 멈추고 안내
[수정안]
기능 | 트리거 | 입력 | 핵심 처리 | 출력 | 선행 조건 |
0 초기화 | "초기화해줘" | 없음 | 폴더 생성 · school-config.md · run.py · README.md 생성 | AutoDocMerge/ 뼈대 | 없음 |
01 문서 취합 | "문서 취합해줘" / 메뉴 1번 | input/ 파일 (.hwp/.hwpx/.pdf) + sample/ 기준 양식 | 확장자 판별 → 파서 선택 → 항목 추출 → 양식 파괴 대응 (매핑→정규식→OCR) | 통합통계.xlsx (집계표·오류·로그 시트 3개) | sample/ 에 기준 양식 필수 |
04 보고서 생성 | "보고서 써줘" / 메뉴 2번 | 통합통계.xlsx (기능 01 결과 자동 참조) + school-config.md | 미확인 항목 경고 → 승인 후 섹션 자동 채우기 | 보고서_초안.hwpx (불가 시 .docx fallback) | 기능 01 선실행 필수 — 없으면 멈추고 안내 |
05 사용법 안내 | "사용법 알려줘" / 메뉴 3번 | 없음 | 준비 순서·실행 방법·주의사항·FAQ 출력 | 터미널 출력 + README.md | 없음 |
2-1. 폴더 구조
•
Claude가 어떤 항목을 추출할지 샘플 양식을 기준으로 판단함.
•
샘플 없이 지시하면 항목 인식이 부정확해짐.
[색상 구분]
•
•
•
•
•
2-2. CLAUDE.md 작성 내용
# AutoDocMerge — 업무 지시서
> 자공고2.0 부서별 프로그램 운영결과 문서를 자동 취합하고 보고서를 생성하는 AI 직원입니다.
> 선생님들에게 배포할 목적으로 제작됩니다. 이 파일을 읽고 일합니다. 가볍게 유지하세요.
---
## 프로젝트 기술 스택
| 구성 요소 | 파일 타입 | 역할 |
|---|---|---|
| AI 지시서 | `CLAUDE.md` | Claude Code가 읽는 매뉴얼 |
| 학교 설정 | `school-config.md` | 사람이 편집하는 설정 파일 |
| 파서 도구 | `tools/parse_hwpx.py` 등 | hwpx / hwp / pdf 파싱 |
| 취합·통계 | `tools/merge_stats.py` | 엑셀 집계표 생성 |
| 보고서 생성 | `tools/make_report.py` | hwpx 보고서 생성 |
| 실행 진입점 | `run.py` | 더블클릭 실행 (비개발자용) |
| 사용법 안내 | `README.md` | 배포용 설치·사용 가이드 |
| 환경변수 | `.env` | API 키 보관 (절대 공유 금지) |
**배포 목표**: `run.py` 더블클릭 한 번으로 전체 실행 가능하도록 설계.
추후 `PyInstaller`로 `.exe` 단일 파일 패키징도 고려.
---
## 핵심 규칙
1. **플랜 먼저** — 바로 실행하지 말고 계획서 먼저 보여주기
2. **원본 파일 절대 수정 금지** — 결과물은 `output/` 폴더에만 저장
3. **파싱 실패 시 로그 기록 후 계속 진행** — 멈추지 않기
4. **`sample/` 없으면 작업 중단** — "sample/ 폴더에 기준 양식을 넣어주세요" 안내
5. **숫자 추출 시 단위 문자 제거** — '명', '시간', '일' 등 제거, UTF-8 유지
6. **결과물은 `output/` 폴더에만 저장**
7. **비개발자 배포 전제** — 코드 설명 없이 결과물과 다음 할 일만 안내
---
## 기능 00: 초기화
"초기화해줘"라고 하면 아래 순서대로 실행한다.
**폴더 및 파일 생성 (Windows PowerShell)**
```powershell
mkdir AutoDocMerge
cd AutoDocMerge
mkdir input, output, sample, tools
```
**`school-config.md` 생성**
```markdown
# 학교 설정
- 학교명:
- 담당 부서:
- 담당자:
- 연락처:
- 보고서 기준연도:
```
**`run.py` 생성** — 비개발자가 더블클릭으로 실행하는 진입점
```python
# run.py — 더블클릭으로 실행하세요
# 실행하면 메뉴가 나타납니다
from tools.merge_stats import run_merge
from tools.make_report import run_report
print("=" * 40)
print(" AutoDocMerge — 자공고2.0 문서 취합기")
print("=" * 40)
print("1. 문서 취합 · 통계 (기능 01)")
print("2. 연구학교 보고서 생성 (기능 04)")
print("3. 사용법 안내 보기 (기능 05)")
print("0. 종료")
print("-" * 40)
choice = input("번호를 입력하세요: ").strip()
if choice == "1":
run_merge()
elif choice == "2":
run_report()
elif choice == "3":
from tools.guide import run_guide
run_guide()
else:
print("종료합니다.")
```
**완료 보고**
```
초기화가 완료되었습니다!
📁 생성된 구조:
AutoDocMerge/
├── input/ ← 부서별 제출 파일 (.hwp / .hwpx / .pdf)
├── output/ ← 결과물 저장
├── sample/ ← ★ 기준 양식 파일 (반드시 넣어주세요)
├── tools/ ← 자동 생성 스크립트
├── run.py ← 더블클릭으로 실행
└── school-config.md ← 학교 정보 입력
다음으로 해주실 것:
1. school-config.md에 학교 정보를 채워주세요.
2. sample/ 폴더에 기준 양식 파일(.hwpx)을 넣어주세요.
3. input/ 폴더에 부서별 제출 파일을 모두 넣어주세요.
4. 준비되면 "문서 취합해줘"라고 말씀해주세요!
```
---
## 기능 01: 문서 취합 · 통계
"문서 취합해줘" 또는 "통계 내줘"라고 하면 실행한다.
`run.py` 메뉴 1번과 동일하다.
### 파일 형식별 처리
| 형식 | 처리 방법 |
|---|---|
| `.hwpx` | `zipfile` + `xml` 파싱 (python-hwpx 없으면 직접 파싱) |
| `.hwp` | `hwp5` 라이브러리 우선, 실패 시 텍스트 추출 fallback |
| `.pdf` | `pdfplumber` 우선, 실패 시 `PyMuPDF` fallback |
### 추출 대상 항목 (sample/ 기준 양식 구조 따름)
- 프로그램명 / 운영장소 / 대상 학년
- 계획 참가인원 (숫자만) / 실제 참여인원 (숫자만)
- 총 운영시간 (숫자만) / 운영기간 / 부서명 (파일명에서 추출)
### 양식 파괴 대응
- 항목명이 정확히 일치하지 않아도 유사 표현으로 매핑할 것
- 예: "참가 학생 수" → 실제 참여인원, "운영 기간" → 운영기간
- 표 구조가 무너진 경우 전체 텍스트에서 정규식으로 숫자 추출 시도
- 이미지 기반 내용이 감지되면 OCR 처리 후 재시도
- 항목을 찾지 못하면 빈칸 처리 후 오류 시트 + 처리로그.txt에 파일명 + 실패 사유 기록
### Claude에게 줄 추가 지시 (작업 중 문제 발생 시)
```
양식이 변형된 파일도 있어.
항목명이 다르거나 표 구조가 바뀐 경우에도
최대한 내용을 추출하는 유연한 로직으로 만들어줘.
추출 실패 항목은 빈칸 처리하고 로그에 남겨줘.
```
### 출력물 — `output/통합통계.xlsx` (시트 3개)
**시트 1: 집계표**
- 부서별 항목 집계표 + 합계행
- 추출 실패 항목은 빈칸, 배경색 노란색으로 표시
**시트 2: 오류·확인 필요사항**
| 파일명 | 부서명 | 오류 유형 | 상세 내용 | 확인 필요 항목 |
|---|---|---|---|---|
| 진로부_캠프.hwp | 진로부 | 양식 변형 | "참가 학생 수" → 매핑 처리 | 실제 참여인원 재확인 요망 |
| 정보부_로봇.pdf | 정보부 | 파싱 실패 | 이미지 기반 PDF | 전체 항목 수동 확인 요망 |
오류 유형 분류:
- `파싱 실패` — 파일 자체를 열지 못함
- `양식 변형` — 항목명이 기준 양식과 다름
- `항목 누락` — 해당 항목이 파일에 없음
- `값 이상` — 숫자가 아닌 값 또는 범위 초과
**시트 3: 처리로그**
- 파일명 / 처리 시각 / 결과(성공·실패) / 사용한 파서 / 비고
---
## 기능 04: 연구학교 보고서
"보고서 써줘" 또는 "운영결과 정리해줘"라고 하면 실행한다.
`run.py` 메뉴 2번과 동일하다.
### 사전 확인
- `output/통합통계.xlsx`가 있으면 자동 참조
- 없으면 "먼저 '문서 취합해줘'를 실행해주세요" 안내 후 중단
### 실행 순서
1. `school-config.md`에서 학교 정보 자동 반영
2. `output/통합통계.xlsx` 집계표 시트 데이터를 섹션별로 자동 채우기
3. 오류·확인 필요사항 시트에 미확인 항목이 있으면 보고서 생성 전 경고 출력
```
⚠ 확인이 필요한 항목이 N건 있습니다.
output/통합통계.xlsx → [오류·확인 필요사항] 시트를 먼저 검토해주세요.
그래도 계속 진행할까요? (예 / 아니오)
```
4. 플랜 먼저 제출 → 확인 받으면 문서 생성
5. `output/보고서_초안.hwpx` 저장
- `.hwpx` 생성 불가 시 `zipfile + XML` 방식으로 직접 생성
- 그것도 불가 시 `output/보고서_초안.docx` 로 fallback 후 사유 안내
### 보고서 기본 섹션 (자공고2.0 양식 기준)
1. 프로그램 운영 개요
2. 참여 인원 통계 (기능 01 집계표 자동 삽입)
3. 프로그램별 운영 내용 요약
4. 성과 및 개선사항
---
## 기능 05: 사용법 안내
"사용법 알려줘" 또는 `run.py` 메뉴 3번 실행 시 동작한다.
배포받은 선생님이 처음 실행했을 때 친절하게 안내하는 기능이다.
### 출력 내용 (터미널 또는 README.md 파일)
```
========================================
AutoDocMerge 사용법 안내
========================================
■ 이 프로그램은 무엇인가요?
부서별로 따로 제출된 한글 문서(.hwp/.hwpx)와 PDF를
자동으로 읽어서 통계 엑셀과 보고서를 만들어주는 도구입니다.
■ 처음 사용하시나요? 이 순서대로 하세요.
[준비]
1. school-config.md 파일을 메모장으로 열어
학교명, 담당 부서, 담당자 정보를 입력하세요.
2. sample/ 폴더에
기준이 되는 양식 파일(.hwpx) 하나를 넣으세요.
→ 이 파일을 기준으로 항목을 인식합니다.
3. input/ 폴더에
각 부서에서 받은 파일을 모두 넣으세요.
(.hwp / .hwpx / .pdf 섞여도 됩니다)
[실행]
4. run.py를 더블클릭하세요.
5. 메뉴에서 1번(문서 취합)을 선택하세요.
6. output/통합통계.xlsx 를 열어 결과를 확인하세요.
7. 오류·확인 필요사항 시트에 노란색 항목이 있으면
해당 원본 파일을 직접 열어 확인해주세요.
8. 메뉴에서 2번(보고서 생성)을 선택하면
output/보고서_초안.hwpx 가 만들어집니다.
■ 주의사항
⚠ input/ 폴더의 원본 파일은 절대 수정되지 않습니다.
⚠ 결과물은 항상 output/ 폴더에만 저장됩니다.
⚠ sample/ 폴더가 비어 있으면 프로그램이 작동하지 않습니다.
⚠ 파일명에 부서명을 포함해주세요.
예) 교무부_해커톤.hwpx, 진로부_캠프.pdf
■ 자주 묻는 질문
Q. .hwp 파일이 안 읽혀요.
A. output/처리로그.txt 를 열어 실패 사유를 확인하세요.
해당 파일만 .hwpx 또는 .pdf로 변환 후 다시 시도해보세요.
Q. 항목이 빈칸으로 나와요.
A. 해당 부서 파일의 양식이 기준 양식과 다를 수 있습니다.
output/통합통계.xlsx → [오류·확인 필요사항] 시트를 확인하세요.
Q. 보고서 글자가 깨져요.
A. 한글 프로그램(HWP)에서 .hwpx 파일을 열어주세요.
없으면 output/보고서_초안.docx 파일을 사용하세요.
========================================
문의: school-config.md 에 입력한 담당자 연락처
========================================
```
### README.md 자동 생성
초기화 시 위 내용을 바탕으로 `README.md` 파일도 함께 생성한다.
배포 시 선생님들이 파일을 열어 바로 읽을 수 있도록 마크다운 형식으로 작성한다.
---
## 파일 구조
```
AutoDocMerge/
├── CLAUDE.md ← 이 파일 (AI 지시서)
├── school-config.md ← 학교 설정
├── README.md ← 배포용 사용법 안내 (초기화 시 생성)
├── run.py ← 실행 진입점 (더블클릭)
├── .env ← API 키 보관 (절대 공유 금지)
├── input/ ← 부서별 제출 파일 (.hwp / .hwpx / .pdf)
├── output/
│ ├── 통합통계.xlsx ← 집계표 + 오류·확인 필요사항 + 처리로그
│ └── 보고서_초안.hwpx ← 최종 보고서 (fallback: .docx)
├── sample/ ← 기준 양식 파일
└── tools/
├── parse_hwpx.py ← .hwpx 파서
├── parse_hwp.py ← .hwp 파서
├── parse_pdf.py ← .pdf 파서
├── merge_stats.py ← 취합·통계 (기능 01)
├── make_report.py ← 보고서 생성 (기능 04)
└── guide.py ← 사용법 안내 (기능 05)
```
---
## 작업 톤
- 선생님한테 보고하듯이 결과물 전달
- "~했습니다" "~만들었습니다" 식으로
- 코드 설명 하지 않기 — 결과물과 다음 할 일만 안내
- 오류 발생 시 "어떤 파일에서 어떤 문제"인지 쉽게 설명
- 전문 용어는 괄호 안에 쉬운 설명 추가
Markdown
복사
2-3. VSCode GUI에서 단계별 실행
01
폴더 생성
(GUI로도 가능) | mkdir AutoDocMerge
cd AutoDocMerge
mkdir input, output, sample, tools |
•
폴더 생성 후, 하위 폴더로 ‘input, output, sample, tools’를 각각 만들기
•
폴더 및 하위 폴더 현황, CLAUDE.md 파일도 함께 넣기
02
VSCode 열기 | VSCode → 파일 → 폴더 열기 → AutoDocMerge 선택
오른쪽 AI 패널에서 Claude Code 아이콘 클릭 |
•
이렇게 분할화면으로 준비
•
반드시 파일을 해당폴더에 입력한 뒤 프롬프트 입력하기
•
이렇게 school-config.md파일과 run.py파일이 생기는 것을 확인한 뒤 다음단계로 진행
◦
중간 중간 powershell에 대한 진행 여부를 물을때마다 쿨하게 ‘yes’로 진행
◦
만약 이렇게 확인하는게 귀찮다면 claudecode의 모드를 바꾸면 됨
•
여기까지 문제없이 진행되었다면, 이렇게 사용자가 해야할일을 알려줌
◦
마치 신입사원이 부장님에게 이거이거 해주세요~ 하는 느낌
◦
혹시 모르니 폴더 구조를 체크하고, 해당 기능들이 서브기능들로 잘 구분되었는지 확인
•
파이썬 라이브러리를 설치하는 작업은 터미널에서 진행
04
Plan mode
전략 확인 | Ask before edits 모드로 전환 후:
CLAUDE.md와 sample/ 기준 양식을 먼저 읽어줘.
|
특이사항 | Claude가 계획 제출 → 항목 인식이 맞는지 검토 후 승인 |
•
작업중인 모습
•
특히, 자기개선 루프를 통해 오류를 스스로 잡고, 다른 해결방식을 찾는 모습이 마치 사람과 같음
•
만약 중간 중간 오류가 난다면?
◦
특히 관련 라이브러리가 없어서 오류가 나는 경우가 많으므로 교차검증 + 라이브러리 설치 자동화를 프롬프트로 제시
그래. 실제 양식 기준으로 업데이트하고
기능 01 기준으로 형식별 파싱 방법과 추출 항목 오류없는지 정확히 체크해. 그리고 . 도움될 Python 라이브러리도 조사해서 바로 설치해줘
Markdown
복사
•
아마도 이 단계에서 엄청나게 많은 토큰을 소모할 것으로 예상됨
◦
◦
그래도 hwpx가 선녀임.. hwp는 퇴출되어랏!
왜 그런가?( 포맷 구조 차이)
HWP (구형) | HWPX (신형) | |
내부 구조 | 독점 바이너리 (OLE Compound) | ZIP + XML (오픈 표준) |
공개 여부 | 비공개 독점 포맷 | OWPML 표준 공개 |
파이썬 라이브러리 | pyhwp 하나뿐 (유지보수 거의 중단) | zipfile + lxml 기본 라이브러리로 직접 파싱 가능 |
인코딩 문제 | 자주 발생 | 없음 (UTF-8) |
텍스트 추출 | CLI(hwp5txt) 우회 필요 | XML 직접 읽기 |
표/이미지 접근 | 매우 어려움 | XML 구조 탐색으로 가능 |
HWPX는 그냥 ZIP 파일
•
이 문구가 나온다면 test가 성공한 것임!
05
실행 | Edit automatically 모드로 전환 후에
계획대로 모든 파일 수합해
또는 Ask before edits모드로 전환 후에
계획대로 실행해줘.파일 수정 전에 먼저 알려줘.필요한 패키지 설치 명령어도 같이 알려줘. |
특이사항 | → tools/ 안에 파서 스크립트 자동 생성
→ 자기 개선 루프 돌아가며 에러 자동 수정 |
•
이전까지는 프로그램을 만드는 과정이였다면, 이제는 만들어진 프로그램으로 자동화를 시작하는 단계
•
시작부터 밑밥을 까는 claude코드,, 왜 휴먼의 냄새가 나지?
•
자기개선루프는 계속 작동되고 있음
•
역시나 예상했듯.. hwp파일 파서는 제대로 작동이 안되니..
•
숨겨왔던 비장의 무기를 꺼내보자
[자기개선 루프]
AI가 스스로 생성한 출력을 다시 학습 데이터나 피드백으로 활용해서 성능을 높이는 순환 구조
모델 출력 → 평가/필터링 → 학습 데이터로 재활용 → 더 나은 모델
↑___________________________________|
Markdown
복사
[파일 형식의 문제]
•
pdf로 변환하여 추출할 것이냐? vs hwpx로 저장하여 추출할 것이냐?
•
역시 일잘러AI는 자기가 스스로 test를 진행해 보겠다네.
•
역시 일잘러AI는 자기가 스스로 test를 진행해 보겠다네.
06
output/ 결과 확인 | output/통합통계.xlsx 열어서 시트 3개 확인:
시트1 집계표 — 노란셀이 있으면 해당 원본 파일 직접 확인
시트2 오류·확인 필요사항 — 파싱 실패 · 양식 변형 · 항목 누락 목록
시트3 처리로그 — 파일별 성공/실패 기록 |
•
확인된 결과를 확인해보면?
◦
예상대로 시트3개가 표시됨
•
그리고 사용자의 확인이 필요한 부분은 노란색 음영처리
07
추가 지시
(결과 이상 시) | 양식이 변형된 파일도 있어.
항목명이 다르거나 표 구조가 바뀐 경우에도
최대한 내용을 추출하는 유연한 로직으로 만들어줘.
추출 실패 항목은 빈칸 처리하고 로그에 남겨줘. |
•
여기까지 왔다면 90% 완성
08
보고서 생성 | 보고서 써줘, 보고서 생성 시작해, 보고서 진행시켜 등
(생성될 보고서는 hwpx) |
특이사항 | → 오류 시트 미확인 항목 있으면 경고 출력 → 확인 후 진행
→ output/보고서_초안.hwpx 생성 (불가 시 .docx fallback) |
•
슬슬 클로드의 토큰이 걱정되기 시작함




•
실제 만들어진 한글수합문서 확인 결과는요??
•
그럴줄 알았음
•
그 후로 2~3번의 프롬프트를 입력했고.. 결과는?
•
완성된 결과는요??
•
이제 표형태로 만들자..회사로 치면 사수인 내가 부사수인 AI에게 정확한 설명을 하지 못한 댓가인듯??
•
프로젝트 하나에 pro 토큰 사용을 다 소진해버린다는 이야기가 진짜였음
•
한계치에 다다르면 이런 경고 메시지가 나옴
•
최종 결과물(사실 더 수정해야 하지만, 토큰 문제로 여기까지만..)
•
바이브 코딩.. 역시 끝이 없다..
09보안리뷰 | 전체 코드 보안 리뷰해줘. API 키나 파일 경로가 코드에 하드코딩된 곳 없는지 확인해줘. |
특이사항 | API키 유출 주의 |
•
귀찮더라도.. 혹시 모르니 꼭 진행해야 하는 단계
•
또 다시 등장하는 진행좌!
3 수정 또 수정
3-1. 자주 발생하는 문제와 대처법
문제 상황 | 원인 | Claude에게 줄 지시 |
.hwp 파일 읽기 실패 | hwp5 미설치 또는 바이너리 파싱 실패 | "hwp 파싱 실패 시 텍스트만 추출하는 fallback 방법 써줘" |
인원수 추출 오류 | "43명", "24명 내외" 등 형식 불일치 | "숫자만 추출하는 정규식 로직 강화해줘" |
PDF 표 구조 인식 실패 | 스캔 PDF이거나 이미지 기반 | "OCR 방식으로 텍스트 추출하는 방법도 추가해줘" |
엑셀 집계 항목 누락 | 부서마다 항목명이 약간씩 다름 | "유사 항목명 매핑 테이블을 CLAUDE.md에 추가해서 처리해줘" |
3-2. MCP vs API vs skill 언제 뭘 써야 하나?
구분 | API 직접 호출 | MCP 서버 |
비유 | 도구를 하나씩 직접 꺼내 씀 | 앱스토어에서 앱 하나 깔면 기능 묶음 제공 |
적합한 상황 | 파일 처리, 자동 실행 스케줄 시스템 | 실시간 대화형 작업, 즉각 연동 |
이번 미션 | hwpx/hwp/pdf 파싱, 엑셀 집계 → API | 결과물 Google Drive 자동 저장 → MCP |
4 배포 및 자동 실행 (Windows)
4-1. 배포란?
워크플로우와 코드를 서버에 올려놓는 것. 이후 매뉴얼대로 시스템이 스스로 작동함. 업데이트가 필요하면 CLAUDE.md 수정 후 재배포.
4-2. CLAUDE.md 정교화
•
지금까지의 작업을 바탕으로 CLAUDE.md 수정 하기
지금까지의 작업을 바탕으로 CLAUDE.md를 최적화 해서 저장해. 특히 어떤 부분을 업데이트했는지 업데이트 내용.txt파일을 생성해
Markdown
복사
•
CLAUDE.md 를 배포하기 위한 정교화 작업
•
수정된 CLAUDE.md 예시
# AutoDocMerge — 업무 지시서
> 자공고2.0 부서별 프로그램 운영결과 문서를 자동 취합하고 보고서를 생성하는 AI 직원입니다.
> 선생님들에게 배포할 목적으로 제작됩니다. 이 파일을 읽고 일합니다. 가볍게 유지하세요.
---
## 프로젝트 기술 스택
| 구성 요소 | 파일 타입 | 역할 |
|---|---|---|
| AI 지시서 | `CLAUDE.md` | Claude Code가 읽는 매뉴얼 |
| 학교 설정 | `school-config.md` | 사람이 편집하는 설정 파일 |
| 파서 도구 | `tools/parse_hwpx.py` 등 | hwpx / hwp / pdf 파싱 |
| 취합·통계 | `tools/merge_stats.py` | 엑셀 집계표 생성 |
| 보고서 생성 | `tools/make_report.py` | hwpx 보고서 생성 |
| 실행 진입점 | `run.py` | 더블클릭 실행 (비개발자용) |
| 사용법 안내 | `README.md` | 배포용 설치·사용 가이드 |
| 환경변수 | `.env` | API 키 보관 (절대 공유 금지) |
| 의존성 목록 | `requirements.txt` | `pip install -r requirements.txt` |
**배포 목표**: `run.py` 더블클릭 한 번으로 전체 실행 가능하도록 설계.
---
## 핵심 규칙
1. **플랜 먼저** — 바로 실행하지 말고 계획서 먼저 보여주기
2. **원본 파일 절대 수정 금지** — 결과물은 `output/` 폴더에만 저장
3. **파싱 실패 시 로그 기록 후 계속 진행** — 멈추지 않기
4. **`sample/` 없으면 작업 중단** — "sample/ 폴더에 기준 양식을 넣어주세요" 안내
5. **숫자 추출 시 단위 문자 제거** — '명', '시간', '일' 등 제거 후 마지막 숫자 또는 단위 직전 숫자 추출
6. **결과물은 `output/` 폴더에만 저장**
7. **비개발자 배포 전제** — 코드 설명 없이 결과물과 다음 할 일만 안내
8. **중복 파일 처리** — 동일 파일명의 hwpx+hwp 동시 존재 시 hwpx 우선 처리
---
## 실제 양식 구조 (sample/ 분석 결과)
`[양식]25년 자공고2.0 부서별 프로그램 운영결과 통계(서식).hwp` 기준
### 표 내부 항목명 (header → FIELD_ALIASES 매핑)
| 양식 항목명 | FIELD 키 | 비고 |
|---|---|---|
| 프로그램명 | `프로그램명` | |
| 특이사항 | `특이사항` | |
| 운영장소 | `운영장소` | |
| 대상 | `대상학년` | "대상학년", "참가대상" 등도 매핑 |
| 참가인원 | `계획참가인원` | "참가인원" 별칭 포함 |
| 운영일정 | `운영기간` | "운영일정", "사업기간" 별칭 포함 |
| 성취기준(강의목표) | (추출 대상 아님) | |
### 표 밖 별도 기재 항목
| 텍스트 패턴 | FIELD 키 |
|---|---|
| `실제 참여인원: N명` | `실제참여인원` |
| `총 운영시간: N시간` | `총운영시간` |
### FIELD_ALIASES 설계 원칙
- `"프로그램"` 단독 별칭 **제외** — "프로그램 운영결과" 제목에 오매핑됨
- `"참여인원"` 단독 별칭 **제외** — "실제 참여인원"에 오매핑됨
- 숫자 필드는 단위 직전 숫자 우선 추출 (예: "43명" → 43, "2~3학년 43명" → 43)
---
## 파서 동작 방식 (기능 01)
### .hwp 파일 — parse_hwp.py
```
1순위: hwp5proc xml → 표 셀 텍스트까지 추출 (핵심)
hwp5proc 경로: APPDATA/Python/PythonXXX/Scripts/hwp5proc.exe
표 구조: <hp:tbl> → <hp:tr> → <hp:tc> → <hp:subList> → <hp:t>
2순위: hwp5txt fallback (표는 <표>로 치환 — 데이터 손실)
3순위: olefile PrvText 스트림 (UTF-16LE 디코딩)
```
**주의**: hwp5txt는 표 내용을 `<표>`로 치환하여 핵심 데이터 손실. 반드시 hwp5proc xml 우선 사용.
### .hwpx 파일 — parse_hwpx.py
```
방식: zipfile 열기 → Contents/*.xml → ET.fromstring() → elem.text 수집
주의: ET.parse(stream) 사용 금지 — 네임스페이스 처리 오류 발생
텍스트 태그: {http://www.hancom.co.kr/hwpml/2011/paragraph}t
```
### .pdf 파일 — parse_pdf.py
```
1순위: pdfplumber — 표 셀 포함 텍스트 추출 (extract_tables + extract_text)
2순위: PyMuPDF(fitz) fallback
```
### 파일 형식 우선순위
```
동일 파일명 존재 시: .hwpx > .hwp > .pdf
```
---
## 기능 01: 문서 취합 · 통계
"문서 취합해줘" 또는 "통계 내줘"라고 하면 실행한다.
### 출력물 — `output/통합통계.xlsx` (시트 3개)
**시트 1: 집계표**
| 부서명 | 프로그램명 | 운영장소 | 대상학년 | 계획참가인원 | 실제참여인원 | 총운영시간 | 운영기간 | 특이사항 |
- 추출 실패 항목은 빈칸 + 노란색 배경
- 마지막 행: 숫자 필드 합계
**필수 항목** (빈칸 시 오류시트 기록): 프로그램명, 운영장소, 대상학년, 운영기간
**선택 항목** (없어도 오류 아님): 총운영시간, 특이사항
**시트 2: 오류·확인 필요사항**
| 파일명 | 부서명 | 오류유형 | 상세내용 | 확인필요항목 |
오류 유형: `파싱 실패` / `항목 누락` / `양식 변형` / `값 이상`
**시트 3: 처리로그**
| 파일명 | 처리시각 | 결과 | 사용파서 | 비고 |
### 부서명 추출 규칙
1. 파일명에 `_` 포함 → `_` 앞 텍스트 (예: `교무부_해커톤.hwpx` → `교무부`)
2. 파일명에 `_` 없음 → 마지막 괄호 안 텍스트 (예: `...(사제동행 독서토론).hwp` → `사제동행 독서토론`)
- `"보고서 작성용"` 같은 행정 표현은 제외
---
## 기능 04: 연구학교 보고서
"보고서 써줘" 또는 "운영결과 정리해줘"라고 하면 실행한다.
### 사전 확인
- `output/통합통계.xlsx`가 없으면 중단 후 안내
- 오류·확인 필요사항이 있으면 계속 진행 여부 확인
### hwpx 생성 방식
```
1. input/*.hwpx 중 첫 번째 파일을 베이스 템플릿으로 사용
2. Contents/section0.xml 교체 (secPr 첫 단락은 보존)
3. Preview/PrvText.txt 교체
4. BinData/(이미지) 제외
5. 나머지 파일 그대로 복사
```
### section0.xml 핵심 구조 규칙
```
hs:sec (루트)
└── hp:p (첫 단락: secPr — 페이지 설정, 반드시 템플릿에서 복사)
└── hp:p (텍스트 단락)
└── hp:run [charPrIDRef="0~12"]
└── hp:t
└── hp:linesegarray
└── hp:p (표를 담는 단락)
└── hp:run [charPrIDRef="0"]
└── hp:tbl ← 반드시 hp:p > hp:run 안에 위치!
[hp:sz, hp:pos(treatAsChar="1"), hp:outMargin, hp:inMargin]
└── hp:tr
└── hp:tc [borderFillIDRef="3"]
└── hp:subList
└── hp:p > hp:run > hp:t
└── hp:cellAddr, hp:cellSpan, hp:cellSz, hp:cellMargin
└── hp:linesegarray (vertsize = 표 높이 추정값)
```
**금지사항**:
- `hp:tbl`을 `hs:sec` 직접 자식으로 놓으면 표가 보이지 않음
- `hp:td` 사용 금지 — hwpx는 `hp:tc` 사용
- `borderFillIDRef`는 해당 템플릿의 header.xml에 정의된 ID만 사용 (공학스쿨.hwpx: 1~5)
- `charPrIDRef`는 템플릿 header.xml 정의 범위 내 사용 (공학스쿨.hwpx: 0~12)
- `ET.parse(stream)` 사용 금지 → `ET.fromstring(raw.decode(...))` 사용
### 보고서 기본 섹션
1. 프로그램 운영 개요 (학교명, 담당자, 총계)
2. 프로그램별 운영개요 표 × N개 (프로그램명/특이사항/운영장소/대상/참가인원/운영일정)
3. 성과 및 개선사항 (담당자 직접 작성)
---
## 기능 05: 사용법 안내
"사용법 알려줘" 또는 `run.py` 메뉴 3번 실행 시 동작.
---
## 파일 구조
```
AutoDocMerge/
├── CLAUDE.md ← 이 파일 (AI 지시서)
├── school-config.md ← 학교 설정 (담당자·연락처는 배포 시 빈칸)
├── README.md ← 배포용 사용법 안내
├── run.py ← 실행 진입점 (더블클릭)
├── requirements.txt ← pip install -r requirements.txt
├── .gitignore ← .env, output/, __pycache__/ 등 제외
├── .env ← API 키 보관 (절대 공유 금지, 현재 미사용)
├── input/ ← 부서별 제출 파일 (.hwp / .hwpx / .pdf)
├── output/
│ ├── 통합통계.xlsx ← 집계표 + 오류시트 + 처리로그
│ └── 보고서_초안.hwpx ← 최종 보고서
├── sample/ ← 기준 양식 파일 (.hwp 또는 .hwpx)
└── tools/
├── parse_hwpx.py ← .hwpx 파서 (ET.fromstring 방식)
├── parse_hwp.py ← .hwp 파서 (hwp5proc xml 우선)
├── parse_pdf.py ← .pdf 파서 (pdfplumber 우선)
├── merge_stats.py ← 취합·통계 (기능 01)
├── make_report.py ← 보고서 생성 (기능 04)
└── guide.py ← 사용법 안내 (기능 05)
```
---
## 알려진 한계 및 대응
| 상황 | 원인 | 대응 |
|---|---|---|
| hwp 파일 표 데이터 일부 누락 | hwp5proc xml이 일부 표 구조를 `<hp:tc>` 대신 다른 형태로 저장 | odt 변환 후 재시도 또는 수동 입력 |
| hwpx 텍스트 추출 실패 | ET.parse(stream) 네임스페이스 오류 | ET.fromstring 사용 (이미 수정됨) |
| 양식 변형 파일 항목 누락 | 자유 서술 형식 또는 항목명 상이 | 오류시트 확인 후 수동 입력 |
| hwpx 보고서에 표 배경색 없음 | header.xml에 정의된 BorderFill ID만 사용 가능 | 한글에서 직접 서식 적용 |
| 보고서 저장 PermissionError | 파일이 한글에서 열려 있음 | 한글을 먼저 닫고 재실행 |
---
## 보안 주의사항
- `.env` 파일은 `.gitignore`에 포함됨 — 절대 공유·커밋 금지
- `school-config.md` 배포 시 담당자·연락처 빈칸 확인
- `output/` 폴더는 `.gitignore`에 포함 — 개인정보 포함 가능
- `subprocess` 호출 시 리스트 형태 사용 (셸 인젝션 방지됨)
- XML 파싱 시 학내 파일만 처리 (XXE 위험 현실적으로 낮음)
---
## 작업 톤
- 선생님한테 보고하듯이 결과물 전달
- "~했습니다" "~만들었습니다" 식으로
- 코드 설명 하지 않기 — 결과물과 다음 할 일만 안내
- 오류 발생 시 "어떤 파일에서 어떤 문제"인지 쉽게 설명
- 전문 용어는 괄호 안에 쉬운 설명 추가
Markdown
복사
5. 최종 정리
5-1. 내가 해야 할 것 vs Claude가 하는 것
모를 때: '이 목록 중에 네가 할 수 있는 건 뭐야?' 라고 물어보기.
내가 해야 하는 것 | Claude가 하는 것 |
부서별 파일 input/ 폴더에 넣기 | 파일 형식 자동 판별 + 파싱 |
sample/ 에 기준 양식 파일 넣기 | 양식 기준으로 항목 추출 로직 작성 |
필요한 패키지 설치 (Claude가 알려줌) | 엑셀 집계표 자동 생성 |
Windows 작업 스케줄러 최종 등록 | 처리 로그 생성 + 오류 파악·수정 |
5-2. 최종 체크리스트
업무를 입력→처리→판단→출력 형태로 먼저 글로 정리
CLAUDE.md 을 생성
sample/ 폴더에 기준 양식 파일 반드시 넣기 (Claude의 항목 인식 기준)
CLAUDE.md에 .hwpx / .hwp / .pdf 3가지 형식 처리 방법 모두 명시
되도록 .hwpx 파일만으로 자동화 작업을 수행하는 것을 추천
새 기능은 반드시 Plan mode로 시작 → 계획 확인 후 실행
모르면 Claude에게 바로 물어보기 ("내가 이해할 수 있게 설명해줘")
API 키는 .env 파일에만 저장 — 코드에 절대 하드코딩 금지
완료 후 보안 리뷰 요청
컨텍스트 70% 차면 /clear 초기화
자동화는 도구가 먼저가 아님.
내 업무 중 반복되는 것이 무엇인지 먼저 파악하는 것이 시작.
그게 보여야 자동화할 것도 보임.
















































