

MQTT (Message Queuing Telemetry Transport) 프로토콜 개요
MQTT는 경량의 발행/구독(Publish/Subscribe) 모델을 기반으로 한 메시지 프로토콜로,
IoT(Internet of Things) 환경에서 주로 사용됩니다. 저전력, 저대역폭 환경에서도 안정적인 메시지 전송을 보장하도록 설계되었습니다.
1. MQTT 특징
① 경량 프로토콜
- 메시지 크기가 작고, 패킷 오버헤드가 적음
- TCP/IP 위에서 동작하며, 기본적으로 **QoS (Quality of Service)**를 제공
② 발행/구독 (Publish/Subscribe) 모델
- 클라이언트는 메시지를 **발행(Publish)**하거나 **구독(Subscribe)**하는 방식으로 통신
- 중간에 **브로커(Broker)**가 존재하여 메시지를 관리
③ 비동기 통신
- 클라이언트는 브로커를 통해 메시지를 송수신하므로 직접적인 연결이 필요 없음
- 클라이언트 간의 독립성을 유지하며, 실시간성이 중요한 서비스에 적합
④ 다양한 QoS (Quality of Service) 수준 지원
- QoS 0 (At most once): 최대 1번 전송 (손실 가능)
- QoS 1 (At least once): 최소 1번 전송 (중복 가능)
- QoS 2 (Exactly once): 정확히 1번 전송 (가장 안전하지만 느림)
⑤ 지속적인 연결 유지
- 연결이 끊어져도 재접속 시 마지막 메시지를 받을 수 있도록 "Last Will" 기능 제공
- 저전력 장치에서 활용할 수 있도록 Keep Alive 기능 제공
⑥ 트래픽 효율성이 높음
- 헤더 크기가 2바이트로 작음
- 메시지를 주고받을 때 네트워크 대역폭을 최소화
2. MQTT 아키텍처


① 클라이언트 (Client)
- 메시지를 발행(Publish)하거나 구독(Subscribe)하는 역할을 수행
- 예) IoT 장치, 모바일 앱, 서버 등
② 브로커 (Broker)
- 메시지를 중개하는 서버 역할
- 클라이언트 간 직접 통신하지 않고 브로커를 통해 메시지 전달
- 대표적인 MQTT 브로커:
- Eclipse Mosquitto
- HiveMQ
- EMQX
3. MQTT 메시지 구조

MQTT 메시지는 고정 헤더, 가변 헤더, 페이로드로 구성됨.
① 고정 헤더 (Fixed Header)
- 패킷 타입 (CONNECT, PUBLISH, SUBSCRIBE 등)
- 플래그 및 메시지 길이 정보
② 가변 헤더 (Variable Header)
- 특정 패킷 타입에 따라 포함되는 추가 정보
- 예: PUBLISH 메시지의 경우 토픽(Topic) 정보 포함
③ 페이로드 (Payload)
- 전송할 실제 데이터
- JSON, 문자열, 바이너리 데이터 등 사용 가능
4. MQTT 주요 메시지 타입

메시지 타입 | 설명 |
CONNECT | 클라이언트가 브로커에 연결할 때 사용 |
CONNACK | 브로커가 연결 요청을 승인 또는 거부할 때 사용 |
PUBLISH | 클라이언트가 메시지를 특정 토픽에 발행할 때 사용 |
PUBACK | PUBLISH 메시지에 대한 수신 확인 (QoS 1 이상) |
SUBSCRIBE | 클라이언트가 특정 토픽을 구독할 때 사용 |
SUBACK | 구독 요청이 성공했는지 응답 |
UNSUBSCRIBE | 클라이언트가 특정 토픽 구독을 취소할 때 사용 |
UNSUBACK | 구독 취소 요청에 대한 응답 |
DISCONNECT | 클라이언트가 연결을 종료할 때 사용 |
5. MQTT 활용 사례
- IoT 장치 제어 (스마트 홈, 센서 네트워크)
- 실시간 메시징 (카카오톡, 페이스북 메신저 등)
- 원격 모니터링 (산업 자동화, 원격 장비 관리)
- 자동차 및 스마트 교통 시스템
- 헬스케어 시스템 (웨어러블 기기 데이터 전송)
6. MQTT vs HTTP



비교 항목 | MQTT | HTTP |
프로토콜 타입 | TCP/IP 기반 | RESTful (HTTP 1.1, 2.0) |
메시지 크기 | 매우 작음 (2바이트 헤더) | 상대적으로 큼 |
통신 방식 | 발행/구독 (비동기) | 요청/응답 (동기) |
연결 유지 | 지속적 (Keep Alive 지원) | 필요 시 연결 |
전송 속도 | 빠름 | 느림 |
사용 사례 | IoT, 실시간 메시징 | 웹 애플리케이션, API |
7. MQTT 예제 코드

① Mosquitto MQTT 브로커 실행
mosquitto -v
- 로컬 브로커 실행 후 포트 1883에서 MQTT 메시지 처리
② Python MQTT 클라이언트 예제
클라이언트 설치
pip install paho-mqtt
Publisher (메시지 발행)
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("localhost", 1883, 60)
client.publish("test/topic", "Hello MQTT!")
client.disconnect()
Subscriber (메시지 구독)
import paho.mqtt.client as mqtt
def on_message(client, userdata, message):
print(f"Received message: {message.payload.decode()}")
client = mqtt.Client()
client.on_message = on_message
client.connect("localhost", 1883, 60)
client.subscribe("test/topic")
client.loop_forever()
8. 결론
MQTT는 가벼운 네트워크 프로토콜로, IoT, 실시간 메시징, 원격 제어 등에 최적화되어 있습니다.
HTTP 대비 네트워크 부하가 적고, 비동기 방식을 지원하여 효율적인 메시지 교환이 가능합니다.
💡 실제 적용하려면?
- Mosquitto, HiveMQ 등의 브로커를 활용
- QoS 설정 및 Last Will 기능 고려
- 보안 강화를 위해 TLS/SSL 적용
9. topic

9. QoS (Quality of Service)

'학습 기록 (Learning Logs) > Today I Learned' 카테고리의 다른 글
채팅 서버 (0) | 2025.04.01 |
---|---|
gRPC (0) | 2025.04.01 |
7장 스케쥴링 (0) | 2025.03.31 |
📘 6장. 제한적 직접 실행 원리 (0) | 2025.03.31 |
개인 채팅, 단체 채팅 : 테이블 설계와 Kafka 토픽 설계 (0) | 2025.03.27 |