@fastify/compress 플러그인을 사용하여 HTTP 응답을 자동으로 압축합니다. gzip, brotli(br), deflate 등 다양한 압축 알고리즘을 지원합니다.
왜 압축이 필요한가?
압축은 네트워크를 통해 전송되는 데이터 크기를 줄여줍니다.압축 없이
압축 사용
효과:- 전송 크기: 100KB → 10KB (90% 감소)
- 다운로드 시간: 1초 → 0.1초 (10배 빠름)
- 대역폭 절약
기본 설정
sonamu.config.ts
- threshold: 1024 (1KB 이상만 압축)
- encodings:
["br", "gzip", "deflate"](우선순위 순) - 모든 API에 자동 적용
설정 옵션
- boolean
- CompressOptions
간단한 활성화/비활성화
압축 알고리즘
Brotli (br)
가장 압축률이 높은 알고리즘- 압축률: 최고 (gzip 대비 15~20% 더 압축)
- 속도: 느림 (CPU 사용량 높음)
- 지원: 모던 브라우저 (IE 미지원)
- 정적 콘텐츠 (사전 압축 가능)
- 대역폭이 중요한 경우
- 서버 CPU에 여유가 있는 경우
Gzip
가장 보편적인 알고리즘- 압축률: 중간
- 속도: 빠름
- 지원: 모든 브라우저
- 동적 API 응답
- 실시간 압축
- 호환성이 중요한 경우
Deflate
레거시 알고리즘- 압축률: gzip과 유사
- 속도: 빠름
- 지원: 대부분 브라우저
압축 우선순위
브라우저가 여러 인코딩을 지원할 때 우선순위를 설정합니다.Threshold (최소 크기)
작은 응답은 압축하지 않습니다.- 작은 데이터는 압축 효율이 낮음
- 압축/압축 해제 오버헤드가 더 클 수 있음
- HTTP 헤더 크기 증가
- 기본값:
1024(1KB) - 적극적:
256(256B) - 보수적:
4096(4KB)
예시
Custom Types
특정 Content-Type만 압축합니다.text/*(text/html, text/css, text/plain)application/jsonapplication/javascriptapplication/xml
image/png,image/jpeg(이미 압축된 형식)video/mp4(이미 압축된 형식)- 추가 압축해도 효과 없음
함수로 제어
실전 설정 예제
1. 기본 설정 (권장)
- threshold: 1024 (1KB)
- encodings:
["br", "gzip", "deflate"]
2. 고성능 API 서버
- 최대 압축률 (brotli 우선)
- 256 바이트 이상 모두 압축
- 대역폭 최적화
3. 레거시 브라우저 지원
- IE 등 오래된 브라우저 지원
- gzip만 사용 (안정적)
4. 선택적 압축
API별로 압축을 제어하고 싶을 때:- 대부분 API는 압축 불필요
- 특정 API만 선택적으로 압축
5. CPU 절약 (보수적)
- CPU 사용량 최소화
- 큰 응답만 압축
- 빠른 처리
환경별 설정
- 디버깅 용이
- 빠른 응답 (압축 오버헤드 없음)
- 대역폭 절약
- 사용자 경험 개선
압축 확인
브라우저 개발자 도구
curl 명령
주의사항
성능 영향
장점
- 대역폭 절약: 70~90% 크기 감소
- 다운로드 속도: 특히 느린 네트워크에서 효과적
- 비용 절감: CDN 전송량 감소
단점
- CPU 사용량 증가: 압축/압축 해제 오버헤드
- 응답 지연: 압축 시간 추가 (보통 수 ms)
- 메모리 사용: 압축 버퍼
