한 블로그에서 여러 형식 파일을 동시에 만들기
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로 다운로드할 수 있게 되니 오프라인에서도 읽기가 편했다고 합니다.
이제 저는 제 경험을 바탕으로 동료 은퇴자들이 블로그를 만들 때 이 방법을 추천해주곤 합니다. 기술적 난이도가 있지만, 독자들에게 제공할 수 있는 가치가 크기 때문입니다.
혹시 여러분도 블로그를 운영하면서 “한 포스트에서 여러 형식을 지원하면 좋겠는데”라는 생각을 하셨다면, 댓글로 여러분의 경험과 필요성을 나눠주세요.