Claude Code로 디자인된 견적서와 청구서를 자동 출력하는 방법
요약
본 글은 Claude Code를 활용하여 견적서와 청구서를 자동 출력하는 시스템 구축 과정을 다룹니다. 단순한 AI 요청을 넘어, 사람이 핵심 결정(무엇을, 얼마에)을 하고, Claude는 JSON 데이터 구조화까지만 담당하도록 역할을 분담했습니다. 이 방식은 금액 계산 오류, 양식 비일관성, 번호 중복 등의 문제를 해결합니다.
핵심 포인트
- AI의 역할은 JSON 데이터 생성으로 한정하고, 핵심 로직은 스크립트에 맡긴다.
- 금액 합계나 소비세 등 복잡한 계산 및 규칙 처리는 코드로 구현하여 정확성을 확보한다.
- 문서 초안과 최종 발행(Issue) 단계를 분리하여 번호 중복이나 덮어쓰기 문제를 방지한다.
프로그래머에게는 디자인이 적용된 문서 교환을, 디자이너에게는 정확한 계산과 자동화 시스템을 제공합니다.
견적서와 청구서에서 이 두 가지를 하나의 도구로 만들 때의 제작 과정에 대한 이야기입니다.
Claude Code에게 '청구서를 만들어줘'라고 요청하면, 실제로 만들어 줍니다. HTML로 구성되어 그럴듯한 결과물이 나옵니다.
하지만 업무상 사람에게 보내는 문서로 사용하려고 하면 세 가지 문제가 발생합니다.
- 금액을 암산하는 경우: 명세가 늘어나면 소계나 소비세가 어긋날 수 있습니다. 틀린 청구서를 내보내면 상대방과의 관계에 문제가 생깁니다.
- 매번 종이 양식이 달라짐: 이전 것과는 여백이나 서체가 다른 결과물이 나옵니다.
- 번호가 중복됨: AI는 대화가 이어지면서 이전의 번호를 계승할 수 없습니다.
그래서 역할을 분담했습니다.
| 결정하는 사람 | 결정할 내용 |
|---|---|
| 사람 | 무엇을, 얼마에, 어떤 조건으로. 그리고 '이것으로 보낸다' |
| ... | |
| Claude가 할 역할은 JSON 하나를 작성하여 스크립트에 전달하는 것까지입니다. |
입력은 이것만 있으면 됩니다
{
"kind": "estimate",
"date": "2026-10-01",
...
}
금액의 합계, 소비세, 번호는 작성하지 않습니다. 적지 않음으로써 틀릴 수 있는 부분을 줄이고 있습니다 (단가와 수량은 사람이 확인해야 할 부분으로 남겨둡니다).
초안을 내보내기
$ node build.mjs estimate.json --pdf
…/서류/_초안/견적서_초안_주식회사샘플상사_기업사이트제작(6페이지).html
세금 제외 ¥360,000 / 소비세 ¥36,000 / 합계 ¥396,000
...
초안에는 번호가 붙지 않습니다. 종이 양식의 왼쪽 상단에 '초안'이라고 표시됩니다. 몇 번이고 다시 만들 수 있습니다.

'넘치는 부분 없음'을 기계가 확인하게 하기
A4 용지에 들어맞는지 여부는 눈으로 봐야 알 수 있는 대표적인 경우입니다.
이 스크립트는 Chrome에서 PDF로 변환할 때, 페이지별 내용이 넘치지 않았는지 계산하고, 넘쳤다면 멈춥니다. 명세가 많을 때는 자동으로 다음 페이지로 넘어갑니다.
'아마 들어맞을 겁니다'라고 AI에게 말하게 하지 않는 것입니다.
발행하기
사람이 '이것으로 보낸다'고 결정하면, 발행합니다.
$ node build.mjs estimate.json --issue
✓ 발행되었습니다: E-2610-01
여기서 비로소 번호가 붙습니다. E-2610-01
'견적서・2026년 10월・그 달의 첫 번째 것'을 의미합니다.
번호는 발행 기록(한 줄씩 더해가는 파일)을 보고 같은 월의 가장 큰 번호 다음으로 부여됩니다. 발행된 문서는 나중에 덮어쓰기되지 않습니다.
소비세 소수점 처리
소비세 소수점 처리는 명세의 한 줄마다 하는 것이 아니라, 세율별 합계에 대해 한 번만 할 규칙입니다 (국세청 인보이스 Q&A 문57 '적격 청구서에 기재할 소비세액 등의 소수점 처리'). 절사/올림/반올림 중 무엇을 할지는 사업자가 선택할 수 있으며, 이 스크립트는 절사를 사용하고 있습니다.
이 계산을 매뉴얼에 글로 써서 AI가 지키게 하는 것이 아니라, 스크립트 안에 작성하고 테스트를 통해 확인합니다.
✔ 금액: 소비세 소수점은 합계에 대해 한 번만 절사
✔ 금액: 세금 포함으로 적은 명세는, 합계에서 세금을 한 번만 되돌림
✔ 페이지 넘김: 부족하면 1페이지, 많으면 분리하고, 줄은 빠짐없이 마지막 페이지는 비어있지 않게
...
스킬을 만들 때의 구분 기준 예시
이 도구를 만들면서 생각한 것을 하나로 정리하자면 다음과 같습니다.
틀리면 곤란한 것과, 매번 같았으면 하는 것은 스크립트에 맡깁니다. AI에게는 대화에서 내용만 파악하는 역할만 맡깁니다.
Claude Code의 스킬은 절차서(SKILL.md)만으로도 만들 수 있습니다. 하지만 절차서에 '소비세는 절사로', '번호는 연속 번호로'라고 적어도, 지켜질지는 매번 운에 달립니다. 계산이나 번호처럼 답이 하나로 정해지는 것은 스크립트로 만들고 테스트를 추가하는 것이 더 확실합니다.
참고 사항
여기서 작성한 것들을 다른 사람의 환경에서도 사용할 수 있는 형태로 정리했습니다. SKILL.md・스크립트・테스트 13개・종이 양식 디자인・입력 예시가 포함되어 있습니다.
할 수 없는 것도 미리 말씀드립니다. 경감세율(8%) 품목, 취소/할인/환불, 원천징수란, 납품서・영수증에는 대응하지 않습니다. 동작을 확인한 것은 Windows 10과 Node.js 24입니다. 서류를 만드는 도구일 뿐, 세무 판단은 하지 않습니다. 완성된 서류의 금액과 내용은 보내기 전에 본인이 직접 확인해 주십시오.
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기