Flutter

[이론] MQTT란 무엇인가?

모리선생 2023. 5. 15. 12:55
728x90

목표

mqtt란 무엇인지 알아보고 어떻게 활용할 수 있는지를 연구해본다.


 

본 내용을 전현직 마케터이자 현직 개발자 및 지망생이 개인공부를 하면서 배운 내용을 정리해놓은 글입니다. 해당내용에 있어서 내용상의 문의 사항 혹은 코드상에 수정사항이 발견이 되면 알려주시면 감사하겠습니다. 같이 고민해보고 수정할 수 있도록 하겠습니다.


요즘 짧은 근황을 적자면

  1. 최대 3일에 한개씩은 Flutter에 관련된 내용을 업로드 하려고 노력한다.
  2. 귀멸의 칼날 만화책을 구매해서 즐겁게 보고 있다.
  3. 젤다의 전설 더 티어스 오브 킹덤을 구매해서 재밌게 하고 있다.
  4. 회사일은 돈 받은 것보다 더 열심히하는 자세를 가지고 있다 (꼰대이다.)

학술과 마케팅을 하다가 개발이라는 부분에 우연찮게 들어와서 공부를 하고 있다보니, 파면 팔수록 해당 내용이 점점 의무감이 뒤섞여서 힘든 경향이 있다. 이럴떄는 살짝 느슨하게 공부의 템포를 늦춰서 공부의 호흡이 끊어지지 않도록 유도를 하는 중이다. 만약 개발이 너무 어렵거나 뭘 할지 모르겠다면, 이렇게 살짝 템포를 쉬어도 좋다. 개발은 단기간에 몰아쳐야한다는 생각으로 부트캠프에 가서 10시간씩 공부를 하는 것도 뭐 나쁘지는 않은 방법이지만 그렇다고 자기를 너무 소모하면서 배움과 일에 집중한다면 언젠가는 퍼지기 마련이다.

 

일단 각설하고, 근래에 Firebase를 기반으로 Firestore에 있는 데이터를 파싱해서 채팅앱으로 구현하는 프로젝트를 하다보니, 문뜩 mqtt라는 개념을 확인하게 되었다. mqtt와 Firebase를 결합하면 속도가 그렇게 빨라진다고 하는데 일단 mqtt에 대한 이론을 확인을 해보고 이 부분에 대해서 공부를 해보고자 한다.

 

MQTT란?

MQTT (Message Queing Telemetry Transport)는 ISO 표준 발행 구독 기반의 메시징 프로토콜이다. 작은 공간 혹은 네트워크 대역폭이 제한되는 상황에서 사용이 가능하며, 메시지 브로커가 필요하다는 것이 특징이다 (라고 모든 것을 알고 있는 우리 위키백과님이 알려주신다.)

이걸 읽고난 저자의 얼굴 표정... (그래서 뭐... 우쨔라고)

자 일단 '작은 공간', '제한', '브로커'가 필요하다는 특징들이 있다. 이 말인 즉슨 결국 뭔가 내용이 가볍다는 의미가 아닐까 한번 해석을 해본다. 그러니까. 일반적인 메시지들의 특징인 '데이터'를 담아서 전송하는 기술에서도 고용량의 파일이나 그림들을 전달하는 것과는 별도로 '알림' 메시지들을 전달하는 그런 능력이 있는거겠지 싶다.

 

그럼 MQTT가 흘러가는 흐름도를 보면 대충 이해가 가지 않을가?


MQTT의 흐름도

MQTT 프로토콜은 일반적으로 클라이언트/서버를 사용하는 방식 (PUSH)을 사용하는 것이 아니라 브로커 (Broker)라는 매개자를 통해 메시지를 보내는 송신자가 메시지를 '발행(Publish)'하고 수신자가 메시지를 '구독(Subscribe)'하는 형태를 사용한다. 즉, 메시지를 보내고 받는 매개체는 매개자 (Broker)라는 것이다 (2).

 

특정 토픽에 따라 Subscribe와 Publish를 하다보니 메시지를 주고 받는 통신 프로토콜이다보니 송수신 데이터가 비교적 짧고 통신 자체가 간단하다. 이러다보니 IoT 같은 간단한 데이터를 사용하는 통신환경에 효과적이다 (1).

IoT 기기들과 연결이 된 서버들의 모습 (참고: 정인환, MQTT 활용 실시간 위치 기반 IoT 메시징 시스템, 2018)

그럼 MQTT는 어떻게 흐르는 것일까. MQTT는 기본적으로 publisher, subscriber, broker에 의해서 데이터의 전달이 진행이 된다. 여기서 각각의 역할은 다음과 같다.

  • Broker (중개인): Publisher와 Subscriber 사이의 중개를 하는 역할을 하며 사이에서 메시지를 관리하여 전송해주는 중앙에서 관리하는 중앙관리자의 역할을 한다.
  • Publisher (발행인): 특정한 목적 혹은 프로젝트에 대해서 Topic에 한하여 메시지를 발행하는 역할을 한다.
  • Subscriber (수신인): 수신인은 Publisher에 의해서 발행된 Topic에 한하여서 해당 Topic을 기준으로 중개인에게 구독을 요청하는 방식이다. 

그럼 흐름은 어떻게 되는걸까? 자, 먼저 발행인은 특정 Topic에 대해서 중개인에게 메시지를 전송한다. 그럼 중개인은 발행인이 준 Topic을 들고 있으며 수신인은 특정 Topic에 대해서 중개인에게 구독을 신청한다. 그럼 새로운 메시지가 나오면 이렇게 구독을 계속해서 갱신하는 건가? 아니다. 수신인의 주기적인 체크 (이하, 'polling' 이라고 하자) 방식을 이용하여 중개인에 있는 Topic들을 조회한다. 

 

* Topic이라고 하는 것은 관심있는 주제라고 생각을 할 수가 있으며, 슬래시를 통해서 계층을 나누어서 구성할 수 있다는 장점이 있다. 밑에 설명을 하겠지만 MQTT라고 하는 것은 '제어'의 측면에서 전자기기들을 관리가 가능하다. 근데 전자기기의 파워 ON/OFF, 주요기능, 상세 기능들을 하나의 계층으로 사용을 하려면 많은 리소스가 필요할 수 있다. 하지만 계층을 나누어서 특정 기능들을 효율적으로 관리 할 수 있다면? 그렇다면 다양한 측정 센서들을 효율적으로 다룰 수 있을 것이다.

 

토픽의 계층화, JOINC, MQTT 소개

MQTT는 그럼 서버인가?

아니다. MQTT의 역할은 보는 것처럼 '중개인'이다 즉, MQTT는 발행인과 수신인 사이에서 메시지를 주고 받을 수 있도록 연결만 해주는 역할이다. 그러다보니 이를 잘 나타내는 표현이 있다. 바로 '메시지' 버스라는 개념이다. MQTT 중개인이 메시지 버스를 만들고 메시지를 흘러보내면, 버스에 붙은 애플리케이션들이 메시지를 읽어가는 방식이다. 메시지가 여러가지 있을때 이를 구분하는 방법이 바로 Topic이다.

 

MQTT의 활용

MQTT는 저전력, No TCP/IP 기반에서 운영이 가능하다고 했을 만큼 저전력이 필요하다. 즉 소형기기 및 모바일 애플리케이션을 위해서 사용이 가능하다는 것이다. 

  • 센서 정보 수집: 가전기기 및 빌딩 등에 부착된 센서들에게서 정보를 수집하는 것이 가능하다. 네트워크 영역은 LAN부터 MAN (도시영역 네트워크)까지 다양하다.
  • Message Push Server: 가장 많이 사용하는 분야일 것이다. 모바일 어플리케이션을 위한 메시지 푸쉬 서버로써 사용이 가능하며, 대표적인 예는 페이스북이라고 볼 수 있다.
  • 제어: 기기의 제어를 하는데 메시지를 송수신 함으로써 중앙에 있는 MQTT 브로커에 binding을 하여 제어하는 방식이다.

그럼 메시지를 전달하는 방식에도 여러가지가 있지 않을까? 물론 있다.

 

MQTT-QoS (Quality of Service) 3단계

메시지를 전달함에 있어서 약 3단계로 MQTT는 QoS를 구성하고 있다. 0~2이다.

  • 0단계: 메시지를 전달하지만 전달여부는 확인은 하지 않는다.
  • 1단계: 메시지는 한번 이상 전달이 되며, 헨드세이킹 과정을 추적하지 않아 중복전송이 된다.
  • 2단계: 메시지는 한번 전달되되, 헨드세이킹 과정을 추적하여 중복전송을 방지한다. 하드웨어적 리소스 손실이 필요할 수 있다.

그럼 단순 모바일 어플리케이션에 사용을 해야하는데 0~2단계를 모두 사용해야 할까? 아니다.

 

원격 네트워크의 경우 0단계가 좋다. 근데, Offline인 상태에서 메시징을 지원한다고 했을때, Queue에 저장한 메시지를 읽고 (아니면 읽어야할지 판단해야하도록) 반복 전달하는 것은 리소스의 낭비가 발생할 수 있다. 하지만 이에 반해 No TCP/IP와 TCP/IP가 섞여 있다면 1,2를 섞어 쓰는 것이 좋다. 메시지 전송이 실패했을때에는, 이에 대한 피드백을 받고 다음 단계를 수행할 수 있기 때문이다.

 

MQTT Broker의 종류

말했듯이 MQTT는 서버가 아니다. 그러다보니 다양한 종류의 브로커들을 볼 수 있다. 대표적인 브로커들이라고 한다면,

  • mosquitto
  • Rabbit MQ

이 있다. 전체 리스트는 여기서 확인이 가능하다(https://github.com/mqtt/mqtt.org/wiki/server-support).

 

MQTT로 Flutter와 연결해서 그룹채팅방을 만들 수 있다?

어떠한 단계로 MQTT로 채팅방을 구현을 할 수 있을까? 다음의 순서를 생각해보았다.

  • 브로커 선택: Mosquitto, HiveMQ, EMQ X 등 중 하나를 선택하여 설치한다.
  • Flutter 프로젝트 설정: Flutter 개발 환경을 설정하고 Flutter 프로젝트를 생성한다. mqtt_client 패키지를 사용한다.
  • MQTT 클라이언트 구성: MQTT 클라이언트를 구성하여 브로커와 연결을 설정한다. 연결 매개변수에 브로커 주소, 포트, 사용자 인증 정보 등을 포함한다.
  • 토픽 구독 및 메시지 수신: MQTT 클라이언트를 사용해 그룹채팅방에 대한 토픽을 구독하고 메시지를 수신하는 코드를 작성한다.
  • 메시지 전송: 전송 기능을 구현한 다음에 MQTT 클라이언트를 사용하여 토픽에 메시지를 게시한다.
  • UI 디자인: Flutter의 위젯을 사용해 채팅 인터페이스를 디자인한다.

MQTT 브로커를 사용해 Firestore와 통합할 수 있는 방법도 있다.

  • 중개서버통합: MQTT 메시지 중개 서버 구축 후 Firestore에 데이터를 쓰고 읽게 한다. MQTT 메시지를 받으면 중개 서버가 해당 데이터를 Firestore에 저장하고 변경사항을 MQTT 메시지로 전달할 수 있다.
  • 클라이언트 애플리케이션 통합: MQTT 클라이언트 애플리케이션 개발 후 Firestore 클라이언트 SDK를 사용 Firestore 데이터베이서에 액세스 한다. MQTT 메시지 수령시 애플리케이션에서 해당데이터를 Firestore에 쓰고, 변경사항은 다시 MQTT 메시지로 게시한다.

복잡한듯 보이지만 이렇게 합칠 경우 속도가 비약적으로 상승한다고 한다.

 

다음시간에는 Mosquitto의 설치법과 사용법을 한번 알아봐야겠다.

 

Reference

(1) 정인환, MQTT 활용 실시간 위치 기반 IoT 메시징 시스템, 2018 (https://www.google.com/url?sa=i&url=https%3A%2F%2Fkoreascience.kr%2Farticle%2FJAKO201827750146099.pdf&psig=AOvVaw3w1ilU5_uZRuKPcpYhWyNa&ust=1684209135344000&source=images&cd=vfe&ved=0CBMQjhxqFwoTCMDK44u29v4CFQAAAAAdAAAAABAE)

(2) 히진쓰의 서버사이드 기술 블로그, MQTT의 개념 (https://khj93.tistory.com/entry/MQTT-MQTT%EC%9D%98-%EA%B0%9C%EB%85%90)

(3) JOINC, MQTT 소개, (https://www.joinc.co.kr/w/man/12/MQTT/Tutorial)

 

728x90