MQTT · 2025-12-15

MQTT QoS 이해: 0, 1, 2 차이와 적용 전략

MQTT QoS 0, 1, 2의 동작 원리와 mqtt qos 차이, 실무 적용 전략, 오류 처리와 설정 예시를 포함한 명확한 설명

작성일 : 2025-12-15 ㆍ 작성자 : 관리자
post
목차

개요

MQTT는 가벼운 메시지 프로토콜로, 네트워크 환경과 요구 신뢰도에 따라 QoS(Quality of Service)를 선택한다. QoS는 전송 보증 수준을 뜻한다. 이 글은 mqtt qos 차이와 mqtt qos 0 1 2 설명, 그리고 mqtt qos 설정 권장 관점에서 접근한다.

QoS 개념 정리

QoS는 메시지가 브로커와 클라이언트 사이에서 얼마나 신뢰성 있게 전달되는지를 결정한다. 세 가지 등급이 있다. 각 등급은 전송 횟수와 중복 가능성, 확인 메커니즘에서 차이를 보인다.

QoS 0: At most once

QoS 0은 가장 간단한 모드다. 메시지는 한 번만 전송된다. 전송 실패 시 재시도가 없다. 따라서 네트워크 손실 시 메시지 소실이 발생한다. 오버헤드가 작아 지연과 리소스 부담이 적다. 센서의 주기적 텔레메트리처럼 일부 손실이 허용되는 경우 적합하다.

QoS 1: At least once

QoS 1은 적어도 한 번 전달을 보장한다. 송신자는 PUBACK을 받을 때까지 재전송을 시도한다. 네트워크 불안정 시 중복 수신이 발생할 수 있다. 따라서 수신 측에서 idempotent 처리나 중복 제거 로직이 필요하다. 상태 변경 알림이나 이벤트 전송에 많이 사용된다.

QoS 2: Exactly once

QoS 2는 정확히 한 번 전달을 보장한다. 4단계의 핸드셰이크(PUBLISH, PUBREC, PUBREL, PUBCOMP)를 거친다. 중복 제거가 프로토콜 레벨에서 처리되므로 수신 측 수정이 덜 필요하다. 대신 추가 레이턴시와 처리 오버헤드가 발생한다. 트랜잭션성 데이터나 결제 같은 중복이 허용되지 않는 경우 적합하다.

동작 흐름 요약

  • QoS 0: 송신 → 전송만 수행. 확인 없음.
  • QoS 1: 송신 → PUBACK 수신까지 재전송 가능.
  • QoS 2: 송신 → PUBREC → PUBREL → PUBCOMP로 정확히 한 번 보장.

적용 전략

적절한 QoS 선택은 신뢰성 요구, 네트워크 조건, 처리 비용을 고려해서 이루어진다. 아래 기준을 참고한다.

경량성 우선

전력과 대역폭이 제한된 디바이스는 QoS 0 권장이 타당하다. 주기적 센서 측정처럼 일부 손실이 허용되는 데이터에 적용한다.

신뢰성 필요, 중복 허용

중요하지만 중복 처리가 가능한 메시지에는 QoS 1을 사용한다. 예를 들어 상태 보고, 로그 수집, 이벤트 알림이 해당된다. 수신 측에서 중복 처리 로직을 마련해야 한다.

중복 불가 데이터

중복이 치명적인 경우에는 QoS 2를 선택한다. 단, 처리 비용과 지연을 감수해야 한다. 금융, 청구, 트랜잭션 관련 메시지에 적합하다.

실무 적용 시 고려사항

  • 브로커와 클라이언트의 성능: QoS 2는 더 많은 상태를 유지하므로 리소스가 더 필요하다.
  • 네트워크 특성: 낮은 신뢰도의 셀룰러 네트워크에서는 QoS 1 이상 고려.
  • 중복 처리 설계: QoS 1 사용 시 수신 측에서 고유 ID로 중복 필터링 선행.
  • 연결 유지 전략: 세션 재접속 시 미전송 메시지 보관(clean session 설정 검토).

설정 예시

간단한 클라이언트 예시를 통해 mqtt qos 설정 권장 방식을 보여준다. 먼저 Python paho-mqtt의 publish 예시.

import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("broker.example.com", 1883, 60)
# QoS 0
client.publish("sensors/temp", "22.5", qos=0)
# QoS 1
client.publish("alerts/door", "open", qos=1)
# QoS 2
client.publish("payments/txn", "{\"id\":123}\", qos=2)
client.disconnect()

다음은 Node.js용 mqtt.js 예시이다.

const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://broker.example.com')
client.on('connect', () => {
  client.publish('sensors/temp', '22.5', { qos: 0 })
  client.publish('alerts/door', 'open', { qos: 1 })
  client.publish('payments/txn', '{"id":123}', { qos: 2 })
  client.end()
})

운영 시 권장 설정과 점검 항목

  • 디바이스별 기본 QoS 정책 수립: 센서(0), 이벤트(1), 트랜잭션(2) 같은 표준화.
  • 로그와 모니터링: 재전송률, 중복 수신률, 지연 시간 추적.
  • 에러 핸들링: PUBACK/PUBREC 미수신 시 재시도 정책과 백오프 전략 적용.
  • 보안과 인증: TLS와 적절한 인증으로 신뢰성 확보.

결론

mqtt qos 차이 이해는 안정적 메시징 설계의 핵심이다. mqtt qos 0 1 2 설명 내용을 바탕으로 요구 신뢰도와 리소스 제약을 비교한다. mqtt qos 설정 권장은 시스템 특성에 맞춘 표준화와 모니터링을 포함한다. 적절한 선택과 설계로 메시지 신뢰성과 비용 사이에서 균형을 맞출 수 있다.

mqtt qos 차이 mqtt qos 0 1 2 설명 mqtt qos 설정 권장 mqtt qos paho-mqtt mqtt.js 사물인터넷