Post

한 블로그에서 여러 형식 파일을 동시에 만들기

Jekyll에서 HTML과 iCal, PDF 등 여러 포맷을 하나의 포스트에서 생성하는 방법

한 블로그에서 여러 형식 파일을 동시에 만들기

은퇴 후 블로그를 시작한 나의 고민

제가 서울대학교에서 32년을 가르친 후 정년퇴직한 지 벌써 3년입니다. 은퇴 후 그동안 했던 연구와 강의 자료들을 정리해서 개인 블로그에 올리기로 결심했습니다. 하지만 예상치 못한 문제가 생겼습니다.

학생들과 제자들이 “교수님, 강의 일정을 캘린더에 추가하고 싶은데 iCal 형식으로도 제공해주실 수 없을까요?”라고 요청해온 것입니다. 또 다른 분들은 “PDF로도 다운로드할 수 있으면 좋겠어요”라고 말씀했습니다. Jekyll 기반의 GitHub Pages로 블로그를 만들어놓고서는 한 포스트당 HTML 형식만 생성할 수 있다는 사실을 깨닫게 됐습니다.

Jekyll의 원래 설계 한계 이해하기

Jekyll은 기본적으로 정적 사이트 생성기로 설계되었습니다. 마크다운 파일 하나를 HTML로 변환하는 것이 주 기능입니다. 예를 들어 _posts/2026-07-04-lecture-note.md 파일이 있으면 이것이 lecture-note/index.html로 변환되는 방식입니다.

그런데 여기서의 문제점은 한 번의 빌드 과정에서 같은 컨텐츠로 여러 형식의 파일을 동시에 생성할 방법이 없다는 것입니다. 2014년부터 이 부분에 대한 개선 요청이 GitHub의 Jekyll 저장소에 올라와 있었습니다.

당시 제안자는 각 레이아웃(layout)에 여러 확장자를 지정할 수 있도록 해달라는 제안을 했습니다. 즉, 동일한 마크다운 파일로부터 .html, .ics, .pdf 파일들을 동시에 생성할 수 있기를 원했던 것입니다.

실무 해결책: 커스텀 플러그인 만들기

상황을 받아들이기로 했습니다. Jekyll의 공식 기능을 기다리기보다는 직접 해결책을 찾기로 한 것입니다. Jekyll에서는 _plugins 폴더에 Ruby 스크립트를 넣으면 커스텀 플러그인으로 사용할 수 있습니다.

저는 먼저 기본 레이아웃 파일들을 정리했습니다. _layouts/post.html은 기존대로 두고, _layouts/post.ics라는 새 레이아웃을 만들었습니다. iCal 형식의 내용을 담을 수 있도록 말입니다. 그 다음 커스텀 제너레이터를 만들어서 포스트의 front matter에 formats: [html, ics]라고 명시하면 두 가지 형식 모두 생성되도록 설정했습니다.

구체적으로는 Post 클래스를 상속받은 커스텀 클래스를 만들었습니다. 포스트의 output_ext 속성을 동적으로 변경하면서 여러 번 빌드 과정을 반복하는 방식입니다. 물론 이 방식은 GitHub Pages의 자동 빌드에서는 사용할 수 없습니다. 로컬에서 빌드한 후 생성된 파일들을 커밋해야 한다는 단점이 있죠.

실제 구현과 그 결과들

저는 최종적으로 다른 접근법을 선택했습니다. GitHub Actions를 활용한 것입니다. 리포지토리에 푸시할 때마다 자동으로 빌드 스크립트를 실행할 수 있는 GitHub의 CI/CD 기능을 말입니다.

.github/workflows/build.yml 파일을 만들어서 Jekyll 빌드 시 추가 스크립트를 실행하도록 했습니다. 이 스크립트는 각 포스트마다 front matter를 읽고, formats 필드가 있으면 지정된 형식들을 모두 생성하는 것입니다. 예를 들어 강의 공지 글은 formats: [html, ics]로 설정하고, 논문 소개글은 formats: [html, pdf]로 설정하는 식입니다.

이렇게 3개월을 운영해본 결과, 학생들과 동료 교수님들의 반응이 정말 좋았습니다. 특히 강의 일정이 iCal 형식으로 제공되자 대부분이 자신의 캘린더 앱에 자동으로 추가했다고 했습니다. 또한 연구논문 요약을 PDF로 다운로드할 수 있게 되니 오프라인에서도 읽기가 편했다고 합니다.

이제 저는 제 경험을 바탕으로 동료 은퇴자들이 블로그를 만들 때 이 방법을 추천해주곤 합니다. 기술적 난이도가 있지만, 독자들에게 제공할 수 있는 가치가 크기 때문입니다.

혹시 여러분도 블로그를 운영하면서 “한 포스트에서 여러 형식을 지원하면 좋겠는데”라는 생각을 하셨다면, 댓글로 여러분의 경험과 필요성을 나눠주세요.

This post is licensed under CC BY 4.0 by the author.