책 소개
비교적 오랜 시간이 지나도 변하지 않을 기술이나 개념들, 그리고 한꺼풀 아래에 추상화 되어 숨어있는 것들에 대한 이해를 저는 중요하게 생각합니다. 웹 어플리케이션 아래의 여러 프로토콜들과 원리, 그리고 최적화 전략을 어렵지 않게 설명하는 책입니다. 웹 개발자라면 누구나 웹 어플리케이션의 성능 문제에 대한 고민을 자연스럽게 하게 될텐데요. 책을 읽고 나면 웹 어플리케이션의 성능을 '어떻게' 개선할 것인가를 알게될 뿐만이 아니라, '왜' 그렇게 해야하는가에 대해서 납득을 하게 됩니다.
저는 그 중에서 HTTP 관련된 내용이 가장 재미있었어요. 새로 알게된 내용 중에 인상 깊었던 내용을 하나 짤막하게 정리해서 소개 해 드릴게요. 이 글을 읽는 당신이 프론트 개발자라면, 이미지 스프라이팅을 왜 해야 하는지에 대해서 고민해보신 적이 있나요?
HTTP 버전별 최적화 전략
캐시 입상도(granularity)라는 개념이 있습니다. 여러 데이터가 한 덩어리로 뭉쳐있을 경우에는 입상도가 낮고, 덩어리의 크기가 작을 수록 입상도가 크다고 할 수 있습니다. 웹 페이지를 로드하기 위한 데이터들의 입상도는 웹 어플리케이션 퍼포먼스에 영향을 미치는데, 이게 HTTP 버전에 따라 큰 차이가 있습니다. HTTP 1.X 버전에는 여러 한계점들이 있는데요, 웹 페이지를 구성하는 리소스들의 입상도가 너무 클 경우에, 즉 작은 요청이 많은 횟수로 발생할 경우 특히 심각합니다.
HTTP 1.X 버전의 한계
- 하나의 TCP 연결 당 한 번에 하나의 HTTP 요청만을 직렬로 처리할 수 있습니다. 따라서 요청의 개수가 많을 수록 레이턴시 측면에서 비효율적입니다.
- HTTP 헤더가 단순한 텍스트 형식으로 압축되지 않은 채 전송되는데, 쿠키 데이터까지 합치면 매 HTTP 요청마다 킬로바이트 단위의 프로토콜 오버헤드가 존재합니다. 이 오버헤드는 당연히 요청의 수가 많을 수록 큽니다.
그래서 HTTP 1.X 버전을 사용하는 웹 어플리케이션에서는 이 입상도를 낮추기 위한 노력으로 어플리케이션 레벨에서 이미지 스프라이팅, Javascript/CSS 파일 번들링 등의 기술을 활용합니다. HTTP 1.X 버전이 가진 한계점을 어플리케이션 단에서 극복하고자 하는거죠. (하지만 입상도를 무작정 낮춘다고 좋은 것은 아닙니다. 뭐든지 적당히가 최고죠.)
반면 HTTP 2.0의 경우에는 이러한 문제가 없기 때문에, 오히려 입상도를 높이는 것이 어플리케이션의 성능 최적화를 위한 방향입니다.
HTTP 2.0 버전에서 개선된 점
- 바이너리 프레이밍 기술을 도입하여, 여러 HTTP 요청을 하나의 TCP 연결로 처리하는 멀티플렉싱을 안정적으로 지원합니다.
- HTTP 헤더에 압축을 적용하고, 두번 이상의 HTTP 요청에 걸쳐 반복되는 헤더는 다시 요청하지 않아서 헤더 오버헤드를 줄였습니다.
사실 어플리케이션의 코드가 그 아래 계층 프로토콜에 따라 바뀌어야 한다는 건 베스트 프렉티스는 확실히 아니죠. 하지만 이렇게나 절실하고 치밀하게 퍼포먼스를 개선하는 엔지니어들이 있답니다.
책에서는 길게 분량을 할애해서 설명하는 내용인데 짧게나마 각색해서 소개를 해보고 싶었습니다. HTTP와 HTTP 2.0에 대해서 더 깊게 다루는 포스팅도 적어보고 싶네요. 내용이 재밌지 않나요? 혹시 제 설명이 부족하거나 용어가 낯설어서 이해가 완전히 되지 않으셨더라도, 내용에 흥미가 가고 더 알고 싶으시다면 책을 읽어 보시기를 권합니다.
책의 영문판은 웹 페이지의 형태로 공개되어 있어서, 아래의 페이지에서 무료로 보실 수 있습니다.