MQTT의 필요성과 특징에 대해 소개합니다.

MQTT의 필요성 🔗

IoT는 인터넷에 연결되지 않았던 사물을 인터넷에 연결합니다. 전등, 시계, TV, 냉장고, 거울에 이르기까지, 인터넷을 통해 수많은 사물을 제어하고 사물로부터 실시간으로 정보를 얻습니다.

우리가 인터넷 익스플로러나 크롬과 같은 웹 브라우저로 인터넷을 사용하듯, IoT 사물 역시 인터넷을 사용해 데이터를 교환합니다. 하지만 IoT에서 사용하는 인터넷은 우리가 사용하는 인터넷과 달리 다음과 같은 기능을 필요로 합니다:

  • 다 대 다 통신이 필요합니다. 하나의 사물이 여러 사물에게 실시간으로 데이터를 주거나, 여러 사물로부터 데이터를 받아야 합니다.
  • 일부 사물은 배터리로 동작합니다. 전력을 아낄 필요가 있습니다.
  • 현관문의 닫힘 상태와 같이 절대 손실되선 안 되는 데이터도 있지만, 방 안의 온도나 습도같이 어느 정도는 손실되어도 괜찮은 데이터도 있습니다. 중요한 데이터는 더 꼼꼼히 확인하고, 덜 중요한 데이터는 데이터 도착 확인 시간을 줄여 빠르게 보낼 수 있어야 합니다.
  • 도중에 연결이 끊길 수도 있습니다. 연결이 끊겼을 때 부드럽게 대처할 수 있어야 합니다.

데이터 교환을 위해 반드시 위와 같은 기능이 필요한 것은 아닙니다. 그러나 저런 기능이 존재한다면 사물 간에 더 효과적으로 통신할 수 있습니다.


MQTT는 IoT 사물을 제어하는 데 적격인 프로토콜입니다. 프로토콜은 우리말로 통신 규약이라 합니다. 통신 규약이란 상호간에 ‘통신 중 이런 식으로 데이터를 보내고 이런 식으로 받자’같은 것을 정해놓은 일종의 규칙입니다.

MQTT 프로토콜에 따라 통신할 경우 다 대 다 통신, 전력 소모 감소, 연결 중단 시 부드러운 대처 등 다양한 이점을 누릴 수 있습니다.

반대로 우리가 사용하는 인터넷은 HTTP라는 프로토콜을 따르고 있습니다. 이 프로토콜을 통해서도 IoT 사물 간에 데이터를 주고받을 수도 있지만, 효율적으로 통신하기 어렵습니다.

(MQTT는 규칙일 뿐 프로그램이 아닙니다. 실제로 MQTT를 사용하기 위해서는 이 규칙에 따라 구현한 프로그램을 사용해야 합니다. 대표적으로 Mosquitto, PubSubClient가 있습니다.)

특징 🔗

최소화된 부가 정보 🔗

통신 시 실제로 주고받아야 할 데이터만 교환하는 것은 아닙니다. 데이터를 보내는 시간이라든가, 데이터를 전송하는 사람의 정보 등 눈에 보이지 않는 데이터도 메시지와 함께 전송됩니다.

MQTT는 이러한 부가 정보의 양을 최대한 줄임으로서 통신 시간 및 부가 정보를 해석하는 시간을 줄여, 최종적으로 전력을 덜 소모하도록 합니다.

관련 글:

발행, 구독 체계 🔗

사물의 종류가 다양한 만큼, 인터넷에 접속하는 클라이언트의 수도 그만큼 많습니다. 때문에 사물 간에 데이터를 교환하기 위해 일 대 일로 통신하는 것은 비효율적입니다. MQTT에서는 자신이 만들어낼 수 있는 데이터를 메시지에 담아 발행하고, 필요한 사물은 이를 구독하는 방식을 취합니다.

이를 위해서는 먼저 데이터를 교환하기 위한 중앙 컴퓨터가 필요합니다. 이 컴퓨터를 가리켜 브로커라 합니다. 브로커에는 각 사물로부터 들어온 수많은 데이터가 있습니다. 브로커에 데이터를 발행하거나 구독하는 각각의 사물을 클라이언트라 칭합니다.

QoS(서비스 품질) 🔗

MQTT에서는 데이터의 중요도에 따라 메시지를 달리 보낼 수 있습니다. 이를 가리켜 QoS(서비스 품질)라 합니다.

중요한 데이터의 경우 데이터가 잘 보내졌나 확인하는 메시지를 내부적으로 여러 번 보냅니다. 확인하는 시간이 늘어나지만, 그만큼 데이터의 전송을 확실히 보장합니다.

반대로 데이터가 별로 중요하지 않다면 별도의 확인 절차 없이 전송합니다. 데이터가 소실될 위험이 있지만, 확인하는 시간을 줄인 만큼 더 빠르게 보낼 수 있습니다.

유언 메시지 🔗

모든 사물이 항상 정상 작동한다고 보장할 수는 없습니다. 전원 차단, 네트워크 연결 장애, 합선 등으로 인해 언제든 연결이 해제될 수 있습니다.

각 사물은 자신이 죽었을 때(연결이 끊길 때)를 대비해 브로커에게 미리 유언을 남겨둘 수 있습니다. 일정 시간 동안 응답이 없을 경우, 브로커는 유언 메시지를 전송합니다.