공식 조문으로 계산기를 검증한 방법 — 연말정산 계산기를 만들며 걸린 함정
작성 2026-11-12 · 읽는 시간 약 10분 · 작성 루리 줍줍 편집
연말정산 계산기를 만들면서 가장 시간을 쓴 일은 계산식이 아니라 「이 숫자가 지금 법과 맞는가」를 확인하는 일이었습니다. 세금 계산기는 숫자가 하나만 틀려도 사용자가 그 금액을 믿고 움직이기 때문에, 이 글은 법령 원문을 어떻게 받았고 어디서 걸렸고 무엇으로 검산했는지를 실제 순서대로 적습니다. 완성된 계산기는 연말정산 계산기(2026년 귀속)입니다.
1. 현행 조문을 직접 받는다
블로그나 요약 글에서 세율과 한도를 가져오면 개정 전 숫자가 섞여 들어옵니다. 그래서 국가법령정보센터(law.go.kr)에서 소득세법과 조세특례제한법을 내려받아 읽었습니다. 받는 순서는 다음과 같습니다.
- 법령 이름 주소(
/법령/소득세법)에서 법령 일련번호(lsiSeq)를 찾습니다. - 정보 쪽에서 시행일(
efYd)을 읽습니다. - 본문은
lsInfoR.do에 일련번호와 시행일을 POST로 보내야 나옵니다. GET으로 부르거나 시행일이 비면 「Error」 몇 글자만 돌아옵니다.
이번에 받은 두 법은 소득세법이 시행일 2026-01-01, 조세특례제한법이 2026-09-18 본이었고 둘 다 오늘보다 앞선 시행일이라 현행으로 썼습니다. 시행일이 오늘보다 뒤이면 아직 시행 전인 미래 본이라는 뜻이므로 연혁에서 현행 본을 다시 골라야 합니다.
2. 함정 하나: 조문 텍스트에서 표가 빠진다
근로소득공제(소득세법 제47조 제1항)와 근로소득세액공제(제59조 제1항)의 핵심 숫자는 표로 되어 있습니다. 받은 본문에서는 이 표 칸이 비어 있었습니다. 같은 파일을 숫자로 검색하니 표처럼 생긴 문장이 하나 나왔는데, 열어 보니 2003년 과세기간용 경과 규정이었고 구간과 금액이 지금과 달랐습니다. 숫자만 검색해서 맞는 것을 가져왔다면 옛 표를 쓸 뻔했습니다.
표가 빠진 부분은 국세청 안내 두 쪽(근로소득공제, 근로소득 세액공제)을 직접 열어 대조했습니다. 근로소득공제 표(500만원 이하 70%, 1,500만원까지 350만원 + 초과분 40%, 4,500만원까지 750만원 + 15%, 1억원까지 1,200만원 + 5%, 초과 1,475만원 + 2%, 한도 2,000만원)와 세액공제(산출세액 130만원 이하 55%, 초과 71만5천원 + 초과분 30%)가 그 쪽에 있었습니다. 조문 본문에 글로 남아 있는 한도 규정(제59조 제2항: 총급여 3,300만원 이하 74만원, 7,000만원 이하는 74만원에서 초과분의 0.8%를 빼되 최저 66만원 등)은 법령 원문에서 직접 읽었고, 국세청 한도 표와 같은 값이었습니다. 이렇게 조문과 공식 안내, 두 곳이 같은 숫자일 때만 계산식에 넣는다는 규칙을 세웠습니다.
3. 함정 둘: 개정과 부칙
신용카드 소득공제(조세특례제한법 제126조의2)는 2025년 12월 23일 공포(법률 제21223호, 2026-01-01 시행)로 바뀌었습니다. 현행 본문에는 두 가지가 새로 들어 있었습니다.
- 제10항: 자녀가 있으면 공제 한도가 늘어납니다. 총급여 7천만원 이하는 자녀 1명 350만원, 2명 이상 400만원, 초과는 1명 275만원, 2명 이상 300만원입니다.
- 제11항: 한도를 넘은 금액이 있으면 전통시장·대중교통(7천만원 이하는 문화체육 포함) 공제액 합계의 범위에서 추가로 인정합니다.
본문만 읽고 적용하면 안 됩니다. 부칙을 찾아 읽어야 「언제 사용한 금액부터」인지 알 수 있습니다. 해당 개정의 부칙 제47조는 「이 법 시행 전에 사용한 신용카드등사용금액에 대한 소득공제에 관하여는 제126조의2제2항·제10항 및 제11항의 개정규정에도 불구하고 종전의 규정에 따른다」고 정하고 있었습니다. 즉 2026년 1월 1일 이후 사용분부터 새 규정이 적용되므로, 2026년 귀속 연말정산 계산기에는 새 규정을 쓰고 계산기 화면에도 「2026년 사용분」이라고 적었습니다.
4. 계산식을 두 번 따로 만든다
이 사이트의 계산기는 JSON 안에 수식 문자열을 적으면 브라우저가 그 수식을 계산합니다. 같은 계산을 파이썬으로 처음부터 다시 구현해 검산 값을 뽑고, 두 결과가 같은지 비교했습니다. 한쪽에서 실수해도 다른 쪽이 같은 실수를 할 가능성이 낮기 때문입니다. 검산은 총급여 2,500만원부터 1억5,000만원, 자녀 0~3명, 카드 한도 초과와 미달 같은 7가지 경우로 했고, 모두 일치해야 게시되게 되어 있습니다.
# 근로소득세액공제와 한도 (소득세법 제59조), 파이썬 구현 쪽
raw = tax * 0.55 if tax <= 1_300_000 else 715_000 + (tax - 1_300_000) * 0.30
if pay <= 33_000_000: cap = 740_000
elif pay <= 70_000_000: cap = max(660_000, 740_000 - (pay - 33_000_000) * 8 / 1000)
elif pay <= 120_000_000: cap = max(500_000, 660_000 - (pay - 70_000_000) / 2)
else: cap = max(200_000, 500_000 - (pay - 120_000_000) / 2)
credit = int(min(raw, cap))
5. 손으로도 한 번 맞춘다
두 구현이 같은 오해를 공유할 수 있으니 한 경우는 계산기를 쓰지 않고 손으로 따라갔습니다. 총급여 5,000만원, 본인 1명, 4대보험료 485만원, 신용카드 1,500만원·체크카드 500만원을 쓰고 대중교통·전통시장 사용액은 없는 사람입니다. 계산기에 처음 들어 있는 기본값에는 대중교통 60만원이 더해져 있어서 결정세액이 2,342,750원으로 나옵니다. 대중교통 칸을 0으로 바꿔야 아래 표와 같은 입력입니다.
| 단계 | 계산 | 금액 |
|---|---|---|
| 근로소득공제 | 1,200만원 + (5,000만원 - 4,500만원) × 5% | 12,250,000원 |
| 근로소득금액 | 50,000,000 - 12,250,000 | 37,750,000원 |
| 카드 등 공제 | (신용 1,500만원 × 15% + 체크 500만원 × 30%) - 최저사용금액 1,250만원 × 15% | 1,875,000원 |
| 소득공제 합계 | 기본 150만원 + 4대보험 485만원 + 카드 187.5만원 | 8,225,000원 |
| 과세표준 | 37,750,000 - 8,225,000 | 29,525,000원 |
| 산출세액 | 29,525,000 × 15% - 126만원 | 3,168,750원 |
| 근로소득세액공제 | 계산값 1,275,625원이나 한도 66만원 적용 | 660,000원 |
| 결정세액 | 3,168,750 - 660,000 - 표준세액공제 130,000 | 2,378,750원 |
이 값은 계산기 수식을 단계별로 돌린 결과(근로소득공제, 카드 공제, 소득공제 합계, 과세표준, 산출세액, 세액공제와 한도, 결정세액)와 모두 일치했습니다. 이 표에서 눈여겨볼 곳은 근로소득세액공제입니다. 산식대로 계산한 값(1,275,625원)이 한도(66만원)보다 훨씬 커서, 한도를 빼먹으면 결정세액이 약 61만원 틀어집니다. 한도가 실제로 결과를 가르는 경우를 검산에 넣어 두는 것이 중요했습니다.
카드 한도 초과 규정도 손으로 확인했습니다. 총급여 8,000만원(자녀 없음), 신용카드 4,000만원, 체크카드 1,000만원, 대중교통 300만원, 전통시장 200만원이면 공제액이 800만원, 기본 한도가 250만원이라 초과분이 550만원입니다. 전통시장·대중교통 공제액은 각각 80만원, 120만원으로 합계 200만원이고 추가 인정 한도도 200만원이라 추가로 200만원을 더 인정해 최종 450만원이 됩니다. 계산기도 450만원을 냈습니다.
6. 화면을 찍어 보고서야 알게 된 것
- 표가 그려지지 않았습니다. 계산기 JSON의 「표」 구역이 이 사이트의 계산기 틀에서 아예 렌더링되지 않았습니다. 새 계산기뿐 아니라 이미 올라가 있던 종합소득세 계산기의 세율표도 제목만 있고 비어 있었습니다. 코드를 읽어서는 보이지 않았고 화면을 찍어 보고 알았습니다. 표를 그리도록 고치자 이미 올라가 있던 계산기의 표도 함께 그려졌습니다.
- 모바일 화면 확인 방법. 헤드리스 브라우저에 창 폭 390을 주고 찍은 화면은 오른쪽이 잘려 보였습니다. 같은 페이지를 390px 폭 iframe 안에 넣어 찍으니 문제가 없었습니다. 최소 창 폭 제한 때문으로 보이지만 원인은 확인하지 못했습니다. 이후로는 iframe 방식으로 폭을 재현했습니다.
- 설명 문구 하나가 조문과 달랐습니다. 같은 방식으로 만든 증여세 계산기에서 「직계존속」을 설명하는 괄호에 시부모·장인장모를 넣었는데, 조문은 「직계존속과 혼인 중인 배우자」(계부·계모 같은 경우)를 포함한다고 되어 있었습니다. 게시 전에 조문을 다시 읽다 발견해 고쳤습니다. 계산식뿐 아니라 설명 문장도 조문과 대조해야 합니다.
7. 이 계산기가 하지 않는 것
- 의료비·교육비·기부금 등 특별세액공제의 계산은 하지 않고, 사용자가 이미 계산한 공제세액 합계를 넣게 했습니다.
- 경로우대·장애인·한부모 추가공제, 출산·입양 자녀 세액공제, 월세 세액공제, 중도 입사·퇴사는 넣지 않았습니다.
- 카드 한도가 늘어나는 「자녀 등」의 범위는 대통령령이 정하는데 이번에는 확인하지 못해 입력한 자녀 수를 그대로 썼습니다.
들어가지 않은 것은 계산기 화면에도 그대로 적었습니다. 확인하지 못한 것을 쓴 것처럼 두지 않는다는 것이 이 작업의 기준이었습니다.
다음 계산기를 만들 때 쓰는 순서
- 현행 조문과 시행일을 직접 받는다. 시행일이 오늘보다 뒤이면 현행 본을 다시 고른다.
- 표처럼 본문에서 빠지는 숫자는 공식 안내 한 곳을 더 찾아 두 곳이 같을 때만 쓴다.
- 개정 조문은 부칙으로 적용 시기를 확인한다.
- 수식과 별개로 파이썬 구현을 만들어 한도·경계 값을 포함한 검산 값을 맞춘다.
- 한 경우는 손으로 따라가 본다.
- 화면을 데스크톱과 실제 폭 390px로 찍어 눈으로 본다.
- 화면에 적은 설명 문장도 조문과 한 번 더 대조하고, 하지 않는 것을 적는다.
1English summary
How a 2026 Korean year-end tax settlement calculator was verified against statute text: downloading the in-force Income Tax Act and Restriction of Special Taxation Act from law.go.kr (POST with the statute serial number and effective date), the trap that tables are missing from the extracted article text (the only table-like match was an obsolete 2003 transitional rule, so the deduction tables were cross-checked on the tax agency's pages), reading the addenda to learn that the amended credit-card deduction limits apply to spending from 2026-01-01, implementing the same calculation twice (formula strings run in the browser versus an independent Python version, 7 matching cases), a hand-worked example that ends at 2,378,750 won, and what screenshots revealed (tables not rendered, a mobile-width capture artifact, an explanatory sentence that contradicted the statute).
2관련 글
- 1인+AI로 사이트 만들며 배운 것: 페이지 줄이고 검색 색인 정리하기사람 한 명과 Claude Code로 만든 정보 사이트에서 이틀 동안 페이지 3,744개를 863개 수준으로 줄이고 얇은 페이지를 데이터 화면으로 합친 기록과 규칙.
- 뉴스 이슈에 「내 생활 영향」과 실제 시세를 붙이는 법 — 규칙표·FRED·SVG로 지어내지 않기영향 규칙표 10개로 이슈 60개 중 7개에 생활 영향 카드를 붙이고, FRED·업비트 공개 시세 6개(1.6초)로 전문가 발언 뒤 7일·30일 등락을 사후 확인하는 정적 사이트 파이프라인.
- 신규 도메인 백링크·홍보 채널 사흘 실측 정리색인 0인 새 도메인에서 dev.to·네이버 블로그·지식iN·레딧·LinuxFr·Product Hunt 6개 채널을 사흘 써 본 실제 유입 숫자와 정지·폐쇄 사례, 정리한 규칙 5개(표본 작음·참고용).
← 기술 블로그 홈 · 사이트 제작 로그 · RSS
3출처
- 국가법령정보센터: 소득세법 — 확인 2026-11-12
- 국가법령정보센터: 조세특례제한법 — 확인 2026-11-12
- 국세청: 근로소득 공제 안내 — 확인 2026-11-12
- 국세청: 근로소득 세액공제 안내 — 확인 2026-11-12
관련: 개발 지식 전체
이 글에 대해 묻고 싶으면 ❓ 개발 FAQ에 남겨 주세요.