Socket.IO의 장단점

Kyungs·2021년 11월 30일
1

JavaScript

목록 보기
3/11
post-custom-banner

Socket.IO

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

polling vs. long-polling vs. WebSocket

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

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

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

image from polling, long polling, streaming blog

Socket.IO 탄생 배경

Socket.IOWebSocket 사용이 불가능한 브라우저의 양방향 통신을 지원하기 위해, 그리고 최적화된 양방향 통신 기술을 찾아 클라이언트-서버 통신을 구현하기 위해 만들어졌다.
현재는 거의 모든 클라이언트 브라우저가 WebSocket을 지원하지만, 과거에는 아래 그림의 구 버전 브라우저에서 볼 수 있듯이 WebSocket을 지원하지 않는 브라우저가 있었다.
image from caniuse.com

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

Socket.IO 사용 이유

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

namespace, room

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

Socket.IO 단점

위에서 언급했듯이 Socket.IOlong-polling 방식을 사용하기 때문에 WebSocket보다 오버헤드가 많이 발생할 수 있다. 다만, socket을 연결할 때 transports: ['websocket'] 옵션을 줌으로써 통신 방법을 변경할 수도 있다.

Socket.IO의 또다른 단점 중 하나는 데이터의 정확성 유무를 보장하지 않는다는 것이다. Socket.IO 기능 중 하나인 ACK를 사용하여 데이터가 잘 전송되었다는 것은 보장할 수 있지만, 그 데이터가 정확한 데이터인지 보장할 수 있는 기능은 없다.

결론

모든 기능에는 장단이 있고, polling, long-polling, WebSocket 방식에도 모두 장단이 있다. 구현하고자 하는 기능과 클라이언트 특성을 잘 파악하여 가장 적합한 기술을 택하는 것이 중요하다는 생각이 든다.

참고 자료

Socket.IO 공식 문서
Socket.io — The Good, the Bad, and the Ugly
polling, long polling, streaming
[Web]http통신을 이용한 양방향 통신기법, long polling
caniuse.com

post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 4월 4일

socket.io는 long-polling 방식으로 최초 연결후 브라우저가 websocket을 지원한다면 websocket 으로 연결을 업그레이드 합니다. https://socket.io/docs/v3/client-initialization/#low-level-engine-options 관련부분 수정 부탁드려요.

답글 달기