Socket.IO란 이벤트를 기반한 서버와 브라우저 간의 양방향 통신을 돕는 라이브러리이다.

http는 일반적으로 양방향 통신이 불가능한데, pollinglong-pollingWebSocket 등의 시스템 디자인을 사용하여 양방향 통신이 가능한 것처럼 구현할 수 있다.

Socket.IO는 일반적으로 위 모델 중 long-polling방식을 사용한다.

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

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

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


Socket.IO는 WebSocket 사용이 불가능한 브라우저의 양방향 통신을 지원하기 위해, 그리고 최적화된 양방향 통신 기술을 찾아 클라이언트-서버 통신을 구현하기 위해 만들어졌다.

현재는 거의 모든 클라이언트 브라우저가WebSocket

을 지원하지만, 과거에는 구버전 브라우저에서 볼 수 있듯이 WebSocket을 지원하지 않는 브라우저가 있었다.

Socket.IO는 브라우저와 웹 서버의 종류와 버전을 파악하여 적합한 기술을 선택해준다. 따라서 브라우저가 WebSocket을 지원하지 않더라도 해당 브라우저에서 적합한 기술을 찾아 양방향 통신을 사용할 수 있게 해주고, 개발자가 WebSocket에 대한 이해가 적더라도 Socket.IO를 통해 채팅 기능 등을 구현할 수 있게 된다.

그렇다면, 현재는 모든 브라우저에서 웹소켓을 지원함에도 불구하고 지속적으로 연결하고 해제하는 과정을 거치는 롱폴링 방식의 소켓아이오는 왜 사용하는 것이냐!!