프로젝트를 진행하면서 한번에 최대 40개 가량 API를 호출하여 테이블과 차트를 그리는 상황이 있었다.
어떻게든 index를 먹여서 개발을 완료하고 운영 서버에 배포를 했는데 이게 왠걸?
로컬과는 다르게 테이블과 차트의 순서가 엉망이 되어 있었다.
이 문제는 어떻게든 해결했지만 그 원인에 대해서 자세히 알기 위해서 http에 대해서 공부해보았다.
Hypertext Transfer Protocol(HTTP) 인터넷에서 데이터를 주고받기 위한 통신 규약(약속) 중 하나로 브라우저와 웹 서버간에 데이터를 주고 받을 때 사용된다. 요청(request) , 응답(response) 구조로 이루어 짐
HTTP 요청을 서버로 보낼 때 GET, POST, PUT, DELETE와 같은 HTTP 메소드와 리소스의 URL 등을 포함하여 보낸다.
이렇게 HTTP를 통해 서버로 요청, 응답을 주고 받는데, 주고 받는 과정이 시간이 지나면서 어떻게 진화가 되었는지 공부를 해보았다.
기본적으로 하나의 연결 당 하나의 요청을 처리할 수 있게 설계 되었고( 1요청 1연결), 이는 RTT 증가를 야기한다.
RTT 증가는 서버로부터 파일을 가져올 때 마다 TCP의 3-way handshake를 계속 열어야 하기 때문에 RTT가 증가하는 단점이 있다.
TCP의 3-way-handshake란?
- SYN = synchronize sequence numbers
TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷
시퀀스 번호를 임의로 설정하여 세션을 연결하는데 사욛- ACK= acknowledgment (승인)
서버로 부터 패킷을 받았다는걸 알려주는 패킷
HTTP/1.0의 RTT 증가 해결을 위한 방법
많은 이미지 다운로드 시 과부하가 걸리기 때문에 많은 이미지가 합쳐있는 하나의 이미지를 다운 받고 이를 기반으로 background-image의 position을 이용하여 이미지를 표기하는 방법
ZUM에서 아이콘을 개발자모드로 보면 하나의 background-image를 position을 이동하여 사용하는 것을 볼 수 있다.
HTTP/1.1 에서는 하나 이상의 요청에 대해 연결을 재사용할 수있도록 keep-alive라는 메커니즘을 도입했다.
클라이언트는 서버로 응답을 받기 전에 여러 요청을 보낼 수 있다.
요청에 대한 응답은 요청과 동일한 순서로 수신되어야 한다.
하지만 올바르게 구현하기 까다롭고 프록시 서버에서 파이프 라인을 제대로 처리하지 못했다.
또한 HOL Blocking이라는 문제도 있다.
HTTP/2는 여러 요청 Stream을 보낼 수 있는 HTTP Stream을 도입. HTTP/1.1 파이프라이닝(Pipelining)과 달리 각 Stream은 독립적이며 순서대로 전송하거나 수신할 필요가 없다.
HTTP/1.x 보다 지연 시간을 줄이고 응답 시간을 더 빠르게 할 수 있으며, 멀티 플렉싱, 헤더 압축, 서버 푸시, 요청의 우선 순위를 처리를 지원하는 프로토콜이다.
HTTP/2(TCP 기반)와는 달리 QUIC(Quick UDP Internet Connections)은 UDP 기반으로 동작한다.
QUIC는 HOL Blocking을 방지하고 데이터 전송 속도를 향상시킬 수 있다.
하나의 연결에서 여러 요청을 할 수 있고, 각각의 요청은 개별 Stream으로 전송된다. 이때 하나의 Stream에서 발생하는 패킷 손실이 다른 Stream에 영향을 미치지 않는다. (TCP의 세션 연결 및 끊는 과정에서 발생하는 지연시간을 줄임)
이러한 특성을 가진 HTTP/3은 웹 페이지 로딩 속도를 개선할 수 있다.
이번 공부를 통해서 서론에서 말한 순서가 왜 엉망이었는지 원인을 파악할 수 있었다.
바로 개발서버와 운영서버에서 사용하는 http 프로토콜의 버전(?)이 달랐다.
개발 서버는 http1.x 이고 운영서버은 http3.0으로 구성되어 있었다.
안그래도 개발하면서 "왜 개발서버에서는 API가 한번에 최대 4개? 6개? 밖에 안날라가지?" , "왜 계속 pending 되지?" 라는 생각을 했었는데, 이번 http공부르 하면서 왜 4~6개 밖에 호출이 안됐는지 원인을 찾을 수 있었다. (뿌듯...)
=> http/1.x의 한계..
실무를 하면서 매번 느끼는게 "코딩만 잘해서 될게 아니다." 라는 생각을 많이 하게 된다.
코딩을 아무리 잘해도 코딩 외의 문제에 부딪히게 되면 아무것도 아니게 되겠다는 생각을 자주 한다.
틈틈히 CS공부도 해서 관련 지식을 많이 채워 넣어야겠다.
아무튼, 더 늦기전에 http에 대해서 많이 이해할 수 있는 시간이었고 나중에 비슷한 환경에 놓이게 되면 유연하게 대처할 수있게 준비할 수 있을 거 같다.
주말에 인프런의 김영한님의 http강의를 보며 다시 한번 http 공부를 해야겠다.
.
.
.
.