콘텐츠로 이동

18. EPUB 파일 구조 - 사실은 그냥 zip이야

한 줄 요약

EPUB은 압축 파일(.zip)에 확장자만 .epub로 바꾼 것. 안에는 HTML 페이지 + CSS + 이미지가 폴더로 들어 있다.

직접 확인해보는 법

EPUB 파일 하나를 복사해서 확장자를 .zip으로 바꿔봐. 압축 풀면 안에 이런 게 나와:

북촌실험실.epub  →  북촌실험실.zip  →  압축 풀기
├── mimetype                   ← "이건 EPUB이야" 알림판
├── META-INF/
│   └── container.xml          ← "어디 보면 돼?" 안내문
└── OEBPS/                     ← 실제 책 내용
    ├── content.opf            ← 책 정보 + 차례
    ├── toc.ncx                ← 목차
    ├── ch01.xhtml             ← 1장 본문 (HTML)
    ├── ch02.xhtml             ← 2장 본문
    ├── Styles/style.css       ← 디자인
    ├── Fonts/KoPubBatang.ttf  ← 폰트
    └── Images/cover.jpg       ← 표지 + 본문 이미지

웹사이트 만드는 거랑 똑같아. HTML로 본문 + CSS로 디자인 + 이미지 + 폰트. 그걸 zip으로 묶고 .epub이라고 붙인 게 끝.

mimetype의 황금 룰

이 한 가지만 기억하면 EPUB 빌드 절반은 끝.

# mimetype은 반드시:
# 1. 첫 번째 파일
# 2. 압축하지 않고(STORED) 통째로
zi = zipfile.ZipInfo('mimetype')
zi.compress_type = zipfile.ZIP_STORED  # 이거 안 하면 일부 뷰어가 EPUB으로 인식 못함
z.writestr(zi, 'application/epub+zip')

# 그 다음 나머지는 압축해서 (DEFLATED)

비유하자면 mimetype은 가게 간판. 손님이 멀리서도 "여긴 OO 가게구나" 한눈에 보이게 가게 입구에 세워놔야 하고, 천막으로 가리면 안 됨.

시길 vs Python 빌드

시길 (GUI) Python 빌드
시간 30분~1시간 (책 한 권) 5초
학습 곡선 직관적, 미리보기 편함 처음 한 번 스크립트 만들어야 함
디자인 변경 CSS 직접 편집 변수 하나 바꾸면 끝
적합한 책 인포그래픽 많은 책, 변칙 레이아웃 단순 구조 (에세이/일기형)

결론: 책 구조가 단순하면(엄마 책처럼 12장 + 부록 3개) Python 빌드. 변칙적이면 시길.

자동 빌드의 위력

엄마 책 빌드는 이런 식이야 (build_epub.py):

# 1. 마크다운 원고 읽기
# 2. 14개 챕터로 분리
# 3. 각 챕터 → xhtml로 변환
# 4. CSS는 Python 변수로 정의 (톤 바꾸려면 변수 하나만)
# 5. content.opf, toc.ncx 자동 생성
# 6. 표지는 Pillow로 즉석 그리기
# 7. zipfile로 묶기
# → 5초 만에 14.7MB EPUB 완성

작가 회신 받아서 본문 한 줄 고치면 → 마크다운 수정 → python build_epub.py → 새 EPUB. 시길에서 매번 임포트하는 작업이 사라짐.

비개발자에게 의미

EPUB이 "특수 포맷"이 아니라 "zip + HTML"이라는 걸 알면, 자동화 사고가 확장됨: - HTML 만들 줄 알면 EPUB 만들 줄 아는 거다 (90% 같은 기술) - Claude한테 "이 마크다운 파일들 EPUB으로 묶어줘" 시킬 수 있음 - 디자인 변경이 한 변수 수정으로 끝남

더 알아보기

  • 메모리: epub_full_build_workflow.md (실전 빌드 워크플로우 표준)
  • 메모리: epub_footnote_pattern.md (각주 표준 패턴)
  • 메모리: sigil_viewer_compatibility.md (교보·예스24·알라딘 호환성)
  • 실전 코드: D:\claude-book\70대 요양보호사 엄마 책\build_epub.py