MQTT · 2026-04-15

MQTT 오버헤드 최적화: 헤더·재전송 줄이기

MQTT 통신에서 헤더 크기와 불필요한 재전송이 초래하는 오버헤드를 분석하고, 측정 기법과 프로토콜 설정, 페이로드·QoS 최적화로 오버헤드 감소 방법

작성일 : 2026-04-15 ㆍ 작성자 : 관리자
post
목차

서론: 왜 MQTT 오버헤드가 문제인가

IoT 환경에서 수많은 디바이스가 MQTT로 통신한다. 메시지 자체는 작아도 반복 전송, 큰 토픽 이름, 빈번한 연결·끊김 등으로 전체 대역폭과 지연이 크게 늘어난다. 따라서 헤더와 재전송을 줄이는 작업은 네트워크 비용과 전력 소비를 동시에 낮춘다. 이 글은 처음 접하는 독자도 이해하기 쉽게 핵심 원리와 실무 적용 방법을 설명한다.

기본 개념: MQTT 패킷과 오버헤드 요소

MQTT 패킷 구조 개요

MQTT 패킷은 고정 헤더, 가변 헤더, 페이로드로 구성된다. 고정 헤더에는 메시지 유형과 제어 플래그가 들어가고, 가변 헤더는 토픽 이름, 패킷 식별자 등이 포함된다. 이 부분들이 오버헤드의 주요 원인이다.

오버헤드를 키우는 요인들

  • 긴 토픽 및 중복 토픽 사용
  • 높은 QoS로 인한 ACK/재전송 트래픽
  • 짧은 keepalive 설정으로 인한 재연결 빈도 증가
  • 비효율적인 페이로드 포맷(예: 과도한 JSON 필드)
  • 빈번한 소형 메시지 전송으로 인한 헤더 비율 증가

측정: 현재 오버헤드 분석 방법

최적화 전에는 정확한 측정이 필수다. 다음 지표를 확인한다.

  • 초당 메시지 수(MPS)와 초당 바이트 수
  • 토픽별 메시지 분포와 평균 페이로드 크기
  • 재전송 비율과 ACK 지연 시간
  • 연결 유지 시간과 재접속 빈도

패킷 캡처 도구(예: tcpdump, Wireshark)나 브로커의 통계 API로 위 지표를 수집한다. 수치 기반 목표를 세우면 최적화 효과를 정확히 판단할 수 있다.

헤더 크기 줄이기 전략

토픽 네이밍 간소화

토픽 이름이 길수록 가변 헤더가 커진다. 불필요한 접두사 제거, 공통 경로를 활용한 토픽 인덱싱으로 크기를 절감할 수 있다. 예를 들어 장치 ID를 토픽 끝에 모으거나 숫자 인덱스로 대체한다.

페이로드 축소

JSON 대신 경량 포맷(예: CBOR, MessagePack)을 고려한다. 또한 전송 필드를 최소화하고, 중복 데이터를 로컬에서 병합 후 전송한다. 페이로드 압축을 적용하면 전체 트래픽을 크게 낮출 수 있다.

재전송 최적화: QoS와 ACK 관리

QoS 조정 기준

MQTT QoS 0,1,2는 신뢰도와 오버헤드가 다르다. 모든 메시지에 높은 QoS를 쓰면 ACK와 재전송이 늘어난다. 신뢰도가 덜 중요한 센서 데이터는 QoS 0으로 처리하고, 알람 등 중요 메시지만 QoS 1 또는 2를 사용한다.

재전송 정책 튜닝

클라이언트 라이브러리의 재전송 간격과 제한 횟수를 적절히 설정한다. 너무 짧은 재전송 간격은 네트워크 혼잡을 악화시킨다. 지수 백오프를 적용하면 재전송 충돌을 줄일 수 있다.

연결 유지와 세션 관리

keepalive를 너무 짧게 설정하면 빈번한 PING과 재연결이 발생한다. 반대로 너무 길면 장애 감지가 늦어진다. 디바이스 사용 패턴과 네트워크 특성을 고려해 적정값을 설정한다. Clean session과 지속 세션의 사용은 상태 유지 비용과 메시지 큐잉에 영향을 준다.

배치와 전송 빈도 조절

작은 메시지를 자주 보내는 대신 배치로 묶어 전송하면 헤더 비율을 낮출 수 있다. 일정 주기마다 데이터를 모아 하나의 메시지로 전송하는 방식이 대표적이다. 이때 지연 요구사항을 고려해 배치 크기와 주기를 조절한다.

브로커 및 네트워크 레벨 최적화

  • 브로커에서 토픽 필터링과 라우팅을 활용해 중복 전달을 줄인다.
  • TLS 설정은 필수 보안 요소지만 세션 재사용과 세션 캐시를 활용해 연결 비용을 줄인다.
  • 네트워크 계층에서 MTU와 패킷 분할을 최적화하면 전송 효율이 개선된다.

실전 예제: 간단한 클라이언트 설정

아래 예제는 MQTT 클라이언트의 재연결, keepalive, QoS 설정을 보여준다. 실제 환경에서는 페이로드 압축과 배치 로직을 추가한다.

var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://broker.example.com', {
  keepalive: 60,            // 적정 keepalive
  reconnectPeriod: 2000,    // 재접속 지연
  clean: false              // 세션 유지로 메시지 큐 활용
});

// 배치 전송 예시
function sendBatch(topic, messages) {
  var payload = JSON.stringify(messages); // 경량 포맷으로 대체 권장
  client.publish(topic, payload, {qos: 0, retain: false});
}

검증과 운영 체크리스트

  • 패킷 캡처로 헤더 대비 페이로드 비율 확인
  • 토픽 길이와 중복 토픽 제거 여부 점검
  • QoS별 재전송 비율 모니터링
  • keepalive, reconnect 정책의 네트워크 영향 평가
  • 페이로드 포맷 변경 전후 성능 비교

결론

MQTT 오버헤드 줄이기는 토픽 설계, 페이로드 효율화, QoS·재전송 정책 조정, 연결 관리의 조합으로 이뤄진다. 측정에서 시작해 작은 변화부터 적용하고, 반복 측정을 통해 효과를 검증하면 네트워크 비용과 지연을 의미 있게 낮출 수 있다. 제안한 방법을 단계적으로 적용하면 실무 환경에서도 안정적 성능 개선을 기대할 수 있다.

mqtt 오버헤드 줄이기 mqtt 패킷 최적화 방법 재전송 최적화 mqtt MQTT 오버헤드 QoS 최적화 페이로드 압축 브로커 튜닝