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 별로 압축 여부를 결정할 수 없을까? (조금 더 리서치 필요)