본문 바로가기
AI

AI 개인 세무사 만드는 방법 - AI 세무사 (법제처 API)

by marketinkerbell 2026. 9. 9.

세금은 검색으로 답이 안 나옵니다.

블로그마다 말이 다르고, 어떤 글은 작년 기준이고, 내 상황에 맞는지도 모르겠고요.

그런데 조세심판원 결정례까지 (아무튼 공식 법 정보) 공짜로 열려 있다는 걸 알고 나서 접근법을 바꿨습니다.

복지포인트 하나로 시작된 일

급여명세서를 보다가 이상한 걸 발견했습니다. 회사 복지포인트로 자사 제품을 할인받아 샀는데, 그 할인액이 급여총액에 잡혀 있었습니다. 세금을 내고 있다는 뜻이죠.

검색해 봤습니다. 그런데 나오는 글마다 말이 달랐어요.

  • 어떤 글: "직원 할인은 비과세입니다"
  • 어떤 글: "복지포인트는 근로소득으로 과세됩니다"
  • 어떤 글: "대법원이 임금이 아니라고 했습니다"

셋 다 틀린 말이 아니었습니다. 서로 다른 시점, 다른 항목 얘기였을 뿐이죠. 정리하면 이렇습니다.

시기 직원 할인
2024년까지 명확한 규정 없이 관행적으로 과세 안 함
2025년부터 원칙 과세. 단 시가 20% 또는 연 240만원 중 큰 금액까지 비과세

그러니까 제 명세서에 잡히기 시작한 건 회사가 법을 따르고 있는 거였고, 확인해야 할 건 "비과세 한도를 빼고 계산하고 있는가"였습니다. 할인액 전액이 과세되고 있다면 잘못된 거니까요.

이걸 알아내는 데 검색으로 30분을 썼습니다. 그리고 생각했죠. 이거 매번 이럴 순 없겠는데.

세금 정보는 어디서 가져오나

세금 정보의 출처는 크게 세 군데인데, 기계가 읽을 수 있는 건 사실상 한 군데입니다.

출처 내용 API
법제처 세법 원문, 판례, 조세심판례 있음 (무료)
국세청 국세법령정보 예규, 질의회신 공개 API 없음
홈택스 내 실제 자료 개인 로그인 필요

다행히 법제처 하나로 대부분 됩니다. 세법 원문도 있고, 세금 분쟁 결과인 판례와 조세심판원 결정례까지 다 열려 있거든요. 신청은 open.law.go.kr 에서 하고 무료입니다.

조세심판원 결정례가 진짜 보물입니다

세금 분쟁은 대부분 법원까지 안 갑니다. 조세심판원에서 끝나요. 그래서 "이런 경우엔 세금을 내야 하나"에 대한 실제 답이 여기 쌓여 있습니다. 그런데 이걸 API로 볼 수 있다는 걸 아는 사람이 별로 없더라고요.

import re
import requests

SEARCH_URL = "https://www.law.go.kr/DRF/lawSearch.do"
OC = "test"   # 신청하면 받는 본인 ID


def _text(node, tag):
    m = re.search(rf"<{tag}>(?:<!\[CDATA\[)?(.*?)(?:\]\]>)?</{tag}>", node, re.S)
    return m.group(1).strip() if m else ""


def search(query, target="detc", display=5):
    """detc = 조세심판원 등 특별행정심판례"""
    r = requests.get(SEARCH_URL, params={
        "OC": OC, "target": target, "type": "XML",
        "query": query, "display": display,
    }, timeout=20)
    r.raise_for_status()

    out = []
    for m in re.finditer(rf"<{target} id=\"\d+\">(.*?)</{target}>", r.text, re.S):
        b = m.group(1)
        out.append({
            "title": _text(b, "사건명") or _text(b, "안건명"),
            "case_no": _text(b, "사건번호") or _text(b, "안건번호"),
            "date": _text(b, "결정일자") or _text(b, "선고일자"),
        })
    return out


for x in search("양도소득세 경정청구"):
    print(x["date"], x["title"][:50])

이런 게 나옵니다.

양도소득세 경정청구 거부결정 취소
쟁점주택이 1세대1주택 비과세 대상인지 여부
...

제목만 봐도 어떤 쟁점이 실제로 다투어지는지 감이 옵니다. 세무서가 뭘 문제 삼는지 미리 아는 셈이죠.

target 종류

law     세법 원문 (소득세법, 지방세법, 조특법...)
prec    법원 판례
expc    법령해석례 (정부 부처 유권해석)
detc    조세심판원 결정례      ← 세금은 이게 핵심
admrul  행정규칙

세법 원문 읽기, 그리고 함정

세법 조문은 문장이 길고 괄호가 많아서 원문을 보는 게 오히려 정확합니다. 요약본은 예외 조항을 빼먹거든요.

CDATA = re.compile(r"<!\[CDATA\[(.*?)\]\]>", re.S)


def article_text(unit):
    parts = []
    for m in re.finditer(r"<(조문내용|항내용|호내용|목내용)>(.*?)</\1>", unit, re.S):
        raw = m.group(2)
        c = CDATA.search(raw)
        t = (c.group(1) if c else raw).strip()
        if t:
            parts.append(t)
    return "\n".join(parts)


def get_article(mst, keyword=None):
    r = requests.get("https://www.law.go.kr/DRF/lawService.do", params={
        "OC": OC, "target": "law", "type": "XML", "MST": mst,
    }, timeout=30)
    units = re.findall(r"<조문단위[^>]*>(.*?)</조문단위>", r.text, re.S)
    arts = [t for t in (article_text(u) for u in units) if t]
    if keyword:
        arts = [a for a in arts if keyword in a]
    return arts


# 소득세법 MST는 검색으로 먼저 찾습니다 (개정되면 바뀝니다)
for a in get_article("280405", "장기보유")[:1]:
    print(a[:300])
여기서 한참 헤맸습니다. 조문내용 태그만 긁으면 조문 제목만 나옵니다. 실제 내용은 항내용, 호내용, 목내용에 흩어져 있어요. 그래서 조문단위를 통째로 잡아서 안의 텍스트를 순서대로 이어붙여야 합니다. 이걸 모르고 "왜 검색이 0건이지" 하면서 한참 봤습니다.

세법 감시 목록

세법은 매년 바뀝니다. 특히 일몰 조항이 무섭습니다. 몇 년까지만 해준다고 해놓고 조용히 끝나거나 연장되는데, 내 계획이 거기 걸려 있으면 타이밍이 다 틀어지거든요.

제가 감시하는 목록입니다.

내 계획의 어디에 걸리나
소득세법 집 팔 때 양도세 비과세 요건, 급여 과세
지방세특례제한법 생애최초 취득세 감면 (일몰 있음)
지방세법 취득세율 구간, 재산세
조세특례제한법 ISA, 연금저축·IRP 세액공제
근로자퇴직급여 보장법 IRP 중도인출 요건

코드는 단순합니다. 시행일자를 저장해 두고 매일 대조하면 끝이에요.

import json
from pathlib import Path

CACHE = Path("tax_law_snapshot.json")

WATCH = [
    {"name": "소득세법", "affects": "양도세 비과세 요건"},
    {"name": "지방세특례제한법", "affects": "생애최초 취득세 감면 일몰"},
    {"name": "조세특례제한법", "affects": "IRP 세액공제 한도"},
]


def search_law(query):
    r = requests.get(SEARCH_URL, params={
        "OC": OC, "target": "law", "type": "XML",
        "query": query, "display": 5,
    }, timeout=20)
    out = []
    for m in re.finditer(r"<law id=\"\d+\">(.*?)</law>", r.text, re.S):
        b = m.group(1)
        out.append({
            "name": _text(b, "법령명한글"),
            "effective": _text(b, "시행일자"),
            "mst": _text(b, "법령일련번호"),
            "status": _text(b, "현행연혁코드"),
        })
    return out


def check():
    prev = {}
    if CACHE.exists():
        prev = {x["name"]: x for x in json.loads(CACHE.read_text())}

    rows, changes = [], []
    for item in WATCH:
        hits = [h for h in search_law(item["name"])
                if h["status"] == "현행" and h["name"] == item["name"]]
        if not hits:
            continue
        row = {**hits[0], "affects": item["affects"]}
        old = prev.get(item["name"])
        if old and old["effective"] != row["effective"]:
            changes.append({**row, "before": old["effective"]})
        rows.append(row)

    CACHE.write_text(json.dumps(rows, ensure_ascii=False, indent=1))
    return changes


for c in check():
    print(f"[세법 개정] {c['name']}")
    print(f"  시행 {c['before']} -> {c['effective']}")
    print(f"  확인할 것: {c['affects']}")

crontab에 걸어두면 끝입니다.

30 7 * * * /path/to/python /path/to/tax_check.py

실제로 이렇게 씁니다

세금 질문이 생기면 이 순서로 갑니다.

  1. 법 원문 조문을 찾는다 (get_article + 키워드)
  2. 같은 쟁점의 조세심판원 결정례를 검색한다 (target=detc)
  3. 둘을 AI한테 같이 던지고 "내 상황이 이런데 어떻게 적용되나" 묻는다
  4. 금액이 크면 세무사한테 확인. 이때 조문 번호와 결정례를 들고 간다

4번이 생각보다 중요합니다. 아무것도 모르고 "이거 세금 얼마 나와요?" 하고 묻는 것과, "소득세법 제89조 1항 3호 요건 중에 이 부분이 애매한데, 비슷한 심판례가 이거인 것 같습니다" 하고 묻는 건 받는 답의 질이 완전히 다릅니다.

AI를 세무사로 쓰는 게 아니라, 세무사한테 물어볼 질문을 정확하게 만드는 데 씁니다. 이게 제일 실용적인 활용법이었어요.

주의할 점

원문에도 함정이 있습니다. 세법은 본법에서 "대통령령으로 정하는"이라고 던져놓고 시행령에서 진짜 요건을 정하는 경우가 정말 많습니다. 본법만 읽고 판단하면 틀립니다. 시행령, 시행규칙까지 같이 봐야 해요. 다행히 검색하면 셋 다 나옵니다.

시행일과 적용 시점이 다를 수 있습니다. "2026년 7월 1일 시행"이라고 해도 부칙에 "이 법 시행 후 최초로 양도하는 분부터 적용" 같은 단서가 붙습니다. 내 거래가 어느 쪽인지 부칙을 봐야 합니다.

이건 세무사가 아닙니다. 자료를 빠르고 정확하게 가져오는 도구일 뿐입니다. 세금은 같은 사실관계라도 해석이 갈리는 영역이고, 잘못 판단하면 가산세까지 붙습니다. 금액이 크면 반드시 전문가한테 확인하세요.

정리

  • 법제처 API 하나로 세법 원문 + 판례 + 조세심판원 결정례까지 됩니다
  • 본문 파싱은 조문단위로 (조문내용에는 제목만 있습니다)
  • 본법만 보지 말고 시행령까지
  • 일몰 조항이 걸린 법은 반드시 감시 목록에
  • AI는 답을 주는 게 아니라 질문을 정확하게 만들어 줍니다

 

👇AI 개인 변호사 만드는 방법은 아래 글을 참고해주세요 :)👇

 

AI 개인 변호사 만드는 방법 - AI 변호사 (법제처 API)

법제처가 공짜로 열어준 API 사용해서 내 개인 변호사 만드는 방법! 내가 직면한 상황에 해당 되는 법만 감시하는 도구를 만들어 봤습니다.시작은 아찔한 실수였습니다집을 사려고 지역별 시세

marketinkerbell.com

 

댓글