본론에서는 다음과 같은 기술적 세부 사항을 다룹니다.
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 브로커를 활용하여 실제 환경과 유사한 통합 테스트를 수행합니다.