본문 속 「근로기준법 제60조」를 국가법령정보센터 조문으로 자동 링크하기 (정규식과 함정 3가지)
작성 2026-10-20 · 읽는 시간 약 6분 · 작성 루리의 줍줍 편집
생활 정보 글에는 「근로기준법 제60조」 같은 조문 언급이 자주 나와요. 독자가 그 조문을 직접 확인할 수 있게 본문 속 조문 언급을 국가법령정보센터의 조문 주소로 자동으로 연결했어요. 이 글은 그 정규식과 함께, 만들면서 부딪친 함정 세 가지를 정리한 기록이에요. 주소 규칙과 숫자는 2026-10-20에 직접 확인한 값이에요.
문제: 근거를 말로만 적으면 독자가 확인할 수 없다
글마다 「공식 출처」 목록은 있었지만, 본문 중간의 「제55조 제1항」 같은 말은 글자일 뿐이었어요. 어느 법의 몇 조인지 눌러서 바로 가 볼 수 있어야 근거가 실제로 확인되는 글이 돼요. 손으로 링크를 달면 글이 늘수록 빠뜨리고 틀려요.
주소 규칙
국가법령정보센터는 https://www.law.go.kr/법령/<법령명>/제N조 형태의 주소를 받아요. 법령명은 공백 없이 쓰고, 가지 조문은 제58조의2처럼 붙여요. 항·호는 주소에 넣지 않고 조까지만 연결했어요(링크를 누르면 조문 전체가 보여요).
- 근로기준법 제60조 →
…/법령/근로기준법/제60조 - 근로기준법 시행령 제30조 →
…/법령/근로기준법시행령/제30조 - 정보통신망법은 정식 법령명(정보통신망 이용촉진 및 정보보호 등에 관한 법률)으로 바꿔서 주소를 만들어야 해요.
해결 코드 (일반화한 버전)
빌드할 때 본문 HTML을 한 번 훑어서, 태그가 아닌 글자 조각에서만 「법령명 + 제N조」를 찾아 링크로 바꿔요. 이미 링크(<a>)나 스크립트·스타일 안은 건드리지 않아요.
import re
ALIAS = {'근로기준법 시행령': '근로기준법 시행령', '근로기준법': '근로기준법', '민법': '민법',
'정보통신망법': '정보통신망 이용촉진 및 정보보호 등에 관한 법률'} # 줄임말 → 정식 이름
NAME = '|'.join(re.escape(k) for k in sorted(ALIAS, key=len, reverse=True))
RE = re.compile(r'(' + NAME + r'|시행령|법)?(\s*)(제\d+조(?:의\d+)?)')
def linkify(html, default=None):
out, depth = [], 0
for tok in re.split(r'(<[^>]+>)', html):
if tok.startswith('<'):
if re.match(r'<(a|script|style)\b', tok, re.I): depth += 1
elif re.match(r'</(a|script|style)\b', tok, re.I): depth = max(0, depth - 1)
out.append(tok); continue
if depth: out.append(tok); continue
def rep(m):
nm, sp, art = m.groups()
law = ALIAS.get(nm) or (default if not nm or nm in ('법', '시행령') else None)
if not law: return m.group(0) # 법령명을 모르면 연결하지 않는다
if nm == '시행령': law += ' 시행령'
url = 'https://www.law.go.kr/법령/' + law.replace(' ', '') + '/' + art
return f'<a href="{url}" target="_blank" rel="noopener">{(nm or "") + sp + art}</a>'
out.append(RE.sub(rep, tok))
return ''.join(out)
함정 1: 이름 없는 「제N조」는 어느 법인가
한 가지 법만 다루는 글(예: 근로기준법만 이야기하는 글)에서는 「제55조」가 그 법이 맞지만, 여러 법을 섞은 글에서는 틀린 법으로 연결될 위험이 있어요. 그래서 이름 없는 조문은 글마다 정해 둔 기본 법이 있을 때만 연결하고, 여러 법이 섞인 글은 문장마다 법령명을 직접 쓰도록 본문을 고쳤어요. 연결이 되는 것보다 틀린 곳으로 연결되지 않는 것이 더 중요해요.
함정 2: 링크가 맞는지 기계로 대조하기
생성된 링크의 글자(법령명)와 주소 속 법령명이 서로 일치하는지 빌드 결과물 전체에서 대조하는 스크립트를 따로 만들었어요. 151개 조문 링크에서 어긋난 것은 없었어요. 검사 코드 자체가 법 이름 속의 「제」 자를 잘못 읽어 5건을 거짓 경보로 띄운 적이 있어서, 경보가 나오면 코드와 대상 둘 다 의심해야 한다는 걸 같이 배웠어요.
함정 3: 「현행」 조회본이 최신 개정을 빠뜨린 경우
이 일을 하면서 조문 원문을 직접 읽어 사실을 확인하는 과정이 있었어요. 국가법령정보센터의 화면은 자바스크립트로 그려져서 일반 가져오기 도구로는 본문이 안 읽혀요. 대신 공개 조회 API(공개 테스트용 OC 값으로 XML 조회가 됐어요. 안정적으로 쓰려면 본인 인증키를 신청해 쓰는 게 맞아요)로 읽었어요.
그런데 증권거래세법 시행령의 「현행」 조회본 제5조에는 2026년 세율 인상이 반영돼 있지 않았어요. 연혁 목록을 따로 조회해 보니 2025-12-31 공포·2026-01-01 시행 개정본이 별도 일련번호로 있었고, 그 번호로 조회하면 개정 세율이 나왔어요. 「현행」 표시를 곧이곧대로 믿었다면 정확한 글을 틀렸다고 고칠 뻔했어요.
교훈
- 링크는 자동화해도 대조는 따로 자동화해야 해요. 연결 코드와 검사 코드를 분리하면 서로의 오류를 잡아 줘요.
- 모를 때는 연결하지 않는 쪽으로 설계하세요. 틀린 근거 링크는 근거가 없는 것보다 나빠요.
- 법령 조회본은 시행일과 일련번호를 확인하세요. 「현행」이 늘 최신 개정을 포함한다고 가정하면 안 돼요.
English summary
How a static-site build step turns mentions like "Labor Standards Act Article 60" into links to the exact article on law.go.kr (URL pattern /법령/<law name without spaces>/제N조), with a Python regex that skips existing links and scripts and refuses to link when the law name is unknown. A separate check compares every generated link text with its URL (151 links, no mismatches), and one trap is documented: the default "current" version of a statute omitted a promulgated amendment that appeared only under its own version ID.
관련 글
- 1인+AI로 사이트 만들며 배운 것: 페이지 줄이고 검색 색인 정리하기사람 한 명과 Claude Code로 만든 정보 사이트에서 이틀 동안 페이지 3,744개를 863개 수준으로 줄이고 얇은 페이지를 데이터 화면으로 합친 기록과 규칙.
- 뉴스 이슈에 「내 생활 영향」과 실제 시세를 붙이는 법 — 규칙표·FRED·SVG로 지어내지 않기영향 규칙표 10개로 이슈 60개 중 7개에 생활 영향 카드를 붙이고, FRED·업비트 공개 시세 6개(1.6초)로 전문가 발언 뒤 7일·30일 등락을 사후 확인하는 정적 사이트 파이프라인.
- 윈도우 11에서 wmic가 사라져 예약 작업이 조용히 멈춘 이야기 (파이썬 대체 코드)윈도우 11에 wmic가 없어 파이썬 예약 작업이 FileNotFoundError 로 조용히 실패한 원인과, Get-CimInstance·psutil 대체 코드, 점검 실패 시 멈추게 하는 법.
← 기술 블로그 홈 · 사이트 제작 로그 · RSS
출처
- 국가법령정보센터 — 확인 2026-10-20
관련: 개발 지식 전체
이 글에 대해 묻고 싶으면 ❓ 개발 FAQ에 남겨 주세요.