MQTT · 2026-03-06

MQTT Retained 메시지로 초기 상태 동기화

브로커에 저장된 마지막 메시지인 retained 메시지를 이용해 클라이언트 간 초기 상태를 동기화하는 방법과 설계 고려사항에 대한 설명

작성일 : 2026-03-06 ㆍ 작성자 : 관리자
post
목차

개요

IoT나 분산 시스템에서 장치가 연결될 때 최신 상태를 빠르게 알 수 있는 방법이 필요하다. MQTT의 retained 메시지는 브로커가 특정 토픽의 최신 메시지를 저장하도록 하여, 새로 구독한 클라이언트가 연결 직후 즉시 최신 상태를 받을 수 있게 한다. 이 글은 retained 메시지의 동작 원리와 초기 상태 동기화 구현 방법, 실제 사용 사례와 주의점을 설명한다.

retained 메시지의 동작 원리

기본 개념

retained 메시지는 브로커가 마지막으로 받은 메시지를 해당 토픽에 대해 저장한다. 이후 새 구독자가 해당 토픽을 구독하면 저장된 메시지가 즉시 전달된다. 따라서 구독자 수와 관계없이 최신 상태가 보장되는 장점이 있다.

저장 범위와 제한

  • 브로커는 토픽별로 하나의 마지막 retained 메시지만 저장한다.
  • 페이로드가 빈 문자열인 retained 메시지를 퍼블리시하면 기존 저장값이 삭제된다.
  • QoS는 retained 메시지 전송 시 영향을 주며, 저장된 메시지는 해당 메시지의 QoS 정보를 유지한다.

초기 상태 동기화 설계 패턴

상태 토픽 구조

토픽 네이밍은 명확해야 한다. 일반적으로 디바이스별 상태는 다음과 같은 구조를 사용한다.

home/device/{deviceId}/state

여기서 retained 메시지는 각 deviceId에 대한 최신 상태를 담는다. 상태 형식은 JSON으로 통일하면 파싱과 확장이 수월하다.

상태 메시지 구성

  • 필수 필드: 상태 값(state), 타임스탬프(timestamp), 버전(version)
  • 선택 필드: 상태 원인(reason), 배터리 수준(battery)
{"state":"ON","timestamp":1670000000,"version":1}

구현 절차

1) 상태 퍼블리시 시 retained 플래그 사용

상태를 업데이트할 때 퍼블리시 옵션에 retained=true를 설정하면 브로커가 메시지를 저장한다. 아래는 mosquitto_pub와 Python(paho-mqtt) 예시다.

mosquitto_pub -t "home/device/device01/state" -m '{"state":"ON","timestamp":1670000000,"version":1}' -r

# Python (paho-mqtt)
from paho.mqtt import client as mqtt
client = mqtt.Client()
client.connect("broker.example.com", 1883)
client.publish("home/device/device01/state", payload='{"state":"ON","timestamp":1670000000,"version":1}', qos=1, retain=True)

2) 구독 시 초기 상태 수신 처리

구독자는 브로커로부터 즉시 retained 메시지를 수신한다. 이 메시지를 초기 상태로 처리하되, 실시간 업데이트와 구분하는 로직이 필요하다. 예를 들어 메시지에 포함된 timestamp나 version를 확인해 오래된 상태를 무시할 수 있다.

3) 초기화와 재동기화 전략

  • 초기 연결 시 retained 메시지로 기본 상태 설정
  • 정기적 재동기화가 필요하면 상태 버전이나 ECG(heartbeats)를 이용하여 동기화 트리거 설정
  • 상태의 무결성이 중요하면 상태 확인을 위한 추가 RPC 또는 요청/응답 토픽을 마련

실제 사용 사례

  • 홈 자동화: 조명, 센서의 현재 상태를 구독자가 즉시 확인
  • 대시보드 초기 로드: UI가 처음 열릴 때 최신 상태를 보여주기 위한 수단
  • 장애 복구: 재시작 후 빠르게 시스템 상태를 복구

주의사항과 한계

보안과 권한

retained 메시지에 민감한 정보를 넣으면 안 된다. 브로커의 인증·인가 설정과 토픽 권한을 엄격히 관리할 필요가 있다.

오래된 상태 문제

장기간 업데이트가 없으면 보관된 상태가 실제와 다를 수 있다. 이를 보완하기 위해 timestamp 필드를 포함하고, 적정 기간 이상인 메시지는 만료 처리하는 로직이 필요하다.

대량 토픽 관리

토픽이 많아지면 브로커 저장소 부담과 초기 동기화 시 네트워크 부하가 증가한다. 필요하지 않은 토픽은 retained 사용을 피하거나 TTL 같은 정책을 적용한다.

정리

MQTT retained 메시지는 초기 상태 동기화에 매우 유용한 기능이다. 간단한 퍼블리시 옵션으로 구현이 가능하며, 토픽 설계와 메시지 포맷, 보안 정책을 함께 고려하면 안정적인 초기 동기화 체계를 만들 수 있다. 실무에서는 timestamp와 version 검증, 빈 페이로드를 통한 삭제 전략, 그리고 보안 설정이 핵심 설계 요소로 작용한다.

retained 메시지 초기화 방법 mqtt 초기 상태 동기화 retained 사용 사례 mqtt MQTT MQTT retained IoT 동기화 초기화 메시지 토픽 설계