IOSignal Server란?
IOSignal 서버의 기본 기능은 접속된 클라이언트들간의 1:1 및 1:N 통신 중계입니다.
- 메시징 프로토콜을 내장하여 별도의 서버측 코딩이 필요없습니다.
- 웹브라우저 뿐 아니라 Node.js 데스크탑앱 및 아두이노 클라이언트를 지원합니다.
- 실시간 양방향 통신을위해 WebSocket 또는 CongSocket 을 사용합니다.
- 암호화 인증이나 암호화 통신도 지원합니다.
HTTP 웹서버
웹서버가 웹브라우저와 통신시 사용하는 HTTP 프로토콜을 매우 광범위하게 사용되지만 몇가지 부족한 점이 있습니다.
- ❌ 실시간 양방향 통신 미제공
- 🍪브라우저 쿠키🍪등 불필요한 헤더 정보의 반복 전송
socket.io
HTTP 프로토콜을 사용하지만 LONG POLLING 등의 기법을 통해 실시간 양방향 통신 기능을 구현할 수 도 있습니다. 그중 잘 알려진게 Socket.io 입니다. 하지만 결국 제대로된 실시간 통신을 지원하는 웹소켓이 생겼습니다. ( 참고로 현재는 socket.io 도 웹소켓을 내부적으로 지원합니다.)
웹소켓
웹소켓(WebSocket)은 웹서버와 웹브라워저간의 실시간 양방향 통신을 지원하기 위해 나온지 10년이 넘는 표준기술이며 이미 모든 모던웹브라우저에서 사용 가능합니다.
- 서버와 클라이언트 둘다 원하는 순간에 메시지를 전송할 수 있 습니다.
- 채팅, 제어신호, 실시간 변화 데이타 모니터링 등에 활용되고 있습니다.
😑 다만, 웹소켓은 웹서버와 웹브라우저 사이의 1:1 통신연결을 제공할 뿐이며, 다수의 클라이언트들간의 메시지를 전달해주는 방법은 별도로 구현해줘야합니다.
채팅서버
웹소켓을 사용하여 채팅 서비스를 만들 수 있습니다. 웹소켓 서버에 접속된 다수의 클라이언트(브라우저)가 접속한 뒤, 채팅룸을 만들고, 참여자 목록을 공유해주고, 전체에게 메시지를 브로드캐스팅해주거나, 특정 클라이언트에게만 메시지를 전달 해주는 등의 기능을 구현해주면됩니다.
즉, 서버는 클라이언트에게서 수신한 메시지를 어떻게 전달해줄지 프로그래밍으로 정의해 줘야합니다.
이를 편리하게 할 수 있도록 socket.io 에서는 room 을 만들거나 join 하거나 broadcast 나 1:1 전송 명령어 API 등을 제공합니다.
🤩 하지만, 직접 프로그램 하지 않고도 미리 제공되는 메시지전송 규칙(프로토콜)을 그대로 사용하는 방법도 있습니다.
MQTT
이미 잘 알려진 메시지를 전달 프로토콜 중 하나가 MQTT 입니다. 원거리로 분산되어 위치한 저사양 임베디드 장치가 전송하는 데이타를 편리하게 수집하고 관리하기 위해 만들어진 경량 프로토콜이며 IBM에서 20여년전에 제작 후 현재도 사용되고 있으며, 현재는 OASIS 표준으로 관리되고 있습니다.
MQTT 의 경우 메시지를 중계해주는 서버를 브로커(Broker)라고 부르는데, 프로토콜이 공개되어있으며 다수의 오픈소스 브로커 서버와 클라이언트 라이브러리가 존재합니다. 가령 Eclipse Mosquitto , paho 가 있습니다.
여기서 중요한건, MQTT 서버(브로커)를 실행하기만 해도 메시지 중계를 시작하며, 별도의 서버측 프로그래밍을 하지 않아도 된다는 점입니다.
이렇게 프로그래밍 없이 메시지 전달을 하기위해 사용되는 개념이 구독(Publish)과 발행(Subscribe) 모델입니다. 짧게 PubSub
이라는 표현을 사용하기도 합니다.
구독 배포 프로토콜 (PubSub)
구독 발행 모델은 MQTT 에서만 사용되는 개념은 아니고, redis
같은 메모리기반 데이타베이스에서의 메시지전달에서도 사용됩니다. 유튜브 채널의 구독과 발행도 동일한 개념입니다.
publish 배포
특정 클라이언트가 새로운 메시지를 채널,토픽
으로 발행하면, 브로커가 해당 채널,토픽
을 이미 구독한 클라이언트에게 전달해줍니다.
io.publish('channel#topic', 'message)
// publish 명령과 signal 은 동일합니다.
io.signal('channel#topic', 'message)
subscibe 구독
특정 채널,토픽
을 구독하면 브로커가 클라이언트 목록을 기억해두고, 해당 채널,토픽으로 새로운 메시지가 발행되면 구독자에게 전달해줍니다.
io.subscribe('channel#topic', 'message)
channel & topic 채널과 토픽
위애서 설명한대로 채널,토픽
은 구독자와 발행자를 연결해주는 키워드 입니다.
IOSignal Protocol vs MQTT
IOSignal 서버도 MQTT와 유사한 PubSub 모델을 기본으로 하는 프로토콜입니다. 단, MQTT 프로토콜과는 차이가 많습니다.
- MQTT는 다중 topic tree를 지원합니다.
토픽트리 예)
/office/sensor/light1
- IOSignal 은 target , 구분문자, topic 으로 구성되며 MQTT 같은 다중 depth topic tree를 지원하지 않습니다.
- target 은 cid 이거나 channel 키워드입니다.
- 구분문자는 타겟이 채널일 경우
#
타겟이 cid 인 경우@
입니다.
시그널 태그 예)
channel#topic
cid@topic
IOSignal 은 MQTT에서 불필요한 기능을 제외해서 사용법이 더 간단 합니다. 대신 부족한 기능은 추가했습니다. 자세한 시그널 태그 사용법은 아래 별도 문서에 정리해뒀습니다.
IOSignal 클라이언트
위에서 소개한 메시지 브로커 서버에 접속 한 뒤 메시지를 주고 받을 수 있는 클라이언트들이 IOSignal 클라이언트입니다.
다른 페이지에서 소개 되는 아두이노, 웹브라우저, Node.js 용 IOSignal 클라이언트 라이브러리를 사용하여 직접 호환되는 클라이언트 프로그램을 만들 수 있습니다.
프로그래밍이 불가한 경우 iosignal-cli
프로그램을 설치 후 터미널이나 윈도우 명령창에서 실행되는 클라이언트 프로그램을 통해서도 메시지 발행 및 구독을 체험할 수 있습니다.