본문 바로가기
  • 오늘도 한걸음. 수고많았어요.^^
  • 조금씩 꾸준히 오래 가자.ㅎ
IT기술/시스템

http 압축 기술의 개요

by 미노드 2018. 10. 31.

웹 어플리케이션 성능 향상을 위한 주요 튜닝 항목으로는 시스템, DB, 어플리케이션, 웹 서버 등이 있다.

웹 서버 시스템의 주요 튜닝 포인트는 OS 최적화, 캐시 설정, WAS 성능 개선 등 이다.

어플리케이션 측면의 성능 향상을 위해 살펴볼 것은, 잘못된 어플리케이션 아키텍처, 불필요한 트랜잭션이나 서버와의 통신, 복잡한 비효율적인 데이터 처리, 복잡한 뷰의 구성이 있다.

DB 의 경우에는 잘못 설계된 데이터 모델, 인덱스의 부재 및 비효율적인 사용, Lock-Intention, 잘못된 SQL 쿼리문, 불필요한 트리거 등을 살펴봐야 한다.

 

웹 어플리케이션의 성능 향상을 위해 위의 튜닝 요소들에 대한 작업을 했음에도 고객들이 성능에 대해 불만을 재기할 수 있다.

데이터 대비 네트워크 대역폭이 충분하지 않거나, 클라이언트 PC 의 성능이 낮다면, 위의 튜닝으로 이 문제를 해결하기가 힘들다.

특히, 우리나라의 경우 외국의 웹 어플리케이션에 비해 컨텐츠가 매우 무거운 편이다.

그래서, 모바일 환경 같이 인터넷 속도가 느리고, 데스크톱 PC 에 비해 성능이 좋지 않은 환경에서는 이러한 문제가 부각될 수 밖에 없다.

 

이런 문제를 HTTP 1.1 스펙에서는 HTTP 압축 관련 헤더인 Accept – Encoding, Content – Encoding 등을 정의함으로써,

고객은 빠른 HTTP 응답 속도를 기대할 수 있으나, 웹 서버의 부하 증가가 발생하므로 고려할 요소가 많다.

충분한 대역폭을 가진 클라이언트가 주로 접속하는 웹 어플리케이션에서는 HTTP 압축이 오버헤드만 발생할 뿐이다.

또한, 이미지 등 이미 압축이 된 파일의 경우, 만족스러운 압축율을 얻을 수 없다.(해상도)

그러므로, 일반적으로 HTML, XML, 스크립트 등 텍스트 컨텐츠에 대해 압축을 수행하는 것이 좋다.

 

HTTP 압축은 두 개의 HTTP 헤더 필드에 의해 작동한다.

앞서 설명했듯이, HTTP 헤더 값인 Accept-Encoding, Content-Encoding 을 통해 클라이언트와 서버가 압축 수행여부와 압축 알고리즘을 설정한다.

Accept-Encoding 은 클라이언트가 압축된 컨텐츠를 받아서 압축을 해제할 수 있는 압축 알고리즘을 서버에 알리는 용도로 사용한다.

클라이언트가 HTTP 요청 헤더에서 Accept-Encoding 값을 “gzip, deflate” 로 보내면,

서버는 저 둘중 하나의 알고리즘으로 HTTP 압축을 수행해서 Content-Encoding 헤더에 명시하여 HTTP 응답을 보낸다.

 

이러한 HTTP 압축이 수행되는 것을 Fiddler 를 통해 테스트할 수 있다.

Composer 탭에서 Request Header 를 정의할 때, Accept-Encoding 을 설정해서 요청을 보내면,

응답 헤더에서 위와 같은 원리로 Content-Encoding 을 받는다.

물론, Accept-Encoding 값을 정의하지 않고 요청을 보내면, Content-Encoding 값도 빈값으로 온다.

또한, 클라이언트가 Accept-Encoding 값을 보냈더라도, 서버 측에서 압축을 구현하지 않았다면,

클라이언트는 Contents-Encoding 값을 받지 않으며 압축이 되지 않은 응답을 받는다.

 

보통 텍스트 컨텐츠에 대한 압축은 gzip  압축 포맷을 사용한다.

gzip 은 국제 표준으로 등록된 (RFC1952) 무료 압축 포맷이다. 그만큼 많이 사용하며, 성능도 우수하다.

그 외에 deflate, sdch 이라는 압축 포맷도 있지만,  gzip 에 비해서 주목 받진 않는다.

 

웹 서버에 압축을 구현하는 방법으로는 시스템, 어플리케이션 두가지 측면에서 볼 수 있다.

Reverse Proxy 단에서 주요 웹 서버인 nginx, apache 에 모듈을 적용해주는 방법이 있다.

nginx 는 ngx_http_gzip_module 을 제공하고, apache 또한 mod_gzip 을 제공한다.

어플리케이션 단에서의 구현은 response body 에 대해 gzip 으로 압축하고, 응답 헤더를 설정하는 방법 이다.

자바에서는 GZIPOutputStream, GZIPInputStream 이라는 gzip 을 다루는 클래스를 제공한다.