Http 압축은 항상 좋을까? (스프링 부트에서 기본 활성화가 아닌 이유)
어느날 "Http gzip 진행할게요" 라는 팀원의 이슈가 올라왔다.
http 압축은 구구의 특강 때 들었었는데, 단지 http 메시지를 압축해서 효율을 올린다 정도만 기억하고 있었다.
이참에 제대로 알아보고자 작성한다!
HTTP Compression 이란?
HTTP 압축은 서버가 클라이언트에게 리소스를 전송하기 전에 데이터를 압축하는 방식이다.
대표적으로 gzip이 사용되며, 클라이언트는 요청 시 Accept-Encoding 헤더를 통해 지원하는 압축 방식을 서버에 알린다.
서버는 압축 방식을 선택하여 사용 후 Content-Encoding 응답 헤더를 이용해 선택된 것을 클라이언트에게 알린다.
HTTP 응답을 압축하면 웹 사이트의 성능을 높일 수 있다.
Http Compression 설정
스프링 부트에서는 was 설정을 통해 쉽게 압축을 적용할 수 있다.
# application-was.yml
server:
compression:
enabled: true
적용 전후를 비교해보면, 압축 전이 9.93KB, 후가 3.26으로 약 70 % 정도 사이즈가 줄은 것을 확인할 수 있다.
그러면 항상 압축을 하는 게 좋지 않나?
그런데 생각을 하다보니, 왜 Spring boot에서는 압축이 기본적으로 활성화되어 있지 않는지 궁금했다.
스프링 부트 깃헙에서 논의한 이슈가 있었고 그 이유에 대해 알 수 있었다.
SpringBoot Project Github - Enable HTTP Response Compression by Default
이슈의 내용을 요약하자면, HTTP 압축을 할 경우 네트워크 데이터 전송량이 줄지만, 압축에 필요한 추가적인 작업으로 CPU 사용량이 늘 수 있고 응답 속도 저하로도 이어질 수 있다는 것이 핵심이었다.
또 클라이언트 역시 압축 해제를 해야하기 때문에 그에 따른 리소스가 들수도 있다.
JPEG, PNG, MP4 등 이미 압축된 파일 형식은 추가 압축 효과가 미미하여 오히려 안하는 게 나을 수도 있다.
따라서 기존 설정에서 해당 사항들을 고려해 아래와 같이 선택적으로 압축을 적용할 수도 있다.
server:
compression:
enabled: true
min-response-size: 2048 # 2KB 이상인 경우만 압축
mime-types: # 압축할 컨텐츠 타입 지정
- application/json
- application/xml
- text/html
- text/plain