컴퓨터와 디지털 · 데이터와 기록

ZIP — 여러 파일은 어떻게 한 봉투에 들어갈까

한데 묶는 일과 크기를 줄이는 일은 다르다

약 5분의 작은 발견

내 읽기 목록 ↗
여러 문서를 정리하는 사람 곁에 지퍼 파우치가 놓인 AI 비유 장면.
KnowledgeWalk 제작 AI 삽화 · 실제 압축률·전후 용량 비교가 아닌 파일 묶음의 분위기 삽화.

사진 열 장을 보내려는데 한 장씩 첨부하기가 번거롭다. 폴더를 압축하자 ZIP 파일 하나가 생긴다. 안에는 분명 여러 파일이 들어 있는데 겉에서는 하나로 보인다. 여기까지는 익숙한데, 왜 어떤 때는 용량이 크게 줄고 어떤 때는 거의 그대로일까.

이 질문을 풀려면 두 가지 일을 나누어야 한다. 여러 파일을 한데 담는 것과 각 파일의 데이터를 더 짧게 표현하는 것이다. 보통 압축이라는 말 한마디로 부르지만 같은 작업은 아니다. ZIP은 이 둘을 함께 생각하기 좋은 파일 형식이다.

01. 봉투에는 내용뿐 아니라 목록도 필요하다

ZIP에는 파일의 데이터와 함께 이름 등 파일을 구별할 정보가 들어간다. 여러 문서를 한 봉투에 넣었더라도 다시 꺼낼 때 어느 문서가 무엇인지 알아야 한다. 폴더의 구조를 담으면 파일 사이의 위치 관계도 이어 갈 수 있다.

따라서 ZIP은 단순히 원래 파일들을 틈 없이 붙여 놓은 덩어리가 아니다. 프로그램이 내용을 찾고 풀 수 있도록 정해진 구조를 가진다. libarchive의 형식 설명은 ZIP의 중앙 디렉터리도 다룬다. 전체 내용의 목록을 찾아 읽는 방식이 있다는 정도로 이해하면 된다.

02. 묶었지만 압축하지 않은 파일도 있다

ZIP 안의 각 항목은 압축하지 않은 상태로 저장될 수도 있다. 여러 파일을 하나로 전달하는 편리함은 크기를 줄이는 작업 없이도 얻을 수 있다. 덧붙여야 할 관리 정보 때문에 원래 파일들의 합보다 조금 커질 수도 있다.

이 사실을 알면 ZIP 파일이 예상만큼 작아지지 않았다고 곧바로 실패라고 생각할 필요가 없다. 하나의 꾸러미를 만드는 목적과 저장 공간을 줄이는 목적이 따로 있기 때문이다. 하나를 잘했다고 다른 하나까지 언제나 이루어지는 것은 아니다.

03. 같은 말을 다시 쓰지 않는 방법

압축의 원리를 이해하려면 반복되는 문장을 떠올려 보자. 같은 구절이 여러 번 나오면 매번 전부 적는 대신 앞의 어느 부분을 다시 읽으라는 짧은 약속을 만들 수 있다. 이해를 위한 비유이며 실제 ZIP이 문장의 뜻을 요약한다는 말은 아니다.

ZIP에서 널리 쓰이는 DEFLATE 방식은 이런 반복을 활용한다. 앞서 나온 바이트 배열과 같은 부분을 찾으면 길이와 뒤로 돌아갈 거리를 기록하는 식이다. 컴퓨터는 문장의 감동이나 중요도를 판단해 덜어 내는 것이 아니라 되돌릴 수 있는 규칙으로 데이터를 표현한다.

04. 자주 나오는 값을 짧게 적기도 한다

DEFLATE에는 허프먼 부호화도 사용된다. 데이터 값을 표현하는 기호의 길이를 조정하는 방식이다. 이 이름을 외우지 않아도, 반복되는 부분을 가리키는 일과 개별 값을 효율적으로 적는 일이 함께 압축에 쓰인다는 점은 이해할 수 있다.

실제 형식에는 이를 다시 풀 때 필요한 약속도 들어간다. 줄여 적은 문서와 그 문서를 읽는 규칙이 함께 있어야 하는 셈이다. 그래서 내용에 따라 줄어드는 정도가 다르고, 압축 자체에 필요한 정보도 공간을 사용한다. 무조건 같은 비율로 작아지는 마법은 아니다.

05. 무손실은 무엇을 지킨다는 뜻일까

이 방식은 압축을 풀었을 때 원래의 바이트를 되찾는 무손실 압축이다. 사진의 세부나 문서의 단어를 일부 버려서 크기를 줄이는 요약과 다르다. 편지 열 장을 보내며 다섯 장의 내용만 남기는 방식이 아닌 것이다.

물론 ZIP을 만들기 전에 사진이 이미 손실 압축되어 있었다면 그 이전의 세부까지 복원되지는 않는다. 보존하는 대상은 ZIP에 넣은 파일의 데이터다. 어느 단계의 원본을 말하는지 구분하면 무손실이라는 말을 과장하지 않고 이해할 수 있다.

06. 왜 사진과 동영상은 잘 줄지 않을까

JPEG 사진이나 이미 압축된 동영상은 앞선 저장 과정에서 반복과 패턴을 줄여 놓았을 수 있다. 같은 데이터를 다시 다른 압축기에 넣어도 더 줄일 여지가 적을 수 있다. 반면 반복이 많은 단순한 자료는 큰 차이를 보일 수 있다.

RFC 1951은 어떤 무손실 압축법도 가능한 모든 입력을 반드시 더 작게 만들 수는 없다고 설명한다. 모든 파일이 반으로 줄어든다는 기대 자체가 맞지 않는 것이다. ZIP에 담았는데 크기가 비슷하다면 안에 넣은 자료의 성격도 함께 볼 필요가 있다.

07. 압축과 잠금은 다른 기능이다

ZIP 형식에는 암호화 기능을 쓰는 경우도 있지만, ZIP이라는 이유만으로 내용을 보호하는 것은 아니다. 여러 파일을 묶거나 압축했다는 사실과 암호로 접근을 제한했다는 사실은 다르다. 지퍼가 달린 주머니가 곧 금고가 되지는 않는 것과 비슷하다.

또 ZIP은 언제나 DEFLATE 한 종류만 사용하는 형식도 아니다. 구현과 선택에 따라 다른 압축 방식이나 압축하지 않는 저장이 가능하다. 이번 글에서는 가장 익숙한 원리를 설명했으며 모든 프로그램의 기능이 같다고 안내하지 않는다. 담는 형식과 안쪽의 처리 방법을 구별하면 된다.

08. 작은 봉투를 다시 열어 보면

함께 실은 AI 삽화는 문서를 모으는 사람과 지퍼 파우치의 비유다. 실제 압축 전후의 크기를 비교한 실험 그림은 아니다. 봉투라는 이미지는 여러 파일을 함께 전달한다는 뜻을 떠올리는 데만 사용하면 된다.

다음에 ZIP 파일을 만들 때는 두 질문을 나누어 보자. 파일들이 편하게 한데 모였는가, 그리고 데이터는 얼마나 줄었는가. 둘의 답이 달라도 이상한 일은 아니다. 익숙한 압축 버튼 뒤에는 내용을 잘 보관하는 일과 같은 내용을 더 효율적으로 적는 일이 함께 들어 있다.

이야기의 바탕이 된 자료
← 데이터와 기록의 다른 이야기