Django
Django- gzip middleware 로 response 크기 줄이기
김지훈_
2023. 5. 29. 16:05
대량의 시계열 raw 데이터를 리턴하는 API가 있다. 조회하는 기간에 비례하여 조회하는 raw 데이터의 개수도 늘어난다.
오랜 기간에 대한 성능을 확인해보기 위해 약 1만개의 더미 데이터를 생성하고 API를 호출해보았다. (end user 입장에서의 속도를 체감해보기 위해 테스트는 크롬에서 진행했다.)
보면 데이터의 크기가 7.8 MB로 큰 편이고, 불러오는 시간도 1.79초로 긴 편이다.
그렇다면 데이터를 압축해서 보내면 네트워크 I/O가 줄어드니 성능이 좋아지지 않을까? 하는 생각에 응답 데이터를 gzip으로 압축하는 middleware를 작성해보기로 했다.
코드는 다음과 같다.
class MafGzipMiddleWare:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
# 특정 API에 대해서만 압축 적용
if 'certain-api' in request.path:
# gzip 을 받아주는 브라우저에만 압축
if 'gzip' in request.META.get('HTTP_ACCEPT_ENCODING', ''):
# 압축 가능한 형식인지 확인 (예: JSON 형식)
if response.get('Content-Type', '').startswith('application/json'):
# 압축 수행
response.content = gzip.compress(response.content)
response['Content-Encoding'] = 'gzip'
response['Content-Length'] = str(len(response.content))
return response
테스트 결과, 응답 데이터가 확연히 줄어든 것을 확인할 수 있었다.
그러나 성능은 오히려 더 안좋게 나왔는데, 데이터를 압축하는 데에 사용하는 서버 CPU 자원, 압축을 해제하는 데에 사용하는 client의 CPU 자원을 간과한 것이다.
결론은 real time으로 사용하는 api는 압축하여 사용하지 않는 편이 나을것 같다.
다만, 해당 응답 결과를 redis 등 캐시 서버에 저장해 둘 경우에는 압축하여 저장하면 메모리를 상당 부분 아낄 수 있으므로 유의미한 결과를 가질 수 있을것 같다.