82.1 파일 포맷 설계하기
파일 안에 파일 여러 개를 저장하려면 어떻게 해야 할까요? 생각보다 간단합니다. 다음과 같이 파일의 내용을 연달아서 저장하면 됩니다.
하지만 파일의 내용만 연달아서 저장하면 어떤 파일이 저장되어 있고, 어느 위치에 저장되어 있는지 알기가 힘듭니다. 따라서 아카이브 파일 안에는 필요한 정보를 함께 저장해야 합니다. 그러면 어떤 정보를 저장하면 좋을까요?
여러 요구사항을 만족하기 위해서는 다양한 정보를 저장해야 하겠지만 필수적인 정보는 파일 이름, 파일 크기, 파일 데이터 위치입니다(구현 방식에 따라 달라질 수 있습니다). 그리고 아카이브 파일이 맞는지 확인하기 위한 매직 넘버와 파일 버전도 필요합니다.
바이너리 형식으로 된 파일은 파일 구조가 조금이라도 바뀌면 사용이 힘들어집니다. 왜냐하면 1바이트라도 어긋나면 완전히 다른 정보를 읽게 되기 때문입니다. 그래서 보통 바이너리 형식으로 된 파일은 파일(포맷) 버전을 함께 저장하고, 파일 버전이 맞을 때만 처리하도록 구현합니다. 특히 버전간 호환성을 유지하면서 바이너리 파일의 구조를 설계하는 것은 쉽지 않은 일입니다.
현재 마이크로소프트 오피스의 워드, 파워포인트, 엑셀에서 문서를 저장하면 docx, pptx, xlsx 파일이 생성됩니다. 하지만 오피스 2007 이전 버전에서는 doc, ppt, xls 파일이 생성됩니다. 왜 이렇게 확장자 이름이 바뀐 것일까요?
doc, ppt, xls는 파일 구조가 바이너리 형식이었는데 오랫동안 오피스에서 사용되었지만 호환성을 유지하면서 더 이상 새로운 기능을 추가하거나 성능을 향상시키기 힘들어졌습니다. 결국 오피스 2007 버전부터는 OpenXML 기반 포맷인 docx, pptx, xlsx로 전환하게 됩니다. 사실 이 파일 포맷은 이미지, XML 파일 등을 압축한 zip 파일 포맷입니다.