CS알고리즘 - Gzip 압축 기술과 알고리즘

황제연·2025년 11월 30일

CS학습

목록 보기
194/194

개요

요즘 바쁘게 프로젝트를 진행하고 있습니다
여러 이슈가 겹치면서 요구사항도 복잡해지고 이게 과연 가능할까 싶은 요구사항도
어떻게든 해결해나가는 재미로 주니어 개발자 시절을 즐겁게 보내고 있습니다

그러던중, gzip 압축 기술을 네트워크상이 아닌
DB에 저장할 때 사용하는 케이스가 발생하면서, 평소와 다른 장소에서 사용하게된 gzip 압축 알고리즘에 관심을 갖게 되었습니다

요구사항

대량의 데이터가 담긴 JSON 데이터를 RDBMS 컬럼에 저장해야하는 요구사항이 있었습니다
조회 데이터가 적을 때는 문제되지 않지만 1만건이 넘는 데이터를 JSON으로 직렬화해서
저장하는 케이스가 존재했고,
다음과 같은 이슈 때문에 너무 비대해진 크기를 줄일 필요가 있었습니다

  • 저장공간 이슈: DB 스토리지 용량을 과도하게 차지함

고민

데이터의 검색 기능은 필요하지 않았고, 단순히 보관만이 필요한 상황이었기에
데이터를 압축해서 저장하는 방식이 떠올랐습니다

그중, 가장 효율이 좋은 Gzip 압축 알고리즘을 사용해서, 텍스트 데이터를 압축해
저장공간 과하게 차지하지 않도록 하기로 결정했습니다

Gzip이란?

Gzip(GNU zip)은 파일 압축 소프트웨어이자 파일 형식입니다
무손실 압축 기술에 해합니다

Gzip 사용처

Gzip은 다양한 곳에서 이미 사용되고 있습니다

HTTP 네트워크 통신

웹 브라우저와 서버가 통신할 때 Content-Encoding: gzip을 사용해서 HTML,CSS,JS파일을
압축해서 전송 속도를 높이고 있습니다

운영체제 및 파일 시스템

리눅스의 tar.gz가 대표적으로 사용하고 있습니다

Gzip 압축 유틸 구현

package org.utils;  
  
import java.io.ByteArrayInputStream;  
import java.io.ByteArrayOutputStream;  
import java.nio.charset.StandardCharsets;  
import java.util.Base64;  
import java.util.zip.GZIPInputStream;  
import java.util.zip.GZIPOutputStream;  
  
public class GzipUtils {  
  
    public static String compress(String data) throws Exception{  
        if(data == null || data.isEmpty()){  
            return null;  
        }  
        ByteArrayOutputStream out = new ByteArrayOutputStream();  
        try (GZIPOutputStream gzip = new GZIPOutputStream(out)){  
            gzip.write(data.getBytes(StandardCharsets.UTF_8));  
        }  
  
        return Base64.getEncoder().encodeToString(out.toByteArray());  
    }  
  
    public static String decompress(String data) throws Exception {  
        if(data == null || data.isEmpty()){  
            return null;  
        }  
        byte[] compressed = Base64.getDecoder().decode(data);  
  
        try(ByteArrayInputStream in = new ByteArrayInputStream(compressed);  
            GZIPInputStream gzip = new GZIPInputStream(in);  
            ByteArrayOutputStream out = new ByteArrayOutputStream()  
        ){  
            byte[] buffer = new byte[1024];  
            int len;  
            while ((len = gzip.read(buffer)) > 0 ){  
                out.write(buffer, 0, len);  
            }  
            return out.toString(StandardCharsets.UTF_8);  
        }  
  
    }  
  
  
}

결과

compressed: H4sIAAAAAAAA/6vmUgACpezUSiUFKwWlssSc0lQlrlouAMcJHeUYAAAA
deCompressed: {
    "key" : "value"
}

Gzip 압축기술과 DEFLATE 알고리즘

Gzip 압축기술은 내부적으로 DEFLATE 알고리즘을 사용하고 있습니다

DEFLATE는 LZ77과 허프만 코딩 알고리즘이 결합된 알고리즘입니다

LZ77(Lempel-Ziv 77) 알고리즘

데이터의 중복 패턴을 찾아 (거리, 길이)쌍의 포인터로 대체하는 알고리즘입니다
이 과정에서 슬라이딩 윈도우 방식이 사용됩니다

허프만 코딩

문자의 출현 빈도수에 따라 가변 길이의 비트코드를 부여하고, 이를 위해 이진트리를 구성합니다

각 알고리즘에 대해서는 다음 글에 이어서 더 깊이 정리하고 실제 구현까지 해보겠습니다

효과

실제 JSON 데이터는 동일한 Key 값이 반복되는 구조이기 때문에, Gzip 압축의 효율을 극대화할 수 있습니다
실제 Gzip압축을 통해 만든 데이터는 대략 50~70%의 크기를 줄일 수 있습니다

마무리

보통 gzip 압축 알고리즘은 네트워크 통신에서 자동으로 적용되기 때문에, 크게 신경쓰지 않았던 내용이었습니다

하지만 이번 이슈를 해결하기 위해 실제 서버 유틸로 구현해서
텍스트 데이터를 압축하는 방식이 새롭기도 하고,
이러한 방식으로도 문제를 해결할 수 있다는 점이 놀라워 정리하게 되었습니다

압축에 대한 키워드를 알지 못했다면 선택하지 못할 솔루션이었습니다
오늘도 또 CS의 중요성을 깨닫고 갑니다

profile
Software Developer

0개의 댓글