Static site generator(SSG)는 현대 문서 포털, 개발자 블로그 및 제품 지식베이스의 핵심이 되었습니다. 가볍고 빠른 전달, 버전‑관리된 콘텐츠, CI 파이프라인과의 원활한 통합을 제공합니다. 하지만 SSG는 매우 특정한 형식—주로 Markdown, reStructuredText 또는 순수 HTML—의 콘텐츠만을 기대하며, 탐색, 테마 지정, 검색 인덱스를 구동하기 위해 front‑matter 메타데이터에 의존합니다. 조직이 Word 파일, PDF, PowerPoint 자료 및 레거시 헬프‑작성 형식이 뒤섞인 컬렉션을 물려받으면, 변환 단계가 일관성, 접근성 및 검색 품질을 위협하는 병목 현상이 될 수 있습니다.

이 문서에서는 이질적인 소스 문서를 깔끔한 SSG‑준비 레포지토리로 바꾸는 실용적인 워크플로우를 단계별로 살펴봅니다. 의미론적 구조 보존, 검색 가능한 텍스트 유지, 중요한 메타데이터 보존, 그리고 계획 없이 PDF를 Markdown으로 변환했을 때 흔히 발생하는 미묘한 품질 손실을 방지하는 방법에 중점을 둡니다. 기술 자체는 폭넓게 적용 가능하지만, 예시는 convertise.app이라는 클라우드 기반 변환 서비스의 워크플로우 기능을 참고합니다. 이 서비스는 프라이버시를 보호하면서 고충실도 결과를 제공합니다.

왜 변환 단계가 SSG 기반 문서에 중요한가

SSG는 빌드 시점에 소스 파일을 정적 HTML 사이트로 변환합니다. 제너레이터는 바이너리 형식을 해석하지 않으며, 단순히 원시 텍스트를 읽고 템플릿과 결합합니다. PDF를 파이프라인에 직접 투입하면, 제너레이터는 이를 불투명한 자산으로 취급하고 내부 내용은 검색 엔진 및 사이트 내 검색에 보이지 않게 됩니다. 결국 사용자는 전체 텍스트 검색을 통해 정보를 찾을 수 없게 되고, 문서는 잘 구조화된 HTML이 제공하는 접근성(예: 스크린 리더 네비게이션) 이점을 잃게 됩니다.

검색 가능성 외에도 변환은 다음에 영향을 미칩니다:

  • 네비게이션 계층 – 소스의 헤딩이 사이트 목차가 됩니다. 헤딩 레벨을 평평하게 변환하면 사용자가 기대하는 논리 흐름이 깨집니다.
  • 코드 스니펫 – 많은 기술 문서에 포함된 코드 블록은 구문 강조가 유지돼야 합니다. PDF를 그대로 추출하면 고정폭 글꼴이 일반 텍스트로 변해 마크업이 깨집니다.
  • 교차 참조 – 그림, 표, 각주 등은 일반적으로 ID로 참조됩니다. 이 ID가 사라지면 사이트 전체에 깨진 링크가 발생합니다.
  • 메타데이터 – 발행일, 작성자, 버전, 태그 등은 front‑matter에서 읽어옵니다. 변환 과정에서 이러한 정보가 사라지면 정렬·필터링·버전‑관리가 불가능해집니다.

위 요소들을 모두 다루는 체계적인 변환 프로세스는 후속 재빌드를 불필요한 화재 진압 작업으로 전락시키지 않게 해 줍니다.

소스 형식을 SSG‑준비 타겟으로 매핑하기

첫 번째 단계는 지원해야 할 소스 형식을 목록화하는 것입니다. 아래는 일반적인 인벤토리와 각 형식에 권장되는 SSG 타겟입니다.

소스 형식권장 SSG 타겟이유
Microsoft Word (.docx)Markdown (.md)Word는 헤딩, 표, 스타일 정보를 보존하며 Markdown 구문으로 매핑하기 쉽습니다.
PDF (텍스트 기반)Markdown 또는 HTML텍스트 기반 PDF는 OCR 없이 추출 가능하지만 레이아웃 정리가 필요합니다.
PDF (스캔본)OCR 텍스트가 포함된 HTML스캔된 PDF는 OCR이 필요하며, 목표는 이미지가 아닌 검색 가능한 HTML을 만드는 것입니다.
PowerPoint (.pptx)이미지가 삽입된 Markdown 또는 HTML 슬라이드덱슬라이드는 보통 이미지와 캡션 텍스트로 연속된 페이지 형태로 렌더링하는 것이 좋습니다.
레거시 헬프 파일 (.hhp, .chm)Markdown이 형식들은 풍부한 계층형 토픽을 가지고 있어 헤딩 구조와 자연스럽게 매핑됩니다.
ePub/전자책Markdown 또는 HTMLePub 내용은 이미 HTML 기반이므로 대부분 재포장만 하면 됩니다.
OpenOffice/LibreOffice (.odt)Markdown.docx와 유사하게 동일한 헤딩 계층을 가집니다.

간단히 말해 구조를 유지하면서 가장 단순한 텍스트 표현으로 변환합니다—대부분은 Markdown, 세밀한 스타일링이 필요하면 HTML, 시각 중심 소스는 소수의 이미지 자산을 사용합니다.

변환 파이프라인 준비하기

탄탄한 파이프라인은 추출, 정제, 강화의 세 단계로 구성됩니다.

  1. 추출 – 소스 파일에서 원시 텍스트, 이미지, 표, 메타데이터를 꺼냅니다. 네이티브 포맷을 읽는 도구(예: LibreOffice headless, Microsoft Office Open XML 파서)를 사용하면 가장 깨끗한 결과를 얻을 수 있습니다. PDF의 경우 텍스트 객체와 스캔 이미지 를 구분할 수 있는 라이브러리를 쓰세요; convertise.app은 레이아웃을 보존하고 추출된 자산과 함께 깔끔한 Markdown 파일을 반환하는 PDF‑to‑Markdown 엔드포인트를 제공합니다.
  2. 정제 – 원시 출력물을 정리합니다. 여기에는 다음 작업이 포함됩니다:
    • 헤딩 레벨 정규화(예: 문서가 # 로 시작하고 계층이 올바르게 내려가도록).
    • 특수 문자를 UTF‑8 로 재인코딩.
    • HTML <table> 조각을 Markdown 파이프 구문으로 변환하면서 열 정렬 유지.
    • front‑matter 파서를 깨뜨릴 수 있는 보이지 않는 혹은 중복 공백 제거.
  3. 강화 – SSG‑전용 데이터를 추가합니다:
    • title, date, author, tags, version 등을 담은 front‑matter 블록(--- YAML).
    • 제너레이터가 지원한다면 목차 자리표시자({{ toc }}) 자동 삽입.
    • 이미지 최적화 – 큰 스크린샷을 웹 친화적 너비(예: 1200 px)로 다운스케일하고 WebP 로 변환해 번들 크기를 줄임.

각 단계는 Python, Node.js, Bash 등 선호하는 언어로 스크립팅할 수 있습니다. 핵심은 동일한 소스가 언제나 동일한 출력을 만들어 내도록 deterministic하게 운영하는 것이며, 이는 신뢰할 수 있는 CI 빌드에 필수적입니다.

변환 과정에서 의미론적 구조 보존하기

가장 흔한 실수는 변환을 순수 텍스트 덤프로 취급하는 것입니다. 이렇게 하면 다음과 같은 의미론적 단서가 사라집니다:

  • 목록 – 순서·무순서 목록이 단순 문단 구분으로 전락해 계층 구조가 사라짐.
  • 코드 블록 – 인라인 코드는 일반 텍스트가 되고, fenced 블록은 구문 강조에 필요한 언어 식별자를 잃음.
  • 각주·미주 – 본문에 병합돼 참조 네비게이션이 깨짐.

이를 방지하려면 변환 엔진에 각 구성 요소를 명시적으로 매핑하도록 설정합니다. 예를 들어 convertise.app으로 Word 문서를 변환할 때 preserveListspreserveCodeBlocks 옵션을 활성화하면(API에서 제공) 리스트는 - 혹은 1. 프리픽스를, 코드 블록은 언어 태그가 포함된 삼중 백틱(```) 형태의 Markdown을 생성합니다.

아래는 변환 스크립트에 삽입할 수 있는 간결한 매핑 표입니다:

  • 헤딩 → # … (레벨 1) → ## … (레벨 2) → …
  • 볼드**text**
  • 이탤릭*text*
  • 표 → Markdown 파이프 구문 | Header |
  • 이미지 → ![alt text](path/to/image.ext)
  • 링크 → [link text](url)
  • 코드 → ```language\ncode\n```
  • 각주 → [^1]: footnote text

이 요소들을 보존하면 SSG의 내장 플러그인(예: jekyll-toc, hugo-pagetoc)이 정확한 네비게이션을 자동 생성하고, 사이트 검색 인덱스도 이를 제대로 파싱합니다.

이미지 및 미디어 자산 다루기

대부분의 문서에는 스크린샷, 다이어그램, 때로는 짧은 동영상이 포함됩니다. 변환 파이프라인은 이러한 자산을 1급 시민으로 취급해야 합니다:

  • 추출 – 소스 파일에 삽입된 모든 이미지를 꺼냅니다. Word와 PowerPoint는 이미지가 별도 바이너리 파트로 저장돼 추출이 간단합니다. PDF는 래스터 객체이므로 무손실 설정(PNG 또는 TIFF)으로 내보냅니다.
  • 일관된 이름 부여docname-figure01.png 와 같이 결정적 네이밍 스킴을 사용해 여러 문서에 동일 이미지가 있더라도 충돌을 방지합니다.
  • 최적화 – 무손실 압축기(pngquant --quality=100)로 압축한 뒤, 브라우저가 지원하면 WebP 로 변환합니다. 구형 브라우저를 위한 PNG fallback도 함께 보관합니다.
  • 참조 – 최종 이미지 경로를 Markdown에 삽입해 SSG가 출력 자산 폴더에 복사하도록 합니다.

아카이브용 원본 고해상도 이미지는 별도 raw/ 디렉터리에 보관하고, 공개 사이트에서는 제외하지만 향후 재수출이 가능하도록 레포에 유지합니다.

메타데이터 전송: 소스 → Front‑Matter

메타데이터는 문서 생명주기와 연결되는 접착제 역할을 합니다. 대부분의 저작 도구는 다음과 같은 속성을 포함합니다:

  • 제목
  • 작성자(들)
  • 생성·마지막 수정 날짜
  • 버전 번호
  • 키워드·태그

추출 단계에서 파일 패키지의 해당 속성을 조회합니다. Office Open XML 형식의 경우 core.xml 파트에 Dublin Core 메타데이터가 들어 있습니다. PDF는 XMP 패킷에 유사한 필드가 포함됩니다. 얻은 정보를 바탕으로 Markdown 파일 상단에 YAML front‑matter 블록을 생성합니다:

---
title: "How to Configure TLS for Apache"
author: "Jane Doe"
date: 2024-06-12
lastmod: 2025-01-03
tags: [security, apache, tls]
version: "1.3"
---

소스 파일에 해당 필드가 없을 경우, 합리적인 기본값을 적용합니다(예: 파일명을 제목으로, 현재 날짜를 date 로). 레포 전체에 일관된 메타데이터가 유지되면 SSG는 자동으로 태그 페이지, 체인지 로그, RSS 피드 등을 생성할 수 있습니다.

CI/CD 로 워크플로우 자동화하기

변환 스크립트가 안정화되면 CI 파이프라인(GitHub Actions, GitLab CI, Azure Pipelines)에 삽입합니다. 일반적인 작업 흐름은 다음과 같습니다:

  1. Checkout 문서 레포지토리.
  2. Detect git diff 로 새로 추가·수정된 소스 파일을 식별.
  3. Run 변환 컨테이너(내부에 convertise.app API 호출을 포함한 Docker 이미지)로 변경된 파일을 처리.
  4. Commit 생성된 Markdown 및 자산을 docs/ 브랜치에 푸시.
  5. Trigger SSG 빌드(예: hugo --minify).
  6. Deploy 정적 사이트를 CDN에 배포.

변환 단계가 deterministic 하고 격리된 컨테이너에서 실행되기 때문에 재현 가능한 빌드가 보장됩니다. PDF를 OCR 할 수 없듯 변환 실패가 발생하면 CI 에러로 표시되어 조기에 대응할 수 있습니다.

품질 보증: 변환 정확성 검증

자동화는 검증이 뒷받침될 때 의미가 있습니다. 두 가지 QA 레이어를 구현하세요:

  • 자동 diff – 변환 후 원본 텍스트와 체크섬 혹은 공백을 무시하는 diff 툴로 비교합니다. 5 % 이상 내용 감소가 감지되면 경고를 발생시킵니다.
  • 시각 회귀 테스트 – 이미지‑중심 페이지에 대해 렌더링된 HTML 스크린샷을 생성하고 pixelmatch 같은 도구로 기준 이미지와 비교합니다. 깨진 표나 누락된 CSS로 인한 레이아웃 변형을 포착합니다.

회귀가 감지되면 배포를 중단하고 PR 코멘트에 차이를 표시하도록 합니다. 이를 통해 공개된 문서가 조용히 품질이 저하되는 일을 방지할 수 있습니다.

사례 연구: 레거시 지식베이스를 Hugo 로 마이그레이션

중견 SaaS 기업은 헬프 센터를 Word 문서, PowerPoint 슬라이드, 보관된 PDF 등 혼합 형태로 관리하고 있었습니다. 콘텐츠는 공유 드라이브에 있었고, 지원팀은 파일을 웹 포털에 수동으로 복사하곤 했습니다. 이 기업은 속도와 버전‑관리 친화성을 위해 Hugo 로 이전하기로 결정했습니다.

진행 과정

  1. 목록 작성 – 스크립트를 사용해 드라이브를 스캔하고 파일을 확장자별로 분류.
  2. 일괄 변환convertise.app을 이용해 대량 작업을 실행, Markdown 파일과 추출된 자산을 content/ 디렉터리에 배출.
  3. 메타데이터 매핑 – 커스텀 Python 스크립트가 Word core.xml 속성을 읽어 각 Markdown 파일에 front‑matter 를 생성.
  4. 이미지 파이프라인 – 모든 스크린샷을 WebP 로 변환하고, Markdown 링크를 static/images/ 폴더를 가리키도록 재작성.
  5. CI 연동 – GitHub Actions 가 PR마다 변환을 실행해 새로운 지원 문서도 동일 프로세스를 따르게 함.

성과

  • 텍스트가 검색 가능해지면서 검색 인덱스 크기가 40 % 감소.
  • 이미지가 WebP 로 교체돼 페이지 로드 속도가 30 % 향상.
  • 지원팀이 레포에서 직접 문서를 편집하게 되어 롤백·감사 추적이 가능해짐.

이 사례는 체계적인 변환 전략이 흩어져 있던 문서 라이브러리를 빠르고 검색 가능하며 유지보수하기 쉬운 정적 사이트로 바꿀 수 있음을 보여줍니다.

SSG‑준비 문서 변환을 위한 베스트‑프랙티스 체크리스트

  • 소스 형식 식별 및 단일 텍스트 타겟(Markdown/HTML) 결정.
  • 추출은 가능한 한 포맷‑네이티브 파서를 사용.
  • 의미론적 요소(헤딩, 리스트, 코드 블록, 각주)를 보존하면서 추출.
  • 라인 엔딩·인코딩을 UTF‑8 로 정규화.
  • 자산·Markdown 파일에 결정적 파일명 부여.
  • front‑matter에 제목·작성자·날짜·태그·버전 포함.
  • 이미지 최적화(무손실 압축, WebP 변환) 및 원본은 별도 보관.
  • 컨테이너화된 CI 작업에 변환 스크립트 통합.
  • 자동 diff·시각 회귀 검증으로 출력물 검증.
  • 파이프라인 문서화를 통해 새로운 기여자가 워크플로우를 깨뜨리지 않도록 함.

결론

레거시·이질적인 문서를 정적 사이트 생성기가 소비할 수 있는 형식으로 변환하는 작업은 단순 파일 형식 교체가 아니라 구조·메타데이터·검색 가능성을 보호하는 체계적인 변환입니다. 포맷 인식 도구로 콘텐츠를 추출하고, 출력을 정제하고, SSG‑전용 front‑matter 로 강화한 뒤, 재현 가능한 CI 파이프라인에 통합하면 지식베이스를 최신, 빠르고 검색 가능한 상태로 유지할 수 있습니다.

위 접근 방식은 고품질·프라이버시‑우선 변환 서비스인 convertise.app을 활용하여 원본 파일이 안전한 환경을 떠나지 않으면서도 현대 문서 워크플로우에 필요한 깔끔한 Markdown 혹은 HTML을 제공하도록 설계되었습니다.