본문 바로가기
IT/Spring

Rest API Response 압축하기 (Response size 줄이기)

by 최고영회 2022. 3. 17.
728x90
반응형
SMALL

Response size 가 너무 클 때 압축하는 방법은 무엇이 있을까?

 

Json data 라고 가정하고 생각해 보면

 

1. 가장 간단한건 serializing 할 때 json name:value 에서 name 을 줄이는 것이다. 

 

Gson 을 사용한다고 가정하고 @SerializedName 을 사용하면 쉽게 줄일 수 있다. 

public class UserDto {
    @SerializedName(value = "x", alternate = "x")
    protected int no;

    @SerializedName(value = "i", alternate = "i")
    protected String id;

    @SerializedName(value = "n", alternate = "n")
    protected String name;

    @SerializedName(value = "d", alternate = "d")
    protected String dept;

    @SerializedName(value = "c", alternate = "c")
    protected String ip;

    @SerializedName(value = "p", alternate = "p")
    protected String position;
}

다만, 이렇게 할 경우 serialized 된 데이터의 가독성이 떨어지기 때문에 open 된 api 가 아닌 

약속된 내부 모듈들간 사용하는 API 에 대해서만 사용하는 것이 좋다. 

 

2. Response 압축하기 

server.compression 설정을 통해 쉽게 압축할 수 있다. 

server:
  compression:
    enabled: true
    mime-types: text/html,application/json

mime-types 정의를 통해 원하는 mime-type 에 대해서만 압축할 수 있고 

min-response-size (default 2KB) 설정을 통해 압축할 데이터의 최소 사이즈를 설정할 수 있다. 

 - 작은 데이터의 경우 굳이 압축할 필요 없다. 

 

Browser 를 통해 얼마나 압축되는지 살펴 보자. 

compression 설정을 사용하지 않았을 때 response size 는 32.8KB

compression 설정 후 response size 는 1.3KB

 

web client 로 테스트 해 보자.  compression 설정 전 32kb 정도의 데이터를 received 하는 것을 볼 수 있고 

server 에서 compression 설정을 해도 webclient 로 rest api 호출 시 여전히 변함 없는 것을 확인할 수 있다.

reactor.netty.http.client public abstract class HttpClient 객체 생성 시 compress 를 enabled 시켜야 한다. 

다시 테스트 해 보면 gzip 으로 처리된 데이터를 정상적으로 압축 상태로 통신한 것을 확인할 수 있다. 

 

참고사항

 - 압축은 많은 CPU 를 사용한다. 

 - 모든 데이터를 압축하기 보다는 필요한 데이터에 대하여 압축하는 것이 좋다. 

 - Server 에서 제공하는 API 중 평균적인 데이터량을 조사하고 min-response-size 를 적당히 설정하는 것이 좋을 듯 하다.

 - API 별로 압축 여부를 결정할 수 없을까? (조금 더 리서치 필요)

728x90
반응형
LIST