콘텐츠로 건너뛰기

ZIP의 압축률이 파일에 따라 크게 다른 이유는?

카테고리: 파일 형식
이 기사는 현재 일본어로만 제공됩니다. 번역본은 순차적으로 공개될 예정입니다.

「ZIP으로 압축했는데 거의 작아지지 않았다」 또는 「텍스트 파일은 압축 후 크기가 대폭 줄었다」는 경험이 있나요? ZIP 압축률은 파일 종류에 따라 크게 다릅니다. 이 글에서는 그 이유와 각 파일 형식의 특성을 설명합니다.

파일 유형별 압축 후 크기 (원본 100% 대비) 0% 100% TXT / CSV ~15% JSON / XML ~20% HTML / CSS / JS ~25% DOCX / XLSX ~90% PDF ~95% JPEG / PNG / MP3 ~99% MP4 / ZIP ~100%
그림: 파일 유형별 ZIP 압축률 비교 (작을수록 효과적)

ZIP에서 사용되는 압축 알고리즘: Deflate

ZIP 포맷(.zip)은 주로 <strong>Deflate</strong> 알고리즘을 사용합니다. Deflate는 다음 두 가지 기술을 결합한 것입니다.

  • <strong>LZ77(Lempel-Ziv 1977)</strong>: 데이터 내 반복 패턴을 "이전 출현 위치의 참조"로 대체
  • <strong>허프만 부호화</strong>: 출현 빈도가 높은 문자를 짧은 비트열로 표현

즉, <strong>반복 패턴이 많은 데이터일수록 압축률이 높고</strong>, 반대로 랜덤 데이터나 이미 압축된 데이터는 거의 압축할 수 없습니다.

파일 형식별 압축률

파일 형식압축률(참고값)이유
텍스트(.txt)60~80% 감소반복된 문자·단어가 많음
CSV70~85% 감소구분 문자・동일한 패턴이 반복
HTML / XML / JSON65~85% 감소태그·키 이름의 반복이 많음
로그 파일70~90% 감소타임스탬프 형식의 반복이 많음
BMP (무압축 이미지)50~80% 감소같은 색상의 연속된 픽셀이 많음
PDF5~20% 감소많은 경우 내부적으로 zlib 압축이 이미 되어 있음
PNG0〜5% 감소이미 Deflate로 압축됨
JPEG0〜5% 감소이미 DCT + 허프만으로 압축됨
MP3 / AAC0~3% 감소이미 손실 압축됨
MP4 / H.2640~3% 감소이미 고도로 압축됨
ZIP / GZ / 7z0~2% 감소(경우에 따라 크기 증가)이미 압축된 데이터의 재압축은 거의 효과가 없음

압축된 파일이 더 커지는 경우

JPEG나 MP4와 같이 이미 압축된 파일을 ZIP으로 압축하면, ZIP 헤더(파일 메타데이터) 때문에 파일 크기가 <strong>약간 증가</strong>할 수 있습니다. ZIP 형식은 각 파일에 대해 로컬 파일 헤더(30바이트 이상)와 전체 ZIP의 중앙 디렉토리를 포함하기 때문입니다.

JPEGファイル (1.00 MB)
 └── ZIP圧縮後: 1.00 MB + ヘッダー(約50B)= わずかに増加

「Store」모드와의 구분

ZIP에는 압축하지 않고 파일을 저장하는 <strong>Store</strong> 모드가 있습니다. 이미 압축된 파일(JPEG, MP4 등)을 여러 개 묶을 때 Store 모드를 사용하면 압축 처리의 CPU 부하를 제거하면서 동일한 크기로 저장할 수 있습니다.

# zip コマンドで圧縮レベルを指定
zip -0 archive.zip image.jpg video.mp4   # Store(圧縮なし)
zip -9 archive.zip data.csv report.txt   # 最大圧縮

# Python で圧縮レベルを指定
import zipfile
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
    zf.write('data.csv')

테스트용 ZIP 파일의 특성

DevLab의 테스트용 ZIP 파일은 파일 크기를 정확하게 제어하기 위해 <strong>랜덤 데이터(의사 랜덤 바이트 시퀀스)</strong>를 포함합니다. 랜덤 데이터는 최대 엔트로피를 가지므로 Deflate 압축이 거의 효과가 없습니다. 따라서 "10MB ZIP 파일" = "압축 해제 후에도 약 10MB"입니다.

"압축 해제 후 특정 크기가 되는 ZIP이 필요"하다면 다음과 같은 방법으로 테스트 파일을 만들 수 있습니다.

# 解凍後ちょうど 100MB になるZIPを作成(ゼロバイト埋め、高圧縮)
dd if=/dev/zero bs=1M count=100 | zip -9 zero-100mb.zip -

# 解凍後ちょうど 100MB になるZIPを作成(ランダムデータ、ほぼ無圧縮)
dd if=/dev/urandom bs=1M count=100 | zip -0 random-100mb.zip -

요약

  • ZIP의 압축률은 <strong>데이터의 반복 패턴</strong>의 많음으로 결정됨
  • 텍스트·CSV·XML은 <strong>60~85% 감소</strong> 가능
  • JPEG, MP4, 기존 압축 파일은 <strong>거의 압축할 수 없음</strong> (오히려 약간 증가할 수 있음)
  • 이미 압축된 파일을 결합할 때는 <strong>저장 모드(-0)</strong>로 CPU 절약
  • DevLab의 테스트용 ZIP은 랜덤 데이터를 사용하므로 압축 해제 전후로 크기가 거의 동일합니다

→ <a href="/ja/files/zip/">테스트용 ZIP 파일 다운로드는 여기</a>

이 기사에서 사용할 수 있는 테스트 파일

  • → <a href="/ja/files/zip/" class="text-primary-600 dark:text-primary-400 hover:underline">ZIP 테스트 파일 목록</a>
  • → <a href="/ja/files/csv/" class="text-primary-600 dark:text-primary-400 hover:underline">CSV 테스트 파일 목록</a>

관련 기사

  • → <a href="/ja/blog/file-format-quick-reference/" class="text-primary-600 dark:text-primary-400 hover:underline">개발자를 위한 파일 형식 빠른 참조</a>
  • → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">웹 폼 파일 검증 구현 체크리스트</a>