기본 콘텐츠로 건너뛰기

MQTT vs SignalR 비교 및 코드 예제

 



현대 애플리케이션 개발에서는 실시간 통신이 점점 더 중요해지고 있습니다.

이번 글에서는 C#에서 대표적인 실시간 통신 기술인 MQTT와 SignalR을 비교하고, 각각의 기술을 이용한 코드 예제를 통해 어떤 상황에서 어느 기술을 선택할 수 있는지 알아보겠습니다.


1. MQTT란?

MQTT(Message Queuing Telemetry Transport) 는 경량 메시징 프로토콜로, 주로 사물인터넷(IoT) 환경에서 센서 데이터나 원격 제어 메시지를 주고받을 때 많이 사용됩니다.

  • 특징:
    • 경량성: 적은 네트워크 대역폭과 리소스를 사용합니다.
    • 퍼블리시/서브스크라이브 모델: 클라이언트는 브로커를 통해 메시지를 발행(publish)하고, 필요한 메시지를 구독(subscribe)할 수 있습니다.
    • 신뢰성: QoS(Quality of Service) 옵션을 제공하여 메시지 전달의 신뢰성을 보장할 수 있습니다.

MQTT 사용 예제 (MQTTnet 라이브러리)

먼저 MQTTnet 라이브러리를 NuGet을 통해 프로젝트에 추가합니다.

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using System;
using System.Text;
using System.Threading.Tasks;

class MqttExample
{
    public static async Task RunAsync()
    {
        // MQTT 클라이언트 생성
        var factory = new MqttFactory();
        var mqttClient = factory.CreateMqttClient();

        // 연결 옵션 구성
        var options = new MqttClientOptionsBuilder()
            .WithClientId("CSharpClient")
            .WithTcpServer("broker.hivemq.com", 1883) // 공용 MQTT 브로커 사용
            .Build();

        mqttClient.UseConnectedHandler(async e =>
        {
            Console.WriteLine("MQTT 브로커에 연결됨");

            // 토픽 구독
            await mqttClient.SubscribeAsync("test/topic");
            Console.WriteLine("토픽 구독 완료");
        });

        mqttClient.UseDisconnectedHandler(e =>
        {
            Console.WriteLine("MQTT 브로커와 연결 해제됨");
        });

        mqttClient.UseApplicationMessageReceivedHandler(e =>
        {
            string topic = e.ApplicationMessage.Topic;
            string payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
            Console.WriteLine($"수신된 메시지 - 토픽: {topic}, 메시지: {payload}");
        });

        // MQTT 브로커에 연결
        await mqttClient.ConnectAsync(options);

        // 메시지 발행 예제
        var message = new MqttApplicationMessageBuilder()
            .WithTopic("test/topic")
            .WithPayload("안녕하세요, MQTT!")
            .WithExactlyOnceQoS()
            .WithRetainFlag()
            .Build();

        await mqttClient.PublishAsync(message);
        Console.WriteLine("메시지 발행 완료");

        // 잠시 대기 후 연결 종료
        await Task.Delay(TimeSpan.FromSeconds(5));
        await mqttClient.DisconnectAsync();
    }

    static async Task Main(string[] args)
    {
        await RunAsync();
    }
}

위 코드는 간단한 MQTT 클라이언트를 구현하여, 브로커에 연결 후 특정 토픽을 구독하고 메시지를 발행하는 예제입니다.


2. SignalR란?

SignalR 은 ASP.NET Core에서 제공하는 라이브러리로, 웹 애플리케이션에 실시간 기능을 쉽게 추가할 수 있도록 돕습니다.

  • 특징:
    • 실시간 양방향 통신: 클라이언트와 서버 간에 즉각적인 메시지 교환이 가능합니다.
    • 자동 재연결: 연결이 끊어지면 자동으로 재연결을 시도합니다.
    • 다양한 전송 프로토콜 지원: WebSocket, Server-Sent Events, Long Polling 등을 상황에 맞게 선택합니다.

SignalR 사용 예제 (ASP.NET Core)

아래는 간단한 SignalR 허브와 클라이언트를 구성하는 예제입니다.

2.1. SignalR Hub 구현

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

public class ChatHub : Hub
{
    // 클라이언트로부터 메시지를 받아 모든 연결된 클라이언트에 전송
    public async Task SendMessage(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

2.2. Startup.cs 또는 Program.cs 설정 (ASP.NET Core 6 이상)

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

// SignalR 서비스 추가
builder.Services.AddSignalR();

var app = builder.Build();

app.MapHub<ChatHub>("/chathub");

app.Run();

2.3. 클라이언트 코드 예제 (JavaScript)

  
            // SignalR 허브 연결 생성
            const connection = new signalR.HubConnectionBuilder()
                .withUrl("/chathub")
                .build();
    
            // 서버로부터 메시지를 수신하면 리스트에 추가
            connection.on("ReceiveMessage", function(user, message) {
                const li = document.createElement("li");
                li.textContent = `${user}: ${message}`;
                document.getElementById("messagesList").appendChild(li);
            });
    
            // 허브 연결 시작
            connection.start().catch(function (err) {
                return console.error(err.toString());
            });
    
            // 메시지 전송 함수
            function sendMessage() {
                const user = document.getElementById("userInput").value;
                const message = document.getElementById("messageInput").value;
                connection.invoke("SendMessage", user, message).catch(function (err) {
                    return console.error(err.toString());
                });
            }
        

    위 예제는 SignalR 허브를 통해 실시간 채팅 기능을 구현한 것입니다. 서버에서 클라이언트에게 메시지를 전파하며, 클라이언트는 JavaScript를 통해 연결 및 메시지 전송/수신을 처리합니다.


    3. MQTT vs SignalR 비교

    사용 목적

    • MQTT:
      • IoT 디바이스 간의 데이터 전송, 원격 센서 데이터 모니터링 등 경량 통신이 필요한 경우 적합합니다.
    • SignalR:
      • 웹 애플리케이션에서 채팅, 실시간 알림, 라이브 대시보드 등 실시간 웹 기능을 구현할 때 유용합니다.

    네트워크 특성

    • MQTT:
      • 브로커 기반: 중간 브로커를 통해 메시지가 라우팅됩니다.
      • 경량 프로토콜: 저전력, 낮은 대역폭 환경에 최적화되어 있습니다.
    • SignalR:
      • 서버-클라이언트 직접 연결: 클라이언트와 서버 간의 직접적인 실시간 통신이 이루어집니다.
      • 다양한 전송 방식: 최적의 전송 프로토콜을 자동으로 선택합니다.

    확장성 및 구현 용이성

    • MQTT:
      • IoT 환경에 최적화되어 있으며, 다양한 언어와 플랫폼에서 사용 가능합니다.
    • SignalR:
      • ASP.NET Core와의 통합이 쉬워 웹 개발자가 빠르게 실시간 기능을 추가할 수 있습니다.

    4. 결론

    각 기술은 목적에 따라 장단점이 있습니다.

    • MQTT 는 경량 프로토콜로 IoT 환경에서 데이터 수집, 센서 통신, 원격 제어 등의 요구사항에 적합하며, 브로커 기반의 아키텍처를 통해 안정적인 메시지 전달을 제공합니다.
    • SignalR 은 ASP.NET Core 환경에서 웹 애플리케이션에 실시간 기능을 손쉽게 추가할 수 있도록 도와주며, 채팅, 알림, 실시간 업데이트 등 웹 사용자 경험 향상에 초점을 맞추고 있습니다.

    개발하려는 애플리케이션의 요구사항과 환경에 맞춰 두 기술 중 하나를 선택하거나, 필요에 따라 두 기술을 조합하여 사용할 수도 있습니다.


    위 예제 코드와 설명을 참고하여 여러분의 프로젝트에 맞는 실시간 통신 솔루션을 선택해 보세요. Happy Coding!

    댓글

    이 블로그의 인기 게시물

    Log4Net vs. Serilog 비교

    🔍 Log4Net vs. Serilog 간단 비교 기준Log4NetSerilog 성능 중간 (충분하지만, 최신 라이브러리보단 느림) 빠르고 효율적 설정 방식 XML 기반 (전통적) JSON 기반 (모던함) 구조적 로깅 미지원 (기본 텍스트 로그) 강력한 구조적 로깅 지원 ASP.NET Core 통합 가능하지만 설정이 좀 복잡 간단하고 직관적 Sink(대상) 다양성 적당한 편 매우 다양하고 확장성 높음 생태계 & 유지보수 전통적, 유지보수 상태는 다소 정체 활발한 개발과 업데이트 🎯 어떤 프레임워크가 좋을까? Serilog를 추천하는 이유: 최신 기술 : ASP.NET Core와 완벽히 통합, 구조적 로깅이 뛰어나 JSON 로그 처리, 분석에 최적화됨. 높은 생산성 : 설정과 유지보수가 쉬움. 코드 기반 및 JSON 설정으로 직관적이고 빠른 개발이 가능. 확장성 : 파일, 콘솔, DB, Elasticsearch, Seq 등 다양한 Sink를 제공해 향후 확장성이 좋음. 🚀 결론 요약 Log4Net을 추천할 때Serilog를 추천할 때 기존 시스템과 호환이 필수 최신 ASP.NET Core 프로젝트 XML 설정 선호 JSON, 코드 기반 설정 선호 구조적 로깅 필요 없음 구조적 로깅과 분석 필요

    실시간 웹 애플리케이션 구축하기: SignalR 이용하기

      IT 개발자로서 실시간 통신 기능을 웹 애플리케이션에 통합하는 것은 사용자 경험을 대폭 향상시킬 수 있는 중요한 방법 중 하나입니다. 오늘은 Microsoft의 SignalR을 이용하여 실시간 웹 애플리케이션을 구축하는 방법을 소개하려 합니다. SignalR은 웹소켓을 사용하여 실시간 통신을 쉽게 구현할 수 있도록 도와주는 라이브러리입니다. SignalR 소개 SignalR은 .NET 개발자들이 실시간 웹 기능을 손쉽게 구현할 수 있도록 지원하는 라이브러리입니다. 클라이언트와 서버 간의 양방향 통신을 가능하게 해 주며, 채팅 애플리케이션, 실시간 게임, 실시간 데이터 업데이트 등 다양한 실시간 애플리케이션을 개발할 때 유용하게 사용됩니다. 주요 기능 자동 연결 관리 : SignalR은 연결, 재연결 및 연결 해제 과정을 자동으로 처리합니다. 규모 확장성 : SignalR은 Redis, Azure SignalR Service 등을 통해 서버를 확장할 수 있는 기능을 지원합니다. 다양한 플랫폼 지원 : JavaScript, .NET, Java 등 다양한 클라이언트에서 사용 가능합니다. 실시간 채팅 애플리케이션 구축하기 개발 환경 설정 .NET Core SDK 설치 : SignalR은 .NET Core에 포함되어 있으므로, .NET Core SDK가 설치되어 있어야 합니다. Visual Studio 또는 VS Code 설치 : 개발 환경으로 Visual Studio 또는 VS Code를 사용할 수 있습니다. 프로젝트 생성 Visual Studio에서 새 프로젝트 생성 : 'ASP.NET Core Web Application' 선택 프로젝트 이름과 위치 설정 'ASP.NET Core Empty' 템플릿 선택 SignalR 라이브러리 추가 : NuGet 패키지 관리자를 통해 Microsoft.AspNetCore.SignalR을 설치합니다. SignalR 허브 생성 SignalR 허브는 클라이언트와 서버 간의 통신을 중개하는 역할을 합니다...

    스마트팜과 AI

      스마트팜과 AI 융합, 농업 혁신의 미래를 보다 안녕하세요, IT 개발자 여러분 그리고 기술에 관심이 많은 일반 독자분들! 오늘은 농업과 최신 IT 기술의 만남, 바로 "스마트팜과 AI"에 대해서 이야기하고자 합니다. 스마트팜 기술은 이미 다양한 분야에서 활용되고 있지만, 인공지능(AI)을 접목하면 어떤 가능성이 있는지, 또 어떤 방향으로 개발하면 좋을지 함께 생각해보겠습니다. 스마트팜이란? 스마트팜은 사물인터넷(IoT) 기술을 농업에 적용하여 온도, 습도, 일조량, 영양분 등을 자동으로 제어하는 시스템입니다. 이미 많은 농가에서 사용하고 있는 기술로, 효율성을 높이고 노동력을 줄이는 데 크게 기여하고 있습니다. 왜 스마트팜에 AI가 필요한가? 기존 스마트팜은 센서를 통해 데이터를 수집하고 이를 기반으로 단순 제어만 수행했습니다. 하지만 AI가 결합되면 수집된 데이터를 심층적으로 분석하여 보다 정밀한 제어와 예측이 가능해집니다. 예를 들어, AI를 활용한 이미지 인식 기술을 통해 병충해 발생을 초기에 발견하고 대응할 수 있으며, 빅데이터 분석을 통한 작물 생장 예측으로 생산량과 품질을 획기적으로 향상시킬 수 있습니다. AI 스마트팜 아이디어 제안 1. 작물 건강 모니터링 시스템 이미지 처리 딥러닝 모델을 이용해 식물 잎이나 줄기의 이미지를 실시간 분석하여 병충해 및 영양 결핍 상태를 자동으로 감지하고 경고 메시지를 제공합니다. 2. 자율 농장 로봇 AI 기반의 자율 주행 로봇을 개발하여 농작물의 관리(파종, 관수, 수확)를 자동화합니다. 강화학습(Reinforcement Learning)을 적용해 로봇이 스스로 환경에 적응하고 효율적인 작업 방식을 학습하도록 합니다. 3. 예측형 기후 대응 시스템 과거 기상 데이터와 현재 환경 데이터를 머신러닝으로 분석하여 작물 생육에 최적화된 환경 조건을 예측하고 제어합니다. 갑작스러운 기후 변화에도 농작물 피해를 최소화할 수 있습니다. 4. 스마트 해충 방제 시스템 AI 기반으로 해충의 종류와 개체수를...

    .NET MAUI: 크로스플랫폼 앱 개발의 미래

      1. .NET MAUI란? **.NET MAUI (Multi-platform App UI)**는 마이크로소프트에서 개발한 크로스플랫폼 애플리케이션 프레임워크로, 하나의 코드베이스로  iOS, Android, Windows, macOS 에서 실행되는 애플리케이션을 만들 수 있습니다. 주요 특징 단일 코드베이스 : 하나의 코드로 여러 플랫폼 지원 네이티브 UI : 각 플랫폼의 네이티브 UI 컨트롤을 활용 .NET 기반 : C#과 .NET 기술을 사용 MVU 및 MVVM 패턴 지원 핫 리로드 지원 : UI 변경 시 즉시 반영 강력한 성능 및 최적화 2. .NET MAUI 개발 환경 설정 필수 도구 운영체제 필수 소프트웨어 Windows Visual Studio 2022, .NET SDK 6 이상 Mac Visual Studio for Mac, .NET SDK 6 이상, Xcode 프로젝트 생성 방법 Visual Studio에서 생성 Visual Studio 2022 실행 "새 프로젝트 만들기" 선택 .NET MAUI 앱 템플릿 선택 프로젝트 이름 및 경로 설정 후 생성 명령어로 생성 dotnet new maui -n MyMauiApp cd MyMauiApp dotnet build dotnet run 3. .NET MAUI 프로젝트 구조 📂 MyMauiApp ├── 📂 Platforms # Android, iOS, macOS, Windows 코드 ├── 📂 Resources # 이미지, 폰트, 스타일 등 ├── 📂 Views # XAML UI 코드 ├── 📂 Models # 데이터 모델 ├── 📂 ViewModels # MVVM 패턴을 위한 ViewModel ├── App.xaml # 전역 스타일 및 테마 ├── MainPage.xaml # 메인 페이지 UI ├── MauiProgram.cs # 앱 초기 설정 4. 기본 UI 개발 (XAML & C#) XAM...

    사회인야구와 IT & AI의 만남

      사회인야구와 IT & AI의 만남: 아마추어 야구의 새로운 혁신 사회인야구는 야구를 사랑하는 사람들이 직장이나 동호회를 통해 모여 즐기는 스포츠입니다. 단순한 취미 활동을 넘어, 이제는 데이터와 기술을 활용해 더 체계적으로 발전하고 있습니다. 특히 IT 기술과 AI의 발전은 사회인야구의 패러다임을 바꾸고 있습니다. 이번 글에서는 IT 및 AI 기술이 사회인야구에 어떻게 적용될 수 있는지 살펴보겠습니다. 1. 경기 분석 및 데이터 활용 야구는 데이터 중심의 스포츠입니다. 프로야구에서는 타율, 출루율, OPS 등 다양한 지표를 활용해 선수의 퍼포먼스를 평가합니다. 이러한 데이터 분석이 이제는 사회인야구에서도 활용되고 있습니다. 트래킹 시스템 : AI 기반 카메라 및 센서를 이용하여 타격과 투구 데이터를 분석할 수 있습니다. 스마트폰 앱을 통해 공의 속도, 회전 수, 발사각 등을 측정할 수 있으며, 이를 통해 선수들이 자신의 플레이를 객관적으로 평가하고 개선할 수 있습니다. 게임 로그 분석 : 경기 결과를 자동으로 기록하고 분석하는 시스템이 개발되고 있습니다. 예를 들어, AI 기반 스코어링 앱을 활용하면 자동으로 주요 경기 데이터를 기록하고, 이를 바탕으로 팀의 약점과 강점을 분석할 수 있습니다. 2. AI 기반 전략 수립 AI 기술을 활용하면 더욱 효과적인 전략을 수립할 수 있습니다. 라인업 최적화 : AI는 선수들의 기록을 분석하여 가장 효과적인 타순을 추천할 수 있습니다. 이를 통해 팀의 득점력을 극대화할 수 있으며, 상대 팀의 약점을 공략하는 전략을 세울 수도 있습니다. 투구 및 수비 포메이션 추천 : AI는 경기 중 상황을 실시간으로 분석하여 최적의 수비 위치를 추천할 수 있습니다. 예를 들어, 상대 팀 타자의 타구 방향 데이터를 기반으로 수비 위치를 조정할 수 있습니다. 3. IT 기술을 활용한 커뮤니케이션 및 운영 효율화 사회인야구는 경기 일정 조정, 팀원 관리, 용병 섭외 등 운영적인 부분에서도 많은 노력이 필요합니다. IT 기술을...