[번외] 데이터를 인터넷에 보내기 전에 압축하라

김수환·2024년 11월 11일
0

왜 데이터 압축이 중요한가?

  • 네트워크 대역폭 절약:
    압축을 통해 데이터 크기를 줄이면 필요한 대역폭이 감소해 네트워크 부하와 트래픽 비용이 감소한다.

  • 전송 속도 향상:
    압축된 데이터를 사용하면 대역폭을 덜 차지하기 때문에 전송이 더 빨라진다.

  • 클라우드 비용 절감:
    클라우드 서비스는 데이터 전송 양에 따라 비용이 발생한다.
    데이터를 압축하면 트래픽 비용을 절감할 수 있다.

데이터 압축 적용 사례

로그 및 이벤트 데이터 전송:
대규모의 로그와 이벤트 데이터를 전송할 때는 GZIP과 같은 압축 알고리즘을 사용해 전송량을 줄이고 비용을 절감할 수 있다.

이미지 및 멀티미디어 압축:
사용자에게 이미지를 전송할 때는 JPEG, PNG 등의 압축 포맷을 적용하고, 비디오의 경우 H.264와 같은 효율적인 코덱을 사용해 전송 데이터 크기를 줄일 수 있.

API 및 서비스 간 통신 최적화

REST API에서 JSON 데이터를 GZIP으로 압축한다.

GZIP 압축을 사용하면 데이터 크기를 크게 줄일 수 있다.
특히 모바일 네트워크와 같은 제한된 대역폭 환경에서 유용하다.

GZIP 압축은 특히 텍스트 기반 데이터를 전송할 때 유용하다.

1. 웹 서버에서 GZIP 사용

웹 서버에서 정적 콘텐츠를 GZIP으로 압축한다. (HTML, CSS, JavaScript)
웹 브라우저가 압축된 파일을 다운로드해 압축을 푼다 -> 로딩 시간 감소

ex. NGINX는 gzip 디렉티브를 사용하여 정적 파일을 자동으로 압축해 전송할 수 있다.

서버 부담 감소:
GZIP NGINX에서 처리되어 애플리케이션 서버의 리소스를 절약할 수 있다.
애플리케이션은 단순히 처리된 데이터를 NGINX로 전달하고, NGINX가 이를 압축하여 클라이언트로 보내게 된다.

효율적인 리소스 사용:
NGINX는 주로 네트워크 요청 처리에 최적화된 경량 서버이기 때문에, GZIP 압축 작업을 수행하기에도 효율적이다.

간단한 설정으로 전체 웹서버에 적용: 모든 정적 파일(HTML, CSS, JavaScript 등)과 일부 동적 콘텐츠에 대해 압축을 일괄 적용할 수 있어 편리하다.

2. REST API 데이터 전송에서 GZIP 사용

클라이언트와 서버 간의 JSON 데이터 전송에서 GZIP을 적용하여 전송 효율성을 높일 수 있다.
특히 JSON 데이터가 많거나 API 호출이 빈번할 때 GZIP을 적용하면 네트워크 사용량을 크게 줄일 수 있다.

3. 클라우드 스토리지에 로그 파일 전송

로그 파일은 매우 크다.
AWS S3와 같은 클라우드 스토리지에 전송할 때 GZIP으로 압축해 용량을 줄이면 저장 비용과 전송 시간을 아낄 수 있다.

Amazon CloudWatch Logs에서 로그 데이터를 GZIP으로 압축하여 S3에 저장하도록 설정한다.

4. 데이터 백업 및 복원

데이터베이스 백업 파일을 전송할 때 GZIP을 적용하면 네트워크 전송 시간이 단축된다.

MySQL 데이터베이스 백업(.sql)을 GZIP으로 압축하여 다른 서버로 전송하거나, 클라우드 스토리지에 업로드하여 저장 공간과 전송 비용감소시킬 수 있다.

5. IoT 장치에서 센서 데이터 전송

IoT 장치가 중앙 서버로 센서 데이터를 전송할 때 GZIP 압축을 사용할 수 있다.

원격 장치가 실시간 센서 데이터를 전송하는 경우, 데이터를 GZIP으로 압축하여 네트워크 사용을 줄이고, 전송 시간을 줄여 더욱 효율적인 실시간 모니터링이 가능하다.

Gzip 이란?

GZIP은 텍스트 파일의 중복을 줄여 압축한다.
특히 HTML, CSS, JavaScript, JSON 같은 텍스트 기반 파일에서 높은 압축 효율을 보여준다.

gzip 사용하기

# application.yml
server:
  compression:
    enabled: true                        # GZIP 압축 활성화
    mime-types: application/json, text/html, text/xml, text/plain  
										 # 압축할 MIME 타입
    min-response-size: 1024              # 1KB 이상 응답만 압축
    compression-level: 6                 # 압축 강도 설정 (1-9 범위 중 선택 가능)

mime types

text/html : HTML 문서
application/json : JSON 형식의 데이터
image/png : PNG 이미지 파일

GET /api/data HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip

nginx 설정

http {
    gzip on;                # GZIP 활성화
    gzip_types text/plain application/xml text/css text/javascript application/javascript; 
    # 압축할 파일 형식
    gzip_min_length 1024;   # 압축할 파일의 최소 크기
    gzip_comp_level 6;      # 압축 수준 (1-9 범위)
}

gzip comp level
NGINX나 다른 서버에서 GZIP 압축의 강도를 설정하는 옵션 (1~9)

gzip_comp_level 1: 가장 빠른 압축 속도와 낮은 CPU 사용량을 가지며, 압축률은 상대적으로 낮음
gzip_comp_level 9: 압축률이 가장 높지만 CPU 리소스를 많이 사용하며 압축에 더 많은 시간이 소요됨

일반적으로 4~6 수준에서 충분한 압축 효율과 속도 균형을 맞출 수 있어 추천된다고 함.

ps. 어플리케이션 레벨에서 직접 압축이 필요한 경우

특정 데이터에 대한 세밀한 제어가 필요한 경우:
일부 요청에 대해서만 압축을 적용하거나, 압축 기준을 세밀하게 조정해야 할 때 애플리케이션단에서 GZIP 설정을 활용할 수 있다.

비동기 API 호출의 경우:
FCM(푸시 알림)이나 이메일 발송 등의 기능을 직접 비동기로 처리할 때, 메모리 상의 데이터를 애플리케이션에서 압축해 전송하는 게 성능상 유리할 수 있다.

애플리케이션에서 압축을 설정할 경우 API나 데이터 로직을 다루는 방식에 따라 더 유연하게 대응할 수 있.
-> 특정 응답에 대해서만 압축이 필요한 경우 적합하다.

profile
hello human

0개의 댓글