들어가기전에..
Socket.io와 WebSocket 모두 실시간 양방향 통신을 가능하게 하는 기술인데요. 지금 다니는 회사에서는 Socket.io를 주로 사용하고 있어요. 처음 Socket.io를 공부할 때 WebSocket에 대해 먼저 공부했고, 그 당시에는 Socket.io를 사용하기 위해 공부할 때는 단순히 'room'의 개념 여부로만 알고 있었어요.
하지만 그 외에도 차이가 존재하는 것을 발견하여 리마인드 할 겸 정리해보려해요.
프로토콜의 차이점
Websocket은 TCP 소켓을 사용한 HTTP와 독립적인 프로토콜로, 양방향 통신을 제공해요.
브라우저에서 WebSocket을 지원하는 경우, 서버와의 연결을 유지한 상태로 언제든지 데이터를 주고받을 수 있죠.
반면에 Socket.io는 WebSocket을 기반으로 하는 라이브러리에요.
Websocket을 기반으로 하지만, 독립적인 프로토콜을 사용하지 않죠. 그래서 Socket.io는 Websocket을 사용할 수 없는 경우, 다른 전송 방식으로도 통신이 가능하도록 HTTP 폴링, Flash Sockets, AJAX Polling, AJAX Long Polling 등의 기능을 지원하는데 이러한 기능들은 Socket.io의 프로토콜 스택 내부에서 처리하게 돼요. 즉, Socket.io는 Websocket을 기반으로 하지만, 독립적인 프로토콜을 사용하지 않는 것이죠.
그러니까 WebSocket은 브라우저와 서버 간에 직접적인 연결을 통해 실시간 양방향 통신을 지원하는 반면에 Socket.io는 WebSocket을 포함한 다양한 전송 방식과 추가적인 기능을 제공하여 브라우저와 서버 간의 연결 문제를 해결하고, 브라우저에서도 실시간 양방향 통신을 가능하게 하죠.
따라서, WebSocket은 더 빠르고 경량화된 방식으로 실시간 양방향 통신을 지원하지만, Socket.io는 WebSocket 이외의 다양한 전송 방식과 추가적인 기능을 제공하여 브라우저 호환성과 안정성을 높이는 데 유용해요.
호환성의 차이점
Websocket은 대부분의 최신 브라우저에서 지원되지만, 일부 구형 브라우저에서는 지원되지 않을 수 있어요.
반면, Socket.io는 모든 브라우저와 서버 플랫폼에서 작동하도록 설계되어 있죠.
API의 차이점
Websocket은 기본적으로 low-level API를 제공하며, 직접 프로토콜을 다루어야 해요. 반면, Socket.io는 이벤트 기반의 API를 제공하여 데이터를 보내거나 받을 때, 이벤트를 사용하여 처리할 수 있도록 하고 있어요. 이벤트 기반의 API를 사용하면, 개발자는 데이터를 보내는 쪽과 받는 쪽 간의 복잡한 작업을 수행할 필요 없이, 간단하게 이벤트를 정의하고 처리할 수 있죠.
예를 들어, Socket.io에서는 클라이언트에서 서버로 데이터를 보내는 'emit' 메서드와 서버에서 클라이언트로 데이터를 보내는 'broadcast' 메서드 등의 이벤트를 제공하는데 이러한 이벤트를 사용하면, 개발자는 데이터 전송에 필요한 복잡한 작업을 구현할 필요 없이, 이벤트에 대한 콜백 함수를 작성하여 처리할 수 있어요.
보안의 차이점
Websocket은 SSL/TLS를 지원하여, 보안 통신을 할 수 있죠. 반면, Socket.io는 기본적으로 SSL/TLS를 지원하지 않지만, HTTPS를 사용하면 보안 통신을 할 수 있어요.
Room의 개념 유무
WebSocket은 기본적으로 room 개념을 지원하지 않아요. 모든 클라이언트가 서버와 독립적인 연결을 갖는 형태인데
따라서, 모든 클라이언트가 동일한 데이터를 수신하는 경우, 서버에서 해당 데이터를 모든 클라이언트에게 전송해야 해요.
이는 데이터 양이 많아지면 성능에 문제를 일으킬 수 있죠.
반면에 Socket.io는 Websocket에서 제공하지 않는 Room 개념을 지원해요. Room은 클라이언트를 그룹으로 묶어서 특정 그룹에 속한 클라이언트에게만 데이터를 전송할 수 있는 기능인데 Room을 사용하여 데이터 양을 줄이고, 성능을 향상시킬 수 있습니다.
Socket.io에서 room 개념을 사용하는 방법은 간단해요. 클라이언트는 서버에 특정 room에 join(참여)하거나, leave(나가기)할 수 있어요. 서버에서는 해당 room에 속한 클라이언트에게 데이터를 전송할 수 있죠.
예를 들어, 다음과 같은 코드를 사용하여 room에 join하는 것이 가능하죠.
socket.join('chatroom');
이 코드는 'chatroom'이라는 이름의 room에 현재 속한 클라이언트를 추가하는 코드에요.
이후, 다음과 같은 코드를 사용하여 해당 room에 속한 클라이언트에게 데이터를 전송할 수 있죠.
io.to('chatroom').emit('message', 'Hello, chatroom!');
이 코드는 'chatroom'이라는 이름의 room에 속한 모든 클라이언트에게 'Hello, chatroom!'라는 메시지를 전송하는 코드에요.
이와 같은 방법으로, Socket.io에서 room 개념을 사용하여 특정 클라이언트 그룹에 대한 데이터 전송을 쉽게 구현할 수 있죠.
Socket.io와 WebSocket의 차이에 대해 정리에 도움이 되셨길 바랍니다.
'프로그래밍(Basic) > 이론' 카테고리의 다른 글
[바미] On-premises와 Off-premises (0) | 2024.03.22 |
---|---|
[바미] SSR과 CSR (0) | 2023.09.25 |
[바미] 다수의 요청에 의해서 데이터를 CRUD 원활하게 관리하기. (0) | 2023.01.30 |
[바미] IPC (2) | 2022.12.29 |
[바미] 코드 리펙토링(Code Refactoring)에 대해서 (0) | 2022.12.28 |