본문 바로가기
Spring

[Spring] Json 응답 gzip 압축하기 - 1

by 에드박 2021. 9. 10.

Json 컨텐츠를 gzip으로 압축해서 보낼 수 있다는것을 알았습니다.

(참고자료 : https://www.baeldung.com/json-reduce-data-size)

 

baeldung님의 말에 따르면 Json응답 181kb를 기준으로 gzip 압축을 했을 때 45.9kb로 압축됐다고 합니다.

원래 크기의 25.3%가 돼서 74.7%가 압축된 셈이죠.

설정하는 법은 간단합니다. 설정파일에 아래와 같이 설정할 수 있습니다.

// application.yml
server:
  compression:
    enabled: true
    mime-types: text/html,text/plain,text/css,application/javascript,application/json
    min-response-size: 500

enabled: true  -> gzip 설정을 사용합니다.

mime-types ->  압축을 허용할 mime-type입니다.

min-response-size -> 압축을 허용할 최소 사이즈 입니다. 위 설정에서는 500바이트 미만의 데이터라면 압축을 진행하지 않습니다.

 

위 설정을 적용하고 데이터를 요청하면 아래와 같이 gzip을 사용해서 압축을 진행합니다.

 

아래는 압축 설정 적용 전, 후 입니다.

설정 전은 Content-Encoding : gzip 설정이 없는걸 볼 수 있습니다.

gzip 압축 설정 전
데이터 압축 설정 적용 후

그렇다면 데이터 용량도 잘 압축 됐을까요?

설정 전 컨텐츠는 805byte를 응답받았습니다.

gzip 설정 전

설정 후는 어떨까요?! 551B를 받았습니다. 큰 데이터가 아니라 극적인 변화는 없지만 그래도 사이즈가 줄어들었습니다!

gzip 설정 후

여기서 압축 설정이 잘 끝났습니다! 했다면 좋겠지만...

문제가 생겼습니다.

아래는 gzip 압축 설정이 된 상태에서 실행했습니다.

설정에는 위와같이 min-response-size: 500 를 포함시켰습니다.

 

위 사진을 보시면 min-response-size: 500 설정이 있음에도 gzip으로 압축하여 370byte의 용량을 가지고 있습니다.

압축전에 500byte이상이지 않을까? 라고 생각했지만 압축되기전 용량은 319byte였습니다.

왜 이런 결과가 생겼을까요?

범인은 Transfer-Encoding: chunked 라는 헤더값입니다.

min-response-size 설정은 Content-Length 헤더를 기준으로 동작합니다.

하지만 아래의 Transfer-Encoding 헤더 문서를 보면 Content-Length가 생략된다고 나와있습니다.

Content-Length 헤더가 생략된다면 정상작동하지 않을까? 라고 생각했습니다.

하지만 Transfer-Encoding: chunked 헤더가 있고 enabled가 true 설정이라면 mime-types에 설정된 타입의 응답은 모두 압축해서 응답합니다.

 

아래의 spring-framework깃허브 저장소를 보면ㄴ Transfer-Encoding: chunked 와 Content-Length가 함께 존재하면 안된다 라는 이슈가 등록되어있습니다.

https://github.com/spring-projects/spring-framework/issues/19776

 

min-response-size 이슈 어떻게 해결해야할까요?..

 

해결방법을 찾아서 2편으로 돌아오겠습니다!!!

 


참고자료

- https://www.baeldung.com/json-reduce-data-size

- https://gunju-ko.github.io/spring/spring-boot/2018/06/16/SpringBootCompression.html

- https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Transfer-Encoding

댓글