EPUB FACTORY
EPUB 알아보기 / 기초 지식
기초 지식

EPUB 파일 안에는 무엇이 들어 있을까?
압축을 풀고 그 구조를 들여다보기

EPUB 파일은 사실 ZIP입니다. 확장자만 바꾸면 누구나 열어서 볼 수 있습니다. 이 글에서는 압축을 풀었을 때 실제로 무엇이 들어 있는지, 그리고 각 파일이 무슨 일을 하는지를 짚어 봅니다. 구조를 알고 나면 무언가 표시되지 않을 때 어디를 봐야 할지 짐작할 수 있습니다.
이 글의 목차
  1. EPUB의 압축을 풀어 보기
  2. 전체적인 모습
  3. mimetype ── 가장 이상한 파일
  4. container.xml ── 이정표
  5. content.opf ── 책의 심장
  6. nav.xhtml ── 목차
  7. 본문·CSS·이미지
  8. 손으로 만들기가 어려운 이유

EPUB의 압축을 풀어 보기

먼저 해 보는 것부터 시작합시다. EPUB 파일이 하나 있다면 이것만 하면 됩니다.

1EPUB 파일을 복사한다(원본을 상하게 하지 않도록)
2확장자를 .epub 에서 .zip 으로 바꾼다
3평소처럼 압축을 푼다

끝입니다. 특별한 소프트웨어는 필요 없습니다. EPUB은 ZIP이므로 경고 한 줄 없이 풀립니다.

반대는 되지 않습니다

"압축이 풀린다면, 폴더를 압축해서 이름을 .epub 으로 바꾸면 EPUB이 되겠네"라고 생각할 수 있습니다. 그렇게 간단하지 않습니다. 다음 절에서 설명할 압축 방식에 관한 규칙 때문입니다.

전체적인 모습

압축을 풀면 대체로 이런 모습입니다.

압축을 푼 폴더
├── mimetype       이 상자가 EPUB임을 알린다
├── META-INF/
│  └── container.xml  책의 본체가 어디 있는지 알려 준다
└── OEBPS/       책이 들어 있는 폴더
  ├── content.opf   책의 정보·수록 목록·읽는 순서
  ├── nav.xhtml    목차
  ├── text/
  │  ├── p001.xhtml  본문(한 쪽에 파일 하나)
  │  └── p002.xhtml
  ├── image/
  │  └── cover.jpg   표지 등의 이미지
  └── style/
    └── book.css   겉모습

OEBPS — 이 폴더 이름과 그 안을 나누는 방식은 만든 도구에 따라 다릅니다. item 이나 xhtml 일 수도 있고, 그래도 괜찮습니다.

이름도 위치도 바꿀 수 없는 것은 mimetype 이 맨 앞에 있어야 한다는 것, 그리고 META-INF/container.xml 입니다. 이 둘은 고정이고 나머지는 자유롭다 — 이것이 구조를 이해하는 첫걸음입니다.

mimetype ── 가장 이상한 파일

내용은 단 한 줄입니다.

application/epub+zip

하는 일은 "이 ZIP은 EPUB이다"라고 선언하는 것입니다. 다만 다른 파일에는 없는 엄격한 규칙이 따라붙습니다.

뷰어 앱은 파일의 첫 몇 바이트만 읽고 "이것은 EPUB이다"라고 판단할 수 있습니다. 위치와 형태가 못 박혀 있는 것은 그 때문입니다.

손으로 만든 EPUB이 가장 먼저 무너지는 곳

폴더를 일반 압축 도구로 묶으면 파일 순서를 고를 수 없고, mimetype 도 나머지와 함께 압축됩니다. 그 결과, 이름을 .epub 으로 바꿔도 뷰어 앱이 열지 못합니다.

"맨 앞에, 무압축으로"라는 조건을 만족시키려면 압축을 두 단계로 나눠서 돌려야 합니다. EPUB 생성 도구가 가장 먼저 하는 일이 바로 이것입니다.

container.xml ── 이정표

META-INF/container.xml 은 이렇게 생겼습니다.

<?xml version="1.0" encoding="UTF-8"?>
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
  <rootfiles>
    <rootfile full-path="OEBPS/content.opf"
      media-type="application/oebps-package+xml"/>
  </rootfiles>
</container>

하는 일은 딱 하나입니다. "책의 정보는 OEBPS/content.opf 에 있다"고 알려 줍니다.

이 이정표가 있기에 폴더 이름이 자유로울 수 있습니다. 뷰어 앱은 META-INF/container.xml 을 먼저 보고, 그것이 가리키는 곳으로 갑니다.

content.opf ── 책의 심장

EPUB에서 가장 중요한 파일입니다. 세 부분으로 나뉩니다.

부분하는 일
metadata제목·저자·언어 등 책 자체의 정보
manifest수록된 모든 파일의 목록
spine쪽을 넘기는 순서

metadata ── 책의 정보

<metadata>
  <dc:title>이상한 나라의 앨리스</dc:title>
  <dc:creator>루이스 캐럴</dc:creator>
  <dc:language>ko</dc:language>
  <dc:identifier id="uid">urn:uuid:xxxxxxxx</dc:identifier>
  <meta property="dcterms:modified">2026-08-04T00:00:00Z</meta>
</metadata>

눈여겨볼 것은 dc:title 입니다. 뷰어 앱의 책장에 표시되는 것은 파일 이름이 아니라 이 값입니다. 파일 이름을 아무리 정성껏 붙여도, 이것이 비어 있으면 책장에는 "Untitled"라고 뜹니다.

dc:language 도 중요합니다. 한국어라면 ko , 일본어라면 ja를 넣습니다. 이것이 없으면 뷰어 앱이 그 언어의 조판 규칙을 적용하지 않을 수 있는데, 그 영향이 가장 크게 나타나는 것이 일본어입니다.

manifest ── 수록 파일의 목록

<manifest>
  <item id="nav" href="nav.xhtml" media-type="application/xhtml+xml" properties="nav"/>
  <item id="p001" href="text/p001.xhtml" media-type="application/xhtml+xml"/>
  <item id="css" href="style/book.css" media-type="text/css"/>
  <item id="cover" href="image/cover.jpg" media-type="image/jpeg"/>
</manifest>

EPUB 안의 모든 파일은 여기에 등록해야 합니다. 이미지 한 장을 추가하고 등록을 잊는 것만으로 오류가 납니다. 반대로 등록은 되어 있는데 실제로는 없는 경우도 오류입니다.

목차 파일에는 properties="nav" 가 붙어서 "이 파일이 목차다"라고 알립니다.

spine ── 읽는 순서

<spine page-progression-direction="rtl">
  <itemref idref="p001"/>
  <itemref idref="p002"/>
</spine>

manifest 가 안에 무엇이 있는지의 목록이라면, spine어떤 순서로 읽는지입니다. 여기의 순서가 그대로 쪽 순서가 됩니다.

그리고 일본어 책에서 가장 중요한 부분이 page-progression-direction 입니다.

의미쓰는 책
rtl오른쪽에서 왼쪽으로 나아간다세로쓰기, 만화
ltr왼쪽에서 오른쪽으로 나아간다가로쓰기

세로쓰기 책에서 이것을 빠뜨리면 쪽이 반대로 넘어갑니다. 세로쓰기가 제대로 되지 않을 때 가장 먼저 확인할 것 중 하나입니다.

nav.xhtml ── 목차

EPUB 3은 목차를 반드시 독립된 파일로 요구합니다. 겉보기에는 평범한 HTML 링크 목록이고, epub:type="toc" 라는 표시로 구분됩니다.

<nav epub:type="toc">
  <ol>
    <li><a href="text/p001.xhtml">제1장</a></li>
    <li><a href="text/p002.xhtml">제2장</a></li>
  </ol>
</nav>

독자가 목차 버튼을 누르면 나오는 것이 이것입니다. 링크된 파일이 없으면 이동할 수 없는 책이 됩니다.

toc.ncx가 함께 들어 있기도 합니다

옛 EPUB 2에서는 toc.ncx 라는 파일이 목차 역할을 했습니다. EPUB 3은 이를 nav.xhtml 로 대체했지만, 오래된 뷰어 앱에서도 동작하도록 둘 다 넣은 EPUB도 있습니다.

본문·CSS·이미지

여기서부터는 웹페이지와 거의 같습니다.

본문을 어떻게 나눌지는 자유지만, 한 파일이 너무 크면 뷰어 앱이 굼떠지므로 장 단위로 나누는 것이 보통입니다.

손으로 만들기가 어려운 이유

보셨듯 EPUB의 구조는 복잡하지 않습니다. 글과 이미지와 디자인 지시를, 이정표와 목록과 함께 상자에 담은 것 — 그게 전부입니다.

다만 지켜야 할 규칙이 자잘합니다.

하나라도 빠지면 책이 열리지 않거나 서점 제출에서 반려됩니다. 게다가 오류의 원인은 화면에 보이는 것만으로는 대개 알 수 없습니다.

그래서 실제 제작에서는 원고나 이미지로 구조를 조립해 주는 도구를 씁니다. 그래도 한 번 속을 들여다본 적이 있으면 무언가 잘못됐을 때 어디를 볼지 짐작할 수 있습니다 — 이 글의 목적이 바로 그것입니다.

구조는 대신 조립해 드립니다

EPUB FACTORY는 여기서 설명한 구조를 전부 자동으로 만듭니다. 이미지 폴더나 텍스트 원고를 고르기만 하면 됩니다. 가입도, 설치도 필요 없습니다.

EPUB FACTORY 사용해 보기