클라이언트 로딩 시간을 줄이기 위해 API 하나에 많은 걸 담기 시작했습니다. 브라우저에서는 HTTP/1.1 연결 시 최대 6개의 커넥션만 허용해주기 때문입니다.1 그래서 서버 응답 데이터의 사이즈가 점점 커지기 시작했고, 덩달아 CDN과 IDC 네트워크 트래픽(outbound) 비용이 늘기 시작했습니다. 그 중에는 변하지 않는 데이터도 포함되어 있고, 변하는 데이터도 포함되어 있습니다. 변하지 않는 데이터는 중간 레이어에서 캐시를 통해 해결할 수도 있지만, 이 글에서는 서버에서 응답 데이터를 압축해서 보내는 방법을 소개합니다.
Spring Boot 애플리케이션 설정
서버에서 클라이언트에 응답 시 응답 데이터를 압축해서 보낼 수 있습니다.
Spring Boot 애플리케이션이라면 간단하게 application.yaml
파일에 아래 설정만 추가하면 됩니다.
server:
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,text/css,application/javascript,application/json
min-response-size: 1024
Servlet Filter에서 Response의 OutputStream을 GZIPOutputStream
으로 교체하면
좀 더 세밀하게 설정할 수 있습니다.
예를 들면, 특정 경로만 압축한다거나 압축 정도를 조절할 수 있습니다.2
결과
Akamai CDN을 통해서 확인해보니 (Edge Server에서 캐시되어 Origin에서 더 이상 불러오지 않는) offload 트래픽 양이 확연히 늘었고, Origin 응답 트래픽 양이 줄어들었습니다.
네트워크 대역폭(Bandwidth)과 처리량(Throughput)에 따라 응답 사이즈가 크지 않다면 속도에는 별 차이 없는 것 같습니다. 하지만 사이즈 자체가 작아지면서 네트워크 비용을 줄일 수 있습니다.
더 읽을 거리
- Compression in HTTP | MDN
- Content-Encoding | MDN
- Transfer-Encoding | MDN
-
Chrome Docs 참조. 최신 브라우저나 프록시 서버는 대부분 HTTP/2 혹은 HTTP/3를 지원하지만, 여러 개의 요청으로 나눈다해도 그만큼의 네트워크 트래픽이 발생합니다. ↩︎
최종 수정: 2025-03-23