개요
클라이언트가 실시간으로 서버로부터 데이터를 받아오는 경우는 매우 흔한 기법이다.
당장 우리가 사용하는 백준 온라인 저지 사이트를 생각해 보자.
우리가 코드를 작성하고 이를 제출하면 실시간으로 한 페이지 안에서 채점 상황이 업데이트된다.
이는 우리가 일반적으로 웹 통신에 사용되는 HTTP로 구현할 수 있을까?
HTTP로 구현해보자
HTTP는 클라이언트(브라우저)가 서버에게 요청을 날린 후, 응답이 오면 자동적으로 연결이 끝난다.
(물론, 연결을 지속시켜 Server-Sent-Events라는 기법을 사용하면 비슷한 기능을 구현할 수 있지만, 이는 추후에 알아보자.)
따라서 연결이 끝난 후, 서버는 클라이언트에게 더 이상 어떠한 신호도 보낼 수 없다.
Polling
그렇다면 방법은 하나!
주기적으로 클라이언트가 서버에게 요청을 보내고, 서버는 새로운 데이터가 있는지 확인하고, 있다면 데이터를 보내주는 것이다.
이러한 기법을 Polling이라고 한다.
Long-Polling
그런데 조금 비효율적이라는 생각이 든다.
이를 조금이나마 보완하기 위하여 Long-Polling이라는 기법도 있는데, 이 또한 주기적으로 클라이언트가 서버에게 요청을 보내고, 서버는 새로운 데이터가 있는지 확인하고, 있다면 데이터를 보내주는 것이다.
다만, Polling과의 차이점은, 서버가 새로운 데이터를 있는지 확인하고, 없다면 서버에서 특정 시간 동안 쉬며 새로운 데이터가 있나 확인한다. 특정 시간 후에도 데이터가 없다면, 그냥 요청이 종료된다.
그런데 이 또한 조금 비효율적이라는 생각이 든다.
만약 새로운 데이터가 계속 없다면 클라이언트는 서버에게 무의미한 요청을 주기적으로 보내게 되는 것이다.
WebSocket의 등장
WebSocket은 전이중 통신을 지원하는 TCP 기반 통신 프로토콜이다.
WebSocket이 HTTP는 아니지만, WebSocket은 HTTP 위에서 작동하게 되어있다.
따라서 기본 포트는 80(http, ws), 443(https, wss) 위에서 작동한다.
WebSocket은 Hand-Shaking 과정 동안 HTTP를 사용하지만, 이 과정이 끝나면 HTTP의 Upgrade 헤더를 통해 WebSocket 프로토콜로 변하게 된다.
말이 조금 어려운 것 같아 풀어쓰자면, 서버와 클라이언트가 원할 때마다 데이터를 주고받을 수 있다는 것이다.
'Other' 카테고리의 다른 글
[CI/CD] Github Actions로 Docker를 활용하여 EC2 배포 자동화하기 (1) | 2024.07.02 |
---|