WebSocket & Socket.io ?

Pink Chun·2022년 12월 5일
2
post-thumbnail

1. WebSocket

Web Socket 은 웹 페이지의 한계에서 벗어나 실시간으로 상호작용하는 웹 서비스를 만드는 표준 기술이다.

Web Socket의 특징
◼ 소켓을 이용하여 자유롭게 데이터를 주고 받을 수 있다.
◼ 기존의 요청-응답 관계 방식보다 더 쉽게 데이터를 교환할 수 있다.
◼ 다른 HTTP Request 와 마찬가지로 80 포트를 통해 웹 서버에 연결한다.
◼ http:// 대신 ws:// 로 시작하여 Streaming 과 유사한 방식으로 푸쉬를 지원한다.
◼ 클라이언트인 브라우저 중에서는 Chrome, Safari, Firefox, Opera에서 WebSocket을 사용할 수 있으며 각종 모바일 브라우저에서도 WebSocket을 사용할 수 있다.

2. Socket.io

Socket.io는 이벤트를 기반한 서버와 브라우저 간의 양방향 통신을 돕는 라이브러리이다. http는 일반적으로 양방향 통신이 불가능한데, polling, long polling, WebSocket 등의 시스템 디자인을 사용하여 양방향 통신이 가능한 것처럼 구현할 수 있다. Socket.io는 일반적으로 위 모델 중 long polling 방식을 사용한다.

 2-1. polling vs. long polling vs. WebSocket

 a) polling 방식에서는 클라이언트에서 주기적으로 서버에 데이터를 요청한다. 클라이언트에서 요청이 오면 서버에서는 변경이 없거나 새로운 데이터가 없더라도 응답을 보낸다. 따라서 주기적으로 정해진 시간마다 데이터를 확인해야 하는 서비스에 적합할 수 있지만, 불필요한 요청이 많아질 수 있으므로 오버헤드가 과도하게 발생될 수 있다.

 b) long polling 방식에서는 클라이언트에서 요청을 보내면 서버에서는 이벤트가 발생했을 때 응답을 보낸다. 서버에서 변경 사항이 있을 때에만 응답을 보내기 때문에 polling 방식보다 불필요한 요청이 덜 발생하게 되지만, long polling 방식에서도 클라이언트가 서버 응답을 무한정 기다리지는 않는다. 일정 시간이 지나면 새로운 요청을 보내는 방식이다. 서버에서 응답을 받았을 때는 클라이언트가 즉시 요청을 다시 보내면서, 마치 영구적인 연결이 이뤄진 것 처럼 구현된다.

 c) WebSocket 방식에서는 클라이언트가 요청을 최초 한 번만 보낸다. 재요청을 보내지 않아서 오버헤드가 적고 효율적일 수 있지만, 필요 이상으로 연결을 오래 유지할 경우 서버 CPU에 부담이 되는 등의 단점이 발생할 수 있다.

3.WebSocket vs Socket.io

애초에 둘은 다른 개념이다. WebSocket은 양방향 소통을 위한 프로토콜이다. 프로토콜은 쉽게 말하자면 서로 다른 컴퓨터끼리 소통하기 위한 약속 정도로 이해하면 된다.

반면에, socket.io는 양방향 통신을 하기 위해 WebSocket기술을 활용하는 라이브러리이다. 어찌보면 자바스크립트와 jQuery의 관계와 비슷하다고 생각하면 된다.

1) WebSocket
◼ HTML5 웹 표준 기술
◼ 매우 빠르게 작동하며 통신할 때 아주 적은 데이터를 이용함
◼ 이벤트를 단순히 듣고, 보내는 것만 가능함

2) Socket.io
◼ 표준 기술이 아니며, 라이브러리이다.
◼ 소켓 연결 실패 시 fallback을 통해 다른 방식으로 알아서 해당 클라이언트와 연결을 시도함
◼ 방 개념을 이용해 일부 클라이언트에게만 데이터를 전송하는 브로드캐스팅이 가능함

3) Socket.IO 사용 이유
현재는 거의 모든 브라우저에서 WebSocket을 지원함에도 불구하고 지속적으로 연결하고 해제하는 과정을 거치는 long polling 방식의 Socket.io를 사용하는 것에 장점이 있을까? 여러가지 장점이 있을 수 있지만, 내가 느끼는 가장 큰 장점은 namespace와 room기능이다.

 3-1) namespace, room
Socket.IO에는 namespace와 room이라는 기능이 있다. 하나의 socket 연결은 하나의 namespace를 가지며, 하나의 namespace 안에는 여러가지 room을 생성할 수 있다. 하나의 room 안에는 특정 클라이언트들을 join 하거나 leave 시킬 수 있으며, 한 클라이언트가 메시지를 보내는 등 이벤트를 발생시켰을 때 특정 room에 있는 클라이언트들에게만 이벤트를 emit하여 채팅방과 같은 기능을 구현할 수 있게 된다. Socket.IO를 통해 위 기능을 구현하면 직접 namespace, room 기능을 구현하는 것 보다 깔끔하게 코드를 작성하는 것이 가능하다.

언제 어떤걸 써야 하나?

서버에서 연결된 소켓(사용자)들을 세밀하게 관리해야하는 서비스인 경우에는 브로드캐스팅 기능이 있는 socket.io을 쓰는게 유지보수 측면에서 훨씬 이점이 많다.

반면에 가상화폐 거래소같이 데이터 전송이 많은 경우에는 빠르고 비용이 적은 표준 WebSocket을 이용한다. 실제로 업비트나 바이낸스 소켓 API를 사용해보면 정말 엄청나게 많은 데이터가 들어온다.

profile
최룰루의 개발일지(코린이)

0개의 댓글