Go 언어를 이용한 MQTT 5.0 클라이언트 구현: 메시지 발행 및 세션 관리 (Part II)

Implementing MQTT 5 in Go (Part II): QoS and Session Management

작성자
HackerNews
발행일
2025년 12월 22일

핵심 요약

  • 1 MQTT 5.0의 PUBLISH 패킷 구조와 QoS 레벨(0, 1, 2)에 따른 메시지 전송 및 핸드셰이크 메커니즘을 상세히 설명합니다.
  • 2 효율적인 세션 관리를 위해 이중 연결 리스트(Double Linked List)와 맵(Map)을 결합하여 메시지 순서 보장과 빠른 조회를 동시에 실현했습니다.
  • 3 Go의 context를 활용한 동기식 Publish API 설계와 testcontainers를 이용한 통합 테스트 방법론을 제시합니다.

도입

본 아티클은 Go 언어로 MQTT 5.0 클라이언트를 구현하는 시리즈의 두 번째 파트로, 메시지 발행(Publishing)과 세션 관리의 핵심 원리를 다룹니다. 이전 단계에서 구축한 연결 기반 위에 실제 데이터를 주고받는 메커니즘을 설계하며, 특히 네트워크 장애 상황에서도 메시지 전달을 보장하기 위한 QoS(Quality of Service) 레벨별 구현 전략과 데이터 구조 선택 과정을 심도 있게 설명합니다.

본론에서는 다음과 같은 기술적 세부 사항을 다룹니다.

1. PUBLISH 패킷 구조 및 인코딩

  • 고정 헤더(Fixed Header), 가변 헤더(Variable Header), 페이로드(Payload)로 구성된 PUBLISH 패킷의 비트 단위 구조를 분석합니다.

  • DUP, QoS, Retain 플래그의 역할과 토픽 이름, 패킷 식별자(Packet ID) 및 MQTT 5의 새로운 기능인 속성(Properties) 필드 인코딩 방법을 설명합니다.

2. QoS 레벨별 메시지 흐름

  • QoS 0 (At most once): 확인 응답 없이 전송하는 ‘Fire and Forget’ 방식입니다.

  • QoS 1 (At least once): PUBACK을 통한 수신 확인을 보장하며, 유실 시 재전송을 수행합니다.

  • QoS 2 (Exactly once): 4단계 핸드셰이크(PUBLISH-PUBREC-PUBREL-PUBCOMP)를 통해 메시지 중복 없는 정확한 전달을 보장합니다.

3. 효율적인 세션 상태 관리

  • 데이터 구조 선택: 메시지 전송 순서를 유지하기 위한 ‘이중 연결 리스트’와 패킷 ID 기반의 빠른 검색을 위한 ‘맵’을 결합한 하이브리드 구조를 채택했습니다.

  • 세션 복구: 클라이언트 재연결 시 Clean Start 플래그에 따라 기존 세션을 복구하고 미완료된 메시지를 재전송하는 로직을 구현했습니다.

4. API 디자인 및 테스트

  • Go의 context를 활용하여 타임아웃과 취소를 지원하는 동기식 Publish 메서드를 설계했습니다.

  • testcontainers 라이브러리와 EMQX 브로커를 활용하여 실제 환경과 유사한 통합 테스트를 수행합니다.

결론

결론적으로, MQTT 클라이언트 구현에서 가장 까다로운 부분은 네트워크 불안정성 속에서도 QoS 보장을 위한 상태를 정확히 관리하는 것입니다. 본문에서 제안한 연결 리스트와 맵의 조합은 성능과 안정성을 모두 잡은 설계이며, 이는 고성능 IoT 메시징 라이브러리 구축의 기초가 됩니다. 다음 파트에서는 구독 관리와 메시지 수신 로직을 다룰 예정입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!