EPUB3 파일의 구조
지금부터 살펴볼 EPUB3 파일의 구조는 북디자이너 시각에서 기술합니다. 즉 파일의 이름, 종류, 내용 등에 대해서는 상세한 정보를 기록하는 것을 원칙으로 하지만, 파일의 압축 알고리즘이나 파일 내부에서의 위치 제약과 같이 사실상 도구적 이슈들은 생략해서 북디자이너의 정신 건강에 위해를 가하지 않으려고 합니다. 이 정보를 제공하는 목적은 남이 만든 EPUB3 파일을 뜯어보기 위함입니다. EPUB3 파일이 규격을 만족하는지 검사하거나, 파일들을 조합해서 EPUB3 파일을 만드는데 필요한 정보를 제공하고자 하는 것은 아닙니다. 잘 만들어진 웹서비스를 들여다보는 공부법이 효과가 있다면, 이 정보가 도움이 될 수 있을 것입니다. EPUB3 파일은 확장자를 epub 로 바꾼 zip 파일입니다. 때문에 표준적인 zip 파일 관련 소프트웨어들로 풀어 해칠 수 있습니다. 확장자를 zip 으로 변경하시면 OS 에서 기본 제공하는 방법으로 내용물을 보실 수 있을 겁니다. 파일을 풀어보면 먼저 `mimetype` 이라는 파일이 보입니다. 파일에는 `application/epub+zip` 이라고 적혀있습니다. 이 파일은 늘 이런 방식으로만 존재함으로써, EPUB 파일임을 표시하는 것이니 따로 신경 쓸 필요는 없습니다. 그 다음으로는 `META-INF` 라는 폴더가 보입니다. 앞으로 나올 대부분의 파일들은 이 폴더 아래에 위치합니다. `META-INF/container.xml` 파일은 XML 파일인데 루트파일을 지정하는 역할을 담당합니다. 예를 들면 이런 식입니다.
<?xml version="1.0"?>
<container version="1.0"
xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
<rootfiles>
<rootfile full-path="package.opf"
media-type="application/oebps-package+xml" />
</rootfiles>
</container>
`rootfile` 엘리먼트의 `full-path` 속성을 통해 정의되는 파일의 이름은 여러분이 마음대로 정할 수 있습니다. 주의할 점은 파일의 위치를 따질 때 `META-INF` 를 무시하고 zip 파일의 꼭대기에서부터 따져야 한다는 것입니다. "패키지 문서" 라고 불리는 opf 파일 역시 XML 파일입니다. `package.opf` 라는 이름을 사용했지만 다른 이름을 사용하셔도 상관없습니다. 내용은 이렇습니다.
<?xml version="1.0"?>
<package version="3.0"
xmlns="http://www.idpf.org/2007/opf"
unique-identifier="pub-id">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="pub-id">urn:uuid:7F3EB1DC-948C-3602-B3B6-D565B3DD47D3</dc:identifier>
<dc:title>북디자이너에게 고함</dc:title>
<dc:language>ko</dc:language>
<meta property="dcterms:modified">2012-09-04T12:00:00Z</meta>
</metadata>
<manifest>
<item id="toc"
href="toc.xhtml"
properties="nav"
media-type="application/xhtml+xml"/>
<item id="flowdas"
href="flowdas.xhtml"
media-type="application/xhtml+xml"/>
</manifest>
<spine>
<itemref idref="flowdas"/>
</spine>
</package>
`metadata` 엘리먼트에는 서지정보가 기록됩니다. 이 출판물의 유일한 식별번호, 제목, 언어, 최종 수정 시간 만이 꼭 필요한 정보지만, 이 외에 다양한 정보들이 포함될 수 있습니다. `manifest` 엘리먼트에는 모든 콘텐트 파일들의 목록이 나열됩니다. 앞에서 든 예에서는 XHTML 파일만을 포함시켰지만, 이미지나 CSS 파일 등 사용되는 모든 파일들은 이곳에 빠짐없이 나열되어 있습니다. 이 목록의 순서는 독자에게 제시되는 순서와는 무관합니다. `spine` 엘리먼트는 콘텐트 파일을 독자에게 제시하는 순서를 정합니다. `idref` 의 값은, 앞서 `manifest` 에서 나열한 콘텐트들의 `id` 입니다. `manifest` 에 항상 등장하는 콘텐트가 하나 있습니다. `properties` 속성에 `nav` 라는 값이 지정된 XHTML 파일인데, EPUB3 에서는 네비게이션 파일이라고 부릅니다. 앞의 예에서는 `toc.xhtml` 파일입니다. 보통 목차가 들어갑니다. 이 파일은 독특한 성격을 갖고 있습니다. 앞서 등장한 패키지 파일과 같은 XML 파일들은 독자에게 제시되기 보다는 리더 소프트웨어가 참고하기 위해 존재합니다. 반면에 네비게이션 파일은 독자에게 그대로 제시되는 XHTML 형식의 파일입니다. 그러면서 동시에 그 내용에 대단히 엄격한 규칙을 강요함으로써 리더 소프트웨어가 필요로 하는 정보를 제공하는 역할도 담당합니다. 내용을 살펴보겠습니다.
<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:epub="http://www.idpf.org/2007/opf">
<head>
<title>목차</title>
</head>
<body>
<nav epub:type="toc">
<ol>
<li><a href="flowdas.xhtml">북디자이너에게 고함</a></li>
</ol>
</nav>
</body>
</html>
HTML5 에서 추가된 `nav` 태그 바로 밑에 ol 태그가 나옵니다. `li` 태그로 목차의 각 항목을 제공하고, `a` 태그로 링크를 제공합니다. 리더 소프트웨어는 보통 `nav` 태그와 그 아래에 들어있는 내용들만 살펴서 정보를 얻어냅니다. 지금까지 살펴본 내용이 EPUB3 파일이라면 갖춰야 할 기본입니다. 파일 구조를 정리하면 이렇습니다.
mimetype
META-INF/
container.xml
package.opf
toc.xhtml
…
상용 EPUB3 파일에는 이보다 훨씬 많은 내용이 담겨있습니다. 앞으로 주제별로 나누어 살펴볼 계획입니다. 파일들을 패키징하여 EPUB3 파일을 만들었습니다. `minimal.epub` 파일을 EPUB3 최소구성의 예로 사용하시면 됩니다. 설명 드린 대로 zip 파일을 풀어서 들여다 보셔도 좋고, EPUB3 리더로 읽으셔도 좋습니다. EPUB3 리더로는 Readium 을 권해드립니다. Readium 은 EPUB3 표준을 관리하는 IDPF 에서 제작한 리더로 크롬 브라우저에서 실행됩니다. 크롬 브라우저를 먼저 설치하신 후 Chrome Web Store 에서 Readium 을 검색하시면 쉽게 발견하실 수 있습니다.