🧑‍💻 개발 지식

홈 › 기술 블로그

본문 속 「근로기준법 제60조」를 국가법령정보센터 조문으로 자동 링크하기 (정규식과 함정 3가지)

📄 PDF 다운로드

작성 2026-10-20 · 읽는 시간 약 6분 · 작성 루리의 줍줍 편집

#정적 사이트 #자동화 #데이터

생활 정보 글에는 「근로기준법 제60조」 같은 조문 언급이 자주 나와요. 독자가 그 조문을 직접 확인할 수 있게 본문 속 조문 언급을 국가법령정보센터의 조문 주소로 자동으로 연결했어요. 이 글은 그 정규식과 함께, 만들면서 부딪친 함정 세 가지를 정리한 기록이에요. 주소 규칙과 숫자는 2026-10-20에 직접 확인한 값이에요.

문제: 근거를 말로만 적으면 독자가 확인할 수 없다

글마다 「공식 출처」 목록은 있었지만, 본문 중간의 「제55조 제1항」 같은 말은 글자일 뿐이었어요. 어느 법의 몇 조인지 눌러서 바로 가 볼 수 있어야 근거가 실제로 확인되는 글이 돼요. 손으로 링크를 달면 글이 늘수록 빠뜨리고 틀려요.

주소 규칙

국가법령정보센터는 https://www.law.go.kr/법령/<법령명>/제N조 형태의 주소를 받아요. 법령명은 공백 없이 쓰고, 가지 조문은 제58조의2처럼 붙여요. 항·호는 주소에 넣지 않고 조까지만 연결했어요(링크를 누르면 조문 전체가 보여요).

해결 코드 (일반화한 버전)

빌드할 때 본문 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.

관련 글

← 기술 블로그 홈 · 사이트 제작 로그 · RSS

출처

관련: 개발 지식 전체

이 글에 대해 묻고 싶으면 ❓ 개발 FAQ에 남겨 주세요.

📤 공유