← 기술 블로그

첨가물 고시를 코드로 읽다: PDF 정규식 vs hwpx 파싱

Phase: 4 — 보강 시리즈: 공공데이터 레시피 대응 스토리: 운영 블로그 15화

이 글의 배경이 되는 이야기는 15화: 감칠맛 조미료의 정체에서 읽을 수 있습니다.

이 글을 읽으면 알 수 있는 것


문제: API에 없는 데이터가 고시 문서에 있습니다

첨가물의 “사용기준”은 서비스에 핵심적인 정보입니다. 어떤 첨가물이 어떤 식품에 얼마까지 사용할 수 있는지.

이 정보는 식약처 고시 문서에 표로 정리되어 있습니다. 「식품첨가물의 기준 및 규격」이라는 수백 페이지짜리 문서입니다.

그런데 이 정보를 제공하는 API는 없었습니다. 고시 원문을 직접 파싱해야 했습니다.


갈림길: PDF vs hwpx

식약처 고시 문서는 두 가지 형식으로 공개되어 있습니다.

방법원리장점단점
PDF 텍스트 추출 + 정규식텍스트 레이어에서 줄 단위 파싱도구 풍부, 접근 쉬움표 경계 소실, 줄바꿈 위치 임의
hwpx(ZIP→XML) 직접 파싱XML 표 구조에서 셀 단위 추출표 구조 100% 보존hwpx 포맷 이해 필요

처음에는 PDF 정규식을 시도했습니다.


PDF 정규식: 왜 실패했는가

PDF에서 텍스트를 추출하면, 표의 구조가 사라집니다. “품목명” 열과 “사용기준” 열이 하나의 텍스트 흐름으로 합쳐져 버립니다.

480행 5열짜리 표를 정규식으로 파싱하려면, “여기서 품목명이 끝나고 여기서 정의가 시작된다”는 경계를 추정해야 합니다.

한글 첨가물명 뒤에 영문명이 공백 없이 이어지는 경우가 대부분이었습니다.

가티검Gum Ghatti이명 : Indian gum
L-글루탐산나트륨**L-Glutamic Acid
비타민 Edl-α-Tocopherol

한글과 영문의 경계, 이명의 시작, 별표(*/**) 표기까지 PDF 텍스트에서 정규식으로 이 모든 패턴을 잡아야 했습니다. 오류가 계속 발생했고, 고시 개정 때마다 패턴이 깨질 위험이 있었습니다.


hwpx 파싱: ZIP 안의 XML

hwpx는 한글(HWP)의 XML 기반 포맷입니다. 실체는 ZIP 파일이고, 안에 XML 문서들이 들어 있습니다.

ZIP을 열면 Contents/section0.xml, section1.xml 등의 파일이 나옵니다. 각 section에서 표(<hp:tbl>)를 찾고, 행(<hp:tr>)과 셀(<hp:tc>)을 순회하면 표의 구조가 그대로 살아 있습니다.

# hwpx = ZIP(XML) 포맷
# 표 구조가 XML 태그로 보존되어 있음
# section별 테이블 → 행 → 셀 순회로 정확한 데이터 추출

PDF에서는 추정해야 했던 셀 경계가, hwpx에서는 XML 태그로 명확하게 구분되어 있었습니다.


까다로운 부분: 품목명 파싱

표 구조를 얻은 뒤에도, 개별 셀 안의 텍스트를 파싱하는 작업이 남아 있었습니다.

품목명 셀에는 한글명, 영문명, 이명이 구분자 없이 붙어 있습니다.

몇 가지 예를 들면:

패턴별로 분기 처리를 했습니다. 비타민 패턴, 멘톨 패턴, 괄호 뒤 영문 패턴, 일반 한영 분리 패턴. 4단계 폴백 구조로 순서대로 시도합니다.

그리스 문자도 문제였습니다. 고시에서는 α-갈락토시다아제로 적지만, 식약처 원재료 사전에서는 알파갈락토시다아제로 적혀 있습니다. 두 표기를 연결하기 위해 정규화 함수에서 Greek→한글 치환을 수행했습니다. 자동 치환으로 해결되지 않는 케이스는 수동 매핑 테이블을 두었습니다.


사용기준 분류

각 첨가물의 사용기준 텍스트도 구조화가 필요했습니다.

텍스트를 읽어서 다음 7가지 유형 중 하나로 분류합니다:

유형의미판단 기준
GENERAL_ALLOWED일반사용 가능제한 사항 없음
RESTRICTED사용량 제한g/kg, %, ppm 등 수치 포함
PROHIBITED_LIST특정 식품군 사용 금지”사용하여서는 아니 된다”
ALLOWED_ONLY특정 식품군에만 허용”한하여 사용하여야 한다”
PURPOSE_LIMITED용도 한정”착향의 목적에 한하여”
MUST_REMOVE완성 전 제거 의무”완성 전에 제거”
CROSS_REF다른 기준 참조”사용기준을 따른다”

사용량이 명시된 경우, 식품유형별 상세 수치(g/kg, mg/L 등)도 추출합니다.


결과

항목수치
파싱된 첨가물일반 ~480건, 가공보조제 ~98건, 영양강화제 ~179건, 혼합제제류 ~24건
총 사용기준 레코드약 780건
식품유형별 상세 제한수백 건
원재료 사전 FK 연결대부분 자동, 일부 수동 매핑

한계

고시가 개정되면 파서를 다시 확인해야 합니다. 표 구조가 바뀌거나, 새로운 카테고리가 추가될 수 있습니다. 현재 파서는 특정 고시 번호(제2025-76호)의 구조에 맞춰져 있습니다.

hwpx 포맷에 의존합니다. 만약 식약처가 hwpx 대신 PDF만 제공하게 되면, 이 방법을 쓸 수 없습니다.

한 줄 교훈

PDF에서 표를 추출하는 것은 추정이고, hwpx에서 표를 추출하는 것은 구조의 직접 읽기입니다. 데이터의 원본 형식을 파악하는 것이 파싱 전략의 출발점입니다.


다음 글: 3,800종 첨가물 번역: 수작업 100개에서 LLM 421개까지