Socket.IO란 무엇인가?
![](https://velog.velcdn.com/images/qure/post/683f117a-8ea8-4522-94ee-fc392d277762/image.png)
- Socket.IO는 서버와 클라이언트가 저지연시간, 양방향 및 이벤트 기반 통신을 가능하게 해주는 라이브러리이다
- http는 일반적으로 양방향 통신이 불가능하다. 그래서 polling, long-polling, WebSocket 등을 사용하여 양방향 통신이 가능한 것 처럼 구현할 수 있다
- Socket.IO는 long-polling 방식을 사용하고 있다
polling vs long-polling vs WebSocket
polling
- 클라이언트에서 주기적으로 서버에 데이터를 요청한다
- 클라이언트에서 요청이 오면 서버에서는 변경이 없거나 새로운 데이터가 없더라도 응답을 보낸다
- 주기적으로 정해진 시간 마다 데이터를 확인할 수 있는 장점이 있지만 불필요한 요청이 많아질 수 있어 오버헤드가 과도하게 발생할 수 있는 단점이 있다
long-polling
- 클라이언트에서 요청을 보내면 서버에서는 이벤트가 발생했을 떄 응답을 보낸다
- 서버에서 변경 사항이 있을 때에만 응답을 보내기 때문에 polling 방식보다 불필요한 요청이 덜 발생하는 장점이 있다
- 하지만 클라이언트가 서버 응답을 무한정 기다리지는 않고 일정 시간이 지나면 새로운 요청을 보낸다
- 따라서 서버에서 응답을 받았을 때 클라이언트가 즉시 요청을 다시 보내면서 연결이 영구적인 것 처럼 보이도록 구현이 된다
WebSocket
- 클라이언트가 요청을 최초 한 번만 보낸다.
- 재요청을 보내지 않아서 오버헤드가 적고 효율적일 수 있다
- 그러나 필요 이상으로 연결을 오래 유지하게 되면 서버 CPU에 부담이 발생할 수 있는 단점이 있다
Socket.IO는 왜 만들어 졌을까?
- 현재는 거의 모든 브라우저에서 WebSocket을 지원해주고 있었지만 과거에는 WebSocket을 지원해주지 않아 양방향 통신을 하는데 어려움을 겪었다
- WebSocket이 불가능한 브라우저에서 양방향 통신을 할 수 있도록 도와주기 위해 만들어지게 되었다
![](https://velog.velcdn.com/images/qure/post/52d8bd43-085c-4804-a829-f5e3eef41ed4/image.png)
- 위의 그림을 보면 WebSocket을 지원해주지 않는 브라우저가 있는 것을 알 수 있고 이러한 이유로 Socket.IO가 탄생하게 되었다.
- Socket.IO는 신기하게도 웹서버의 종류와 버전을 파악해서 적합한 기술을 선택할 수 있도록 해준다. 따라서 WebSocket을 지원되지 않는 브라우저에 적합한 기술을 찾아주고 양방향 통신을 할 수 있게 해준다
- 따라서 개발자는 WebSocket 지식이 부족하더라도 채팅과 같은 기능을 쉽게 구현할 수 있게 된다
WebSocket이 아닌 Socket.IO를 사용한 이유
- 프로젝트에서 백엔드 팀이 Socket.IO로 양방향 통신을 구현했기에 우리도 이를 사용하게 되었다. 하지만 Socket.IO를 선택한 구체적인 이유는 아직 파악하지 못했기 때문에, 이 기술의 장점에 대해 조사해볼 필요성을 느꼈다.
- 현재 모든 브라우저에서 WebSocket을 지원해줌에도 불구하고 Socket.Io를 왜 사용하고 있는 건가?에 대해 의문을 가지게 된다
- Socket.IO의 가장 큰 장점은 namespace, room 기능이다
namespace
: 클라이언트와 서버 간의 별도의 통신 채널이다. 단일 서버에서 여러 개의 네임스페이스를 작성할 수 있고, 클라이언트는 특정 네임 스페이스를 해당 네임 스페이스의 다른 클라이언트에게만 이벤트를 수신하거나 방출 할 수 있다
room
: 함께 결합된 소켓 그룹이다. 소켓은 여러 룸에 합류하거나 떠날 수 있다 연결된 모든 사용자에게 방송하는 대신 특정 클라이언트 그룹에게 메시지를 보낼 수 있다.
⇒ 마인드맵 프로젝트는 다수의 방에서 마인드맵 작업이 가능해야 하므로, 전체 사용자가 아닌 특정 방의 사용자 그룹에게만 마인드맵 데이터를 전송해야한다. 이러한 요구 사항을 충족시키기 위해 Socket.IO 선택
Socket.IO 작동 방식
![](https://velog.velcdn.com/images/qure/post/9c842437-5929-49e5-86aa-4833dc754c07/image.png)
- Socket.IO는 클라이언트와 서버 간에 WebSocket 연결을 설정하여 작동한다
- 서버는 들어오는 연결을 모니터링하며 클라이언트에서 발생하는 이벤트들을 처리한다. 클라이언트는 서버에 연결하여 이벤트를 발생시키거나 수신할 수 있다. 클라이언트에서 이벤트가 발생하면, 서버는 이를 받아 클라이언트에게 응답을 보내거나, 같은 네임스페이스나 방에 있는 다른 클라이언트에게 해당 이벤트를 전파할 수 있다
![](https://velog.velcdn.com/images/qure/post/d07ce811-2951-4ce5-9790-64222cf88030/image.png)
참고자료
https://velog.io/@kskim625/Socket.IO의-장단점
https://www.peterkimzz.com/websocket-vs-socket-io