센서 네트워크부터 게이트웨이까지 — MQTT와 CoAP로 짜는 IoT 아키텍처
센서 네트워크·IoT 게이트웨이·MQTT/CoAP 메시징을 계층별로 설계하는 실무 아키텍처와 배포 절차, 코드 예시를 정리한다.
2026-08-12 · 최초 발행 2025-12-11
MQTT를 쓸지 CoAP를 쓸지는 프로토콜 스펙 비교표를 먼저 보고 정할 문제가 아니다. 센서 계층의 전력 예산과 링크 품질이 먼저 정해지고, 그다음에 어떤 프로토콜이 그 제약에 맞는지가 결정된다. 사물인터넷 시스템의 핵심은 결국 현장에서 확보한 데이터를 신뢰성 있게 수집·전송·처리하는 구조 설계에 있다.
IoT 아키텍처는 물리 센서·액추에이터, 통신(근거리/광역), 게이트웨이, 메시지 브로커, 백엔드 처리·저장, 운영·보안 체계를 아우르는 계층형 구성이다. 입력에서 출력까지 이어지는 데이터 경로 최적화가 설계 목표다. 센서 네트워크는 BLE, Zigbee, Sub-GHz, RS-485/Modbus 같은 유·무선 센서로 구성된 현장 데이터 수집 계층으로, 에너지 제약과 링크 품질 변동성, 메시 토폴로지 특성을 반영해야 한다. MQTT/CoAP는 경량 메시징 표준인데, MQTT는 브로커 기반 Pub/Sub이고 CoAP는 UDP 기반 RESTful 모델에 관찰(Observe) 기능을 더한 형태다. 저전력·저대역 환경에서는 신뢰성·지연·오버헤드 사이의 절충이 핵심이다. IoT 게이트웨이는 현장 프로토콜을 집선·변환하고 보안 종단을 처리하는 노드로, 현장망과 IP망을 잇고 오프라인 버퍼링과 OTA·디바이스 수명주기 관제를 실행한다.
각 계층을 하나씩 보면
센서 네트워크 계층에서는 링크와 토폴로지를 먼저 정한다. 실내는 Zigbee/BLE Mesh, 장거리 저속은 Sub-GHz/LoRa 등이 적합하다. 에너지와 신뢰성은 듀티사이클·샘플링 주기·로컬 필터링으로 전력을 최적화하고, 패킷 손실에 대비해 재전송·시퀀스·타임스탬프를 포함시켜 설계한다.
게이트웨이 계층은 Modbus RTU/TCP, BLE GATT, Zigbee ZCL을 MQTT/CoAP로 변환하며 토픽·리소스 네임스페이스를 표준화한다. 보안·버퍼링 측면에서는 TLS/DTLS 종단, 오프라인 스토어-앤드-포워드, 지수 백오프 재접속을 구현하고 로컬 정책과 펌웨어를 원자적으로 업데이트한다.
메시징/프로토콜 계층에서 MQTT는 브로커 중심 라우팅에 QoS 0/1/2, 유지 메시지(retained), LWT(Last Will)를 지원한다. 연결 상태 관리와 토픽 기반 멀티캐스트가 효율적이다. CoAP는 UDP/DTLS 위에서 Confirmable(ACK)·Non-confirmable, Observe, Block-wise 전송을 지원하며 프록시·캐시로 대역을 최적화한다. 엣지에서 전처리·버퍼링을 거쳐 QoS1이나 CON을 적용하면 평균 지연이 2040% 감소하고 재전송률이 30% 이상 줄어들 수 있으며(환경 의존), 이벤트 기반 발행·Observe·캐시를 쓰면 셀룰러 전송량을 2560% 절감할 수 있다.
백엔드·디지털 트윈 계층은 브로커에서 스트림(예: Kafka)을 거쳐 타임시리즈 DB(예: InfluxDB/Timescale)로 이어지고 알고리즘·디지털 트윈을 업데이트한다. 메트릭·로그·트레이스를 수집해 SLO 기반 경보를 걸고, 디바이스 인벤토리·상태 모델의 일관성을 유지한다.
보안·수명주기 관리는 PKI 기반 X.509로 신원을 확립하는데, 제조 시 프로비저닝과 증명서 롤오버·폐기가 필요하다. 리소스가 제약된 단말은 PSK/EDH를 선택할 수 있다. 운영 통제 측면에서는 주제별 ACL, 멀티테넌시 격리, 서명된 OTA, 안전한 부팅·측정(secure boot/measure)을 적용한다.
데이터 경로와 오류 처리
MQTT와 CoAP, 무엇이 다른가
| 항목 | MQTT | CoAP |
|---|---|---|
| 성능 | 지속 연결 기반 낮은 지연, 헤더 오버헤드 낮음 | UDP 기반 매우 경량, 멀티캐스트·캐시로 대역 효율 |
| 확장성 | 브로커 클러스터링·브리지로 수평 확장 용이 | 프록시·캐시·게이트웨이 분산 구성 유연 |
| 일관성 | QoS 1/2로 적어도 한번/정확히 한번 의미 제공(응용 설계 필요) | CON/ACK로 전송 보장, Observe로 상태 동기 |
| 안정성 | 재접속·세션 재개·오프라인 버퍼링 성숙 | 네트워크 손실 환경 강인, 단 재정렬·중복 처리 필요 |
| 운영 편의 | 토픽 기반 라우팅·ACL·모니터링 도구 풍부 | RESTful 리소스 맵핑 직관, 프록시 운영 단순 |
실제로 배포할 때 순서
디바이스 온보딩은 제조 시 고유 ID·키를 삽입하고 루트 CA 체인을 배포하는 데서 시작한다. 부팅 시에는 NTP/RTClock으로 시간 동기화를 먼저 맞춘다. 게이트웨이는 화이트리스트나 CSR 승인으로 1차 신뢰를 확인한 뒤 인증서를 발급·바인딩한다.
데이터 수집·전송 단계에서는 센서의 샘플링 주기·필터·압축을 설정하고 타임스탬프·시퀀스를 포함시킨다. 게이트웨이는 현장 프로토콜을 파싱해 스키마로 매핑하고 MQTT 토픽이나 CoAP 리소스로 표준화한 뒤 TLS/DTLS로 전송한다.
백엔드 처리·저장 단계에서는 브로커에서 스트림 처리(스키마 검증·중복 제거·이상 탐지)를 거쳐 타임시리즈에 저장하고 지표·알람을 산출한다. 명령 경로는 반대로 디지털 트윈 상태 변경이 브로커 발행 → 게이트웨이 → 액추에이터 반영으로 흐른다.
오류·예외 처리도 미리 설계해야 한다. 네트워크가 불안정하면 스토어-앤드-포워드, 지수 백오프를 쓰고 최대 보관 용량을 초과하면 샘플링율을 축소한다. 보안 실패 시에는 인증서 만료·CRL을 확인하고, 실패 횟수가 임계를 넘으면 격리·조사에 들어간다.
어디에 쓰이는가
스마트 제조(공장/설비)에서는 Modbus/OPC-UA로 수집한 데이터를 게이트웨이가 MQTT QoS1로 전송해 공정 이상을 실시간 탐지한다. CoAP Observe로 센서 상태를 스트리밍하기도 한다. 빌딩 에너지 관리에서는 Zigbee 기반 계량·조명 제어 데이터를 게이트웨이의 규칙 엔진으로 로컬 최적화한 뒤 중앙 분석으로 보내고, 야간에는 오프라인 버퍼링으로 데이터 손실을 최소화한다. 콜드체인 물류에서는 배터리 제약이 큰 단말에 CoAP CON 패턴과 Block-wise 전송을 적용하고, 셀룰러 비용을 줄이기 위해 이벤트 기반 발행과 엣지 집계를 쓴다.
코드로 보면
전제조건은 Python 3.10 이상, 최신 OS 패치(최신 정보 확인 필요), 네트워크 접근 가능, 테스트 브로커·서버 준비다.
MQTT(Paho) 퍼블리시·서브스크라이브:
# pip install paho-mqtt
import ssl
import time
from paho.mqtt import client as mqtt
BROKER = "test.mosquitto.org" # 데모용
PORT = 8883
TOPIC = "demo/iot/sensor/temp"
CLIENT_ID = "edge-gw-001"
def on_connect(client, userdata, flags, rc, properties=None):
print("connected:", rc)
client.subscribe(TOPIC, qos=1)
def on_message(client, userdata, msg):
print("recv:", msg.topic, msg.payload.decode())
client = mqtt.Client(client_id=CLIENT_ID, protocol=mqtt.MQTTv5)
client.tls_set(cert_reqs=ssl.CERT_REQUIRED)
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, PORT, keepalive=60)
client.loop_start()
for i in range(3):
payload = f'{{"ts":{int(time.time())},"temp":{20+i*0.5}}}'
client.publish(TOPIC, payload=payload, qos=1, retain=False)
time.sleep(1)
time.sleep(2)
client.loop_stop()
client.disconnect()
CoAP(aiocoap) Confirmable 요청:
# pip install aiocoap
import asyncio
from aiocoap import *
async def main():
protocol = await Context.create_client_context()
req = Message(code=POST, uri="coap://coap.me/hello", payload=b"ping")
# Confirmable 기본, 응답 대기
try:
resp = await protocol.request(req).response
print("code:", resp.code, "payload:", resp.payload.decode())
except Exception as e:
print("error:", e)
if __name__ == "__main__":
asyncio.run(main())
보안·운영에서 트레이드오프가 생기는 지점
전송 보안은 TLS 1.2 이상/DTLS 1.3을 권장한다(최신 정보 확인 필요). X.509는 신원 보장이 강하지만 PSK는 경량인 대신 관리 부담이 있고, DTLS는 핸드셰이크 지연이 늘어날 수 있다. 신뢰성 측면에서 MQTT QoS1은 중복을 허용하므로 아이템포턴시 설계가 필요하고, CoAP CON은 손실 회복에는 유리하지만 중복 처리 로직이 따로 필요하다.
확장은 브로커 클러스터(EMQX/HiveMQ/MQTT-5 공유 구독)로 소비자를 스케일아웃하거나 CoAP 프록시·캐시로 엣지 트래픽을 줄이는 방향이다. 운영 가시성을 위해서는 conn/s, inflight, publish rate, ack latency 같은 지표와 로그·트레이스를 통합하고 토픽·리소스 네임스페이스를 버전 관리해 호환성을 유지한다. OTA·수명주기 관리는 서명·무중단·롤백 가능한 배포가 기본이고, 안전한 부팅과 런타임 무결성 측정으로 공급망 위협에 대응한다.
센서 네트워크의 제약을 반영한 게이트웨이 중심 설계와 MQTT/CoAP의 적절한 조합이 결국 IoT 아키텍처의 성능·신뢰성·운영 효율을 결정한다. 표준화된 네임스페이스·보안·오류 처리 절차를 내재화하고, 브로커·프록시 확장 전략과 엣지 오프로드를 함께 도입하는 편이 낫다.