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 설정이 없는걸 볼 수 있습니다.
그렇다면 데이터 용량도 잘 압축 됐을까요?
설정 전 컨텐츠는 805byte를 응답받았습니다.
설정 후는 어떨까요?! 551B를 받았습니다. 큰 데이터가 아니라 극적인 변화는 없지만 그래도 사이즈가 줄어들었습니다!
여기서 압축 설정이 잘 끝났습니다! 했다면 좋겠지만...
문제가 생겼습니다.
아래는 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
'Spring' 카테고리의 다른 글
[Spring] Replication 적용기 - 2 (2) | 2021.10.25 |
---|---|
[Spring] Json 응답 gzip 압축하기 - 2 (1) | 2021.09.11 |
[Spring] @TransactionalEventListener (0) | 2021.08.25 |
[Spring] @ModelAttribute @RequestParam @RequestBody 차이 (0) | 2021.04.15 |
SpringBoot build.gradle 설정 (0) | 2021.01.26 |
댓글