오늘은 Socket.io에 대해서 적어보겠습니다
일단 Socket.io 이름만 들어도 Socket이란것이 무엇인지 알아야 될 것 같은 느낌을 줍니다.
소켓 이란?
- 소켓 → 프로토콜, ip주소, 포트넘버로 정의 됨.
- 떨어져 있는 두 호스트를 연결해주는 도구로써 인터페이스 역할.
- 데이터를 주고 받을 수 있는 구조체로 소켓을 통해 데이터 통로가 만들어 진다.
- 소켓의 역할에 따라 클라이언트 소켓, 서버소켓으로 구분된다.
이렇게 간단히 소개할 수 있겠습니다. 간단하게 말하면 프로토콜과 ip주소, 포트넘버로 떨어져있는 두 디바이스를
연결해주는 역할을 하고 있다고 알고 계시면 되겠습니다.
그럼 Socket.io란 무엇인가???
Socket.io란 Websocket을 기반으로 실시간 웹 애플리케이션을 위한 JavaScript 라이브러리입니다 . 웹 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 해주는 Node.js의 모듈! 입니다.
Websocket을 기반으로 하고있다고 하니 일단 Websocket에 대해서 알아야겠죠???
웹소켓은 데이터가 누락되지 않게하는 tcp기반의 양방향통신을 제공하는 컴퓨터 프로토콜이라고 생각하시면 되겠습니다 .
이 Websocket은 언제 사용하고 왜 사용하는지에 대해서 한번 알아보겠습니다.
Http 통신은 단방향 방식이고 연결이 유지가 안되기 때문에매번 업데이트 유/무를 확인하기위해서 서버에 요청을 불러와야 한다.그리고 요청을 할때 마다 전체 데이터를 불러오게 되어있다. 그렇기 때문에 서버에 많은 부하가 생기게 됩니다
하지만 웹소켓은 양방향 통신을 지원하게 되어있고 또 서버와의 연결이 유지가 된 상태에서 데이터가 오갈수있게 해주기 때문에 실시간 데이터 전송이가능해지게됩니다. 이럴 때 Websocket을 이용한다 고 생각하면 되겠습니다.
간단히 요약하자면 서버와 클라이언트가 연결되있는 상태를 만들어 주기 위해서 사용한다고 생각하시면 되겠습니다.
이 웹소켓을 개발자들이 더욱 편리하게 개발을 하기위해서 만들어진 것이 Node.js의 Socket.io 모듈이라고 생각하면 되겠습니다.
이 Socket.io의 특징으로는
이벤트기반 + 서버 소켓과 클라이언트 소켓을 연결하여서 실시간으로 양방향 통신이 가능
이라고 생각하면 되겠습니다.
이 두가지의 차이점
참조
https://www.peterkimzz.com/websocket-vs-socket-io/
WebSocket vs socket.io
사실 애초에 둘은 다른 개념입니다. 웹소켓은 양방향 소통을 위한 프로토콜입니다. 프로토콜은 쉽게 말하자면 서로 다른 컴퓨터끼리 소통하기 위한 약속 정도로 이해하면 됩니다.
반면에, socket.io는 양방햔 통신을 하기위해 웹소켓 기술을 활용하는 라이브러리입니다. 어찌보면 자바스크립트와 jQuery의 관계와 비슷하다고 할 수 있겠습니다.
그렇기 때문에 socket.io가 같은 기능을 구현하더라도 약간 느리지만, 많은 편의성을 제공합니다. 또한 Java, C++, Python 등 여러 언어들의 라이브러리 또한 지원됩니다.
그렇다면 둘 사이에 기술적으로 어떤 차이점이 있는지 짧게 정리했습니다.
WebSocket
- HTML5 웹 표준 기술
- 매우 빠르게 작동하며 통신할 때 아주 적은 데이터를 이용함
- 이벤트를 단순히 듣고, 보내는 것만 가능함
Socket.io
- 표준 기술이 아니며, 라이브러리임
- 소켓 연결 실패 시 fallback을 통해 다른 방식으로 알아서 해당 클라이언트와 연결을 시도함
- 방 개념을 이용해 일부 클라이언트에게만 데이터를 전송하는 브로드캐스팅이 가능함
그래서 어떤 걸 써야하는데?
짧게 정리했지만 사실, 이 정도는 다른 블로그나 문서에도 이미 잘 설명되어 있는 내용입니다.
그렇다면 우리에게 정말 중요한 것은 대체 언제 WebSocket을 사용하고, 언제 socket.io를 사용해야할 지 기준을 정해야 하는 것이겠죠.
개인적으로 이렇습니다. 서버에서 연결된 소켓(사용자)들을 세밀하게 관리해야하는 서비스인 경우에는 Broadcasting 기능이 있는 socket.io을 쓰는게 유지보수 측면에서 훨씬 이점이 많습니다.
반면 가상화폐 거래소같이 데이터 전송이 많은 경우에는 빠르고 비용이 적은 표준 WebSocket을 이용하는게 바람직하겠죠. 실제로 업비트나 바이낸스 소켓 API를 사용해보면 정말 엄청나게 많은 데이터가 들어옵니다.
결국 선택의 몫은 어떤 서비스를 제공할 것인가에 따라 달려있네요. (진리의 케바케)
아, 추가로 여러분들이 알아두셔야 할 내용이 있습니다. socket.io로 구성된 서버에게 소켓 연결을 하기 위해서는 클라이언트측에서 반드시 socket.io-client 라이브러리를 이용해야합니다. 꼭 짝을 맞춰주세요.
저는 Socket.io로 채팅기능을 구현하였습니다. 왜냐하면 Socket.io에서는 여러가지 메소드들을 제공을 해주는데 emit ( 보내다 ) ,on (받다) ,join(들어가다) ,leave(나가다) room(방을 만들어 room에 들어있는 소켓끼리 통신할수 있게 해준다) 등등 을 제공해줍니다 .
저는 처음에 java socket으로 공부를 하였는데 java socket은 사용자가 들어올 때 나갈때 방을 나누어줄때를 일일히 로직을 생각하고 구현을 했어야만 했었습니다. 근데 socket.io를 사용하니까 정말 편안하게 구현을 할 수있었던 것이 생각이 납니다 . 여러분도 화이팅하세요~
참고
'생각정리' 카테고리의 다른 글
에이블디(Able.d) 수료 후기 ! (1) | 2021.11.25 |
---|---|
생명주기에 대하여 (0) | 2021.10.21 |
WebRTC 동작원리 및 나의 생각 (0) | 2021.10.19 |
Node.js 에 대한 나의 생각(feat.javascript) 2편 (0) | 2021.10.18 |
Node.js 에 대한 나의 생각(feat.javascript) 1편 (0) | 2021.10.16 |