0483

BE

[MQTTX] MQTT 개념부터 메시지 흐름까지 한 번에 이해하기

| 서론

안녕하세요, 팡일입니다.

IoT나 실시간 데이터 기반 서비스를 다루다 보면 “데이터가 어떻게 흘러가는지”를 직접 눈으로 확인하고 싶은 순간이 반드시 찾아옵니다. 특히 센서, 서버, 클라이언트가 동시에 얽혀 있는 구조에서는 단순한 로그만으로는 전체 흐름을 이해하기가 쉽지 않습니다.

이럴 때 가장 강력하게 활용할 수 있는 도구가 바로 MQTT 기반 테스트 환경이며, 그 중심에 있는 것이 MQTTX입니다. 이번 글에서는 MQTT의 개념부터 실제 테스트 도구인 MQTTX 활용 방법까지, 흐름 중심으로 정리해보겠습니다.

| MQTTX란?

MQTTX는 GUI 기반으로 제공되는 오픈소스 MQTT 클라이언트 도구입니다. 복잡한 설정 없이 브로커에 연결하고, 메시지를 발행(Publish)하거나 구독(Subscribe)하는 과정을 직관적으로 테스트할 수 있도록 도와줍니다.

특히 IoT 환경에서는 센서 데이터가 제대로 전달되는지 확인하는 것이 중요한데, MQTTX를 사용하면 메시지 흐름을 실시간으로 관찰하고 디버깅할 수 있습니다. 단순 테스트를 넘어서, 실제 서비스에서 발생하는 메시지 구조를 이해하는 데에도 매우 유용한 도구입니다.

| MQTT란?

MQTT(Message Queuing Telemetry Transport)는 저전력, 저대역폭 환경에서도 안정적으로 동작하도록 설계된 경량 메시징 프로토콜입니다.

IoT 환경에서는 센서나 디바이스가 네트워크 상태가 불안정하거나 리소스가 제한적인 경우가 많기 때문에, HTTP와 같은 비교적 무거운 프로토콜보다 MQTT가 훨씬 효율적으로 사용됩니다.

이 프로토콜의 핵심은 단순합니다. “가볍고, 안정적으로, 필요한 데이터만 전달한다.”

즉, 최소한의 네트워크 비용으로 최대한 안정적인 메시지 전달을 목표로 하는 구조입니다.

1) 특징

(1) 가벼움

  • MQTT는 매우 작은 헤더와 단순한 구조를 가지고 있어, 네트워크 사용량이 극히 적습니다.

  • 이 덕분에 배터리 기반 디바이스나 저사양 IoT 장치에서도 부담 없이 사용할 수 있습니다.

(2) 안정성

  • 네트워크가 불안정한 환경에서도 메시지 전달을 최대한 보장하도록 설계되어 있습니다.

  • 연결이 끊겼다가 다시 연결되더라도, 설정에 따라 메시지를 복구하거나 재전송할 수 있습니다.

(3) 보안 통신

  • TLS/SSL을 통한 암호화 통신을 지원하여, 외부 공격이나 데이터 탈취로부터 메시지를 보호할 수 있습니다.

  • 특히 IoT 환경에서는 보안이 취약해지기 쉬운데, MQTT는 이를 고려한 설계를 제공합니다.

(4) 양방향성

  • 단순히 데이터를 보내는 것뿐만 아니라, 서버에서 클라이언트로 명령을 전달하는 것도 가능합니다.

  • 즉, 센서 → 서버뿐만 아니라 서버 → 디바이스 제어까지 하나의 프로토콜로 처리할 수 있습니다.

(5) 지속적이고 상태 저장 세션

  • 클라이언트는 브로커와의 연결 상태를 유지할 수 있으며, 연결이 끊어졌을 때도 이전 상태를 복구할 수 있습니다.

  • 이 기능 덕분에 메시지 유실을 최소화하고, 안정적인 통신 흐름을 유지할 수 있습니다.

(6) 대규모 IoT 기기 지원

  • 수천, 수만 개의 디바이스가 동시에 연결되더라도 효율적으로 메시지를 처리할 수 있도록 설계되어 있습니다.

  • 브로커 중심 구조이기 때문에 확장성이 뛰어납니다.

2) 추가 개념

(1) MQTT 클라이언트

: MQTT 클라이언트는 메시지를 보내거나(게시), 받는(구독) 모든 주체를 의미합니다.

  • 센서, 모바일 앱, 백엔드 서버, 테스트 도구(MQTTX 등)까지 MQTT와 통신하는 모든 요소가 클라이언트에 해당합니다.

  • 즉, “데이터를 생산하거나 소비하는 모든 것”이 클라이언트라고 이해하면 쉽습니다.

(2) MQTT 브로커

: MQTT 브로커는 클라이언트들 사이에서 메시지를 중개하는 핵심 서버입니다.

  • 클라이언트는 서로 직접 연결되지 않고, 반드시 브로커를 통해서만 통신합니다.

  • 브로커는 다음과 같은 역할을 수행합니다.

    • 클라이언트 연결 관리

    • 메시지 수신 및 전달

    • 토픽 기반 구독 처리

    • 메시지 저장 및 재전송

  • 결국 MQTT 구조에서 브로커는 “메시지 허브” 역할을 담당합니다.

(3) 게시-구독(Publish-Subscribe) 모드

: MQTT는 게시자(Publisher)와 구독자(Subscriber)를 분리하는 구조를 사용합니다.

  • 데이터를 보내는 쪽은 누가 받을지 알 필요가 없고, 데이터를 받는 쪽도 누가 보냈는지 알 필요가 없습니다.

  • 두 클라이언트는 서로 직접 통신하지 않고, MQTT 브로커를 통해 메시지를 주고받는다.

  • 이 구조 덕분에 시스템 간 결합도가 낮아지고, 확장성과 유지보수성이 크게 향상됩니다.

(4) 토픽(Topic)

: 토픽은 메시지를 분류하고 전달하기 위한 “경로” 또는 “채널”입니다.

  • 예를 들어 "sensor/1/temperature"와 같은 형태로 계층 구조를 가지며, 데이터를 논리적으로 구분할 수 있습니다.

  • 또한 와일드카드를 통해 유연한 구독이 가능합니다.

    • + : 한 단계 매칭 (단일)

    • # : 모든 하위 포함 (다중)

    • 이 기능을 활용하면 여러 디바이스의 데이터를 한 번에 수신할 수 있습니다.

(5) 서비스 품질(QoS)

: QoS는 메시지 전달의 신뢰도를 결정하는 옵션입니다. 전달 횟수와 신뢰성 수준에 따라 메시지 손실 가능성과 중복 여부가 달라집니다.

  • MQTT는 총 3단계 QoS를 제공합니다.

    • QoS 0 : 최대 1번 전달 (빠르지만 손실 가능)

    • QoS 1 : 최소 1번 전달 (중복 가능)

    • QoS 2 : 정확히 1번 전달 (가장 안전하지만 느림)

| 게시-구독 모드 이해하기

MQTT의 구조를 가장 직관적으로 이해하는 방법은 흐름을 보는 것입니다.

온도 센서가 데이터를 생성하면, 이 데이터는 직접 사용자에게 전달되지 않습니다. 대신 MQTT 브로커로 전달되고, 해당 데이터를 구독하고 있는 모든 클라이언트에게 다시 전달됩니다.

즉, 데이터 흐름은 다음과 같습니다.

센서 → 브로커 → 여러 구독자

이 구조 덕분에 시스템은 매우 유연해집니다. 센서가 하나든 열 개든, 구독자가 하나든 수십 개든 구조를 변경할 필요 없이 확장이 가능합니다.

1) 예시

: 위의 예시를 통해 더욱 쉽게 이해할 수 있습니다.

  • 데이터를 보내는 온도 센서가 Publisher

  • 메세지를 받는 중간 서버가 MQTT 브로커

  • 데이터를 받는 스마트폰, 웹앱, PC가 Subscriber

  • 즉, 센서에서 폰으로 직접 가는 게 아니라, 센서 → 브로커 → 구독자들로 이동한다.

| MQTT 워크플로

MQTT의 통신 흐름은 크게 세 단계로 나눌 수 있습니다.

연결 → 구독/게시 → 메시지 전달

이 세 단계만 이해하면 MQTT가 어떻게 동작하는지 전체 구조를 쉽게 파악할 수 있습니다.

1) 브로커 연결 및 세션 설정 (Connection Phase)

MQTT 통신의 시작은 브로커와의 연결입니다.

클라이언트는 TCP/IP 기반으로 MQTT 브로커에 연결을 시도하며, 이 과정에서 통신을 위한 기본 환경이 설정됩니다. 필요에 따라 TLS/SSL을 적용하여 암호화된 보안 연결을 구성할 수도 있습니다.

또한 이 단계에서는 인증 정보(Username, Password 등)를 전달하고, 세션 방식도 함께 결정됩니다.

  • Clean Session: 이전 연결 상태를 유지하지 않는 방식

  • Persistent Session: 구독 정보와 메시지 상태를 유지하는 방식

이 설정에 따라 이후 메시지 처리 방식과 연결 복구 전략이 달라지게 됩니다

2) 메시지 게시 및 구독 설정 (Subscribe / Publish Phase)

연결이 완료되면, 클라이언트는 데이터를 주고받기 위한 준비를 합니다.

먼저 구독자(Subscriber)는 특정 토픽을 구독하여, 해당 토픽으로 들어오는 메시지를 수신할 준비를 합니다. 반대로 게시자(Publisher)는 특정 토픽을 기준으로 메시지를 생성하고 브로커로 전송합니다.

이때 중요한 점은, 게시자와 구독자가 서로를 전혀 알지 못한다는 것입니다.

두 클라이언트는 직접 연결되지 않고, 오직 토픽을 기준으로 브로커를 통해 느슨하게 연결됩니다. 이 구조 덕분에 시스템은 훨씬 유연하고 확장 가능하게 동작합니다.

3) 메시지 전달 및 처리 (Delivery Phase)

메시지가 게시되면, MQTT 브로커는 이를 수신하고 해당 토픽을 구독 중인 모든 클라이언트에게 전달합니다. 이 과정에서 QoS 설정이 중요한 역할을 합니다.

QoS 레벨에 따라 메시지는 다음과 같이 처리됩니다.

  • 빠르게 전달되지만 손실 가능

  • 최소 한 번 이상 전달 (중복 가능)

  • 정확히 한 번만 전달 (가장 높은 신뢰성)

또한 세션 설정에 따라, 연결이 끊긴 클라이언트를 위한 메시지 처리 방식도 달라집니다.

예를 들어 Persistent Session을 사용하는 경우, 클라이언트가 오프라인 상태일 때도 메시지를 브로커가 저장해두었다가, 재연결 시 전달해줄 수 있습니다.

이 덕분에 MQTT는 네트워크가 불안정한 환경에서도 안정적인 메시지 흐름을 유지할 수 있습니다

결국 MQTT의 워크플로는 단순한 3단계 구조이지만, 각 단계에서의 설정(세션, QoS, 보안)에 따라 전체 시스템의 안정성과 신뢰성이 결정됩니다. 이 흐름을 이해하고 나면, MQTTX 같은 도구를 활용한 테스트도 훨씬 직관적으로 다가오게 됩니다.

| 주요 사용법

1) 브로커 연결 설정 (New Connection)

  • Name: 연결 이름 (자유롭게 설정)

  • Host: 브로커 주소 (예: broker.emqx.io 또는 로컬 주소)

  • Port: MQTT 포트 (보통 1883 또는 8883)

  • Client ID: 고유 ID (기본값 사용 가능)

  • Connect: 오른쪽 상단의 'Connect' 버튼을 눌러 연결

2) 메세지 구독 (Subscribe)

  • 연결된 화면 하단의 'New Subscription' 클릭

  • Topic: 구독할 토픽 입력 (예: test/topic)

  • Confirm: 토픽을 구독하여 해당 토픽으로 오는 메시지 수신

3) 메세지 발행 (Publish)

  • 화면 하단의 메시지 입력창에서 토픽(Topic)과 메시지 내용(Payload) 입력

  • 보내기(전송) 아이콘: 클릭하여 메시지 발행

| MQTTX 사용법

MQTTX를 사용하면 MQTT의 동작 구조를 직접 눈으로 확인할 수 있습니다.

단순한 연결부터 메시지 흐름 확인까지, 단계별로 실습해보는 것이 가장 빠른 이해 방법입니다.

1) MQTT 연결 만들기

먼저 MQTT 브로커에 연결을 생성해야 합니다.

(1) 무료 공개 MQTT 브로커 정보 이해하기

: MQTTX에서는 별도의 서버를 구축하지 않아도, 공개 브로커를 통해 바로 테스트를 진행할 수 있습니다. 대표적으로 EMQX에서 제공하는 공개 브로커가 있으며, MQTTX에서 New Connection을 생성하면 기본값으로 입력되어 있는 경우가 많습니다. 이 정보만으로도 간단한 MQTT 테스트 환경을 바로 구성할 수 있습니다.

  • 브로커 주소: broker.emqx.io

  • TCP 포트: 1883

  • WebSocket 포트: 8083

(2) 연결 만들기

  1. 좌측의 plus 버튼을 클릭한다.

  2. Name을 작성한다.

  3. 우측 상단의 Connect 버튼을 클릭한다.

연결이 완료되면, 해당 세션을 통해 메시지를 주고받을 준비가 끝납니다.

2) 와일드카드 토픽 구독

(1) 수신

이제 특정 토픽을 구독하여 메시지를 받아볼 수 있습니다. 이번 실습에서는 와일드카드를 활용하여 여러 센서 데이터를 한 번에 수신해보겠습니다.

예를 들어 다음과 같은 토픽을 구독합니다.

sensor/+/temperature

이 토픽은 sensor/1/temperature, sensor/2/temperature여러 센서에서 전송되는 온도 데이터를 모두 수신할 수 있도록 해줍니다.

(2) 구독 방법

구독 방법은 다음과 같습니다.

  • New Subscription 버튼 클릭

  • Topic 입력: sensor/+/temperature

  • Confirm 버튼 클릭

아래와 같은 결과를 볼 수 있습니다.

3) MQTT 메세지 게시

이제 실제로 메시지를 발행하여 데이터 흐름을 확인해보겠습니다.

(1) 센서 역할의 클라이언트 생성

: Sensor1, Sensor2와 같은 이름으로 각각 연결을 생성합니다. 이 연결들은 실제 IoT 센서 역할을 한다고 생각하면 이해하기 쉽습니다.

(2) 센서1 메시지 전송

: Sensor1 연결을 선택한 뒤, 아래와 같이 메시지를 입력합니다.

  • Topic: sensor/1/temperature

  • Payload (예시 JSON):{ "temperature": 22.5}

입력 후, 우측 하단의 Publish 버튼을 클릭하면 메시지가 전송됩니다.

(3) 메시지 흐름 확인

: 앞서 구독해둔 Simple Demo 연결에서는 sensor/+/temperature를 통해 Sensor1의 메시지를 바로 확인할 수 있습니다.

(4) 센서2 메시지 전송 및 확인

: 같은 방식으로 Sensor2에서도 메시지를 전송하면, Simple Demo에서는 두 센서의 데이터가 모두 표시되는 것을 확인할 수 있습니다. 이 과정을 통해 MQTT의 게시-구독 구조가 어떻게 동작하는지 직관적으로 이해할 수 있습니다.

전송하기

확인하기

Simple Demo에서 두 센서에서 보낸 메세지 표시

4) Retained Message (보관 메시지)

MQTT에서는 마지막 메시지를 저장해두는 Retained 기능을 제공합니다.

(1) Subscription 생성

: Simple Demo에서 retained_message라는 토픽을 구독합니다.

(2) Retained 메시지 전송

: 해당 토픽으로 메시지를 전송할 때, Retained 옵션을 활성화하여 발행합니다.

(3) 동작 확인

: 이후 동일한 토픽을 새로 구독하는 클라이언트는 이전에 전송된 마지막 메시지를 즉시 받아볼 수 있습니다. 즉, Retained Message는 “현재 상태를 저장해두고 전달하는 기능”이라고 이해하면 쉽습니다.

| 결론

MQTT는 단순한 메시징 프로토콜을 넘어, IoT와 실시간 시스템의 핵심 통신 구조를 담당하는 중요한 기술입니다.

특히 게시-구독 모델을 기반으로 한 느슨한 결합 구조는 시스템 확장성과 유지보수성을 크게 향상시키며, 다양한 환경에서도 안정적인 데이터 흐름을 유지할 수 있도록 도와줍니다.

그리고 MQTTX는 이러한 구조를 가장 직관적으로 이해할 수 있게 해주는 도구입니다. 직접 연결하고, 메시지를 보내고, 구독하며 흐름을 눈으로 확인하는 경험을 통해 이론이 아닌 “감각적인 이해”를 얻을 수 있습니다.

MQTT를 처음 접하셨다면, 단순히 개념만 읽는 것보다 MQTTX로 직접 테스트해보는 것을 추천드립니다. 짧은 실습만으로도 메시지 흐름과 구조에 대한 이해도가 크게 올라가는 것을 느끼실 수 있을 것입니다.