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