0Pricing
C# Academy · 강의

SignalR 허브와 연결

SignalR 허브를 만들고 ASP.NET Core에 매핑하며 JavaScript 및 .NET 클라이언트에서 WebSocket 연결을 설정합니다.

SignalR 허브와 연결은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

SignalR란 무엇입니까?

SignalR은 ASP.NET Core 라이브러리로, 서버와 client 간에 실시간 양방향 통신을 추가합니다. 양쪽에서 지원하는 기능에 따라 WebSockets, 서버 전송 이벤트 또는 긴 폴링 중 가장 적합한 전송 방식을 자동으로 선택합니다.

SignalR 설정하기

서비스에 SignalR을 추가하고 허브 엔드포인트를 매핑합니다. 허브는 client connection과 메서드 호출을 처리하는 클래스입니다.

builder.Services.AddSignalR();

var app = builder.Build();

app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");

app.Run();

허브 만들기

Hub에서 상속하십시오. 허브 메서드는 client가 호출합니다. Context 속성은 connection 정보를 제공하고, Clients를 사용하면 메시지를 다시 보낼 수 있습니다.

using Microsoft.AspNetCore.SignalR;

public class ChatHub : Hub
{
    public async Task SendMessage(string user, string message)
    {
        // Broadcast to ALL connected clients
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }

    public override async Task OnConnectedAsync()
    {
        await Clients.Caller.SendAsync("Welcome",
            $"Connected as {Context.ConnectionId}");
        await base.OnConnectedAsync();
    }
}

JavaScript Client

공식 SignalR JavaScript client는 connection을 만들고 이벤트 handler를 등록한 다음 connection을 시작합니다. 허브에 정의된 메서드는 JavaScript에서 호출할 수 있습니다.

// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/chat")
    .withAutomaticReconnect()
    .build();

connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user}: ${message}`);
});

await connection.start();
await connection.invoke("SendMessage", "Alice", "Hello!");

.NET SignalR Client

.NET client도 같은 방식으로 작동하므로 서비스 간 실시간 통신이나 데스크톱 및 모바일 앱에 유용합니다.

// dotnet add package Microsoft.AspNetCore.SignalR.Client

var connection = new HubConnectionBuilder()
    .WithUrl("https://myapp.com/hubs/chat")
    .WithAutomaticReconnect()
    .Build();

connection.On<string, string>("ReceiveMessage", (user, msg) =>
    Console.WriteLine($"{user}: {msg}"));

await connection.StartAsync();
await connection.InvokeAsync("SendMessage", "Bot", "Connected!");

특정 Client에게 보내기

Clients 속성에는 특정 connection, 호출자 또는 지정된 대상을 제외한 모든 연결된 클라이언트를 대상으로 하는 메서드가 있습니다.

// To the caller only
await Clients.Caller.SendAsync("YouSaid", message);

// To a specific connection
await Clients.Client(connectionId).SendAsync("PrivateMsg", msg);

// To all except caller
await Clients.Others.SendAsync("ReceiveMessage", user, message);

// To multiple specific connections
await Clients.Clients(new[] { id1, id2 })
             .SendAsync("DirectMsg", msg);

허브 컨텍스트: 허브 외부에서 보내기

IHubContext<T>를 서비스나 백그라운드 작업자에 주입하면 허브 클래스 외부에서 메시지를 보낼 수 있습니다. 서버가 시작하는 푸시에 필수적입니다.

public class NotificationService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotificationService(IHubContext<ChatHub> hub) => _hub = hub;

    public async Task BroadcastAlertAsync(string alert)
    {
        // Send to all clients from a background service
        await _hub.Clients.All.SendAsync("SystemAlert", alert);
    }
}

Connection 수명 주기 이벤트

OnConnectedAsync와 OnDisconnectedAsync를 재정의하여 connection을 추적하고 상태를 유지하거나 리소스를 정리하십시오.

public override async Task OnConnectedAsync()
{
    _connections.TryAdd(Context.ConnectionId, GetUserName());
    await Clients.All.SendAsync("UserJoined", GetUserName());
    await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception? ex)
{
    _connections.TryRemove(Context.ConnectionId, out var user);
    await Clients.All.SendAsync("UserLeft", user);
    await base.OnDisconnectedAsync(ex);
}

private string GetUserName() =>
    Context.User?.Identity?.Name ?? Context.ConnectionId;

자동 재연결

일시적인 연결 끊김을 원활하게 처리하려면 client에서 자동 재연결을 활성화하십시오. 재시도 지연 시간을 사용자 지정할 수 있습니다.

// JavaScript client
const conn = new signalR.HubConnectionBuilder()
    .withUrl("/hubs/chat")
    .withAutomaticReconnect([0, 2000, 5000, 10000, 30000]) // retry delays in ms
    .build();

conn.onreconnecting(err => console.warn("Reconnecting...", err));
conn.onreconnected(id  => console.log("Reconnected:",    id));
conn.onclose(err       => console.error("Disconnected:", err));

SignalR 인증

SignalR은 ASP.NET Core 인증 미들웨어를 따릅니다. 허브 클래스에 [Authorize]를 추가하거나 쿼리 문자열 토큰을 지원하는 JWT handler를 사용하십시오(WebSocket 인증에 필요합니다).

[Authorize]
public class PrivateHub : Hub
{
    public Task SendMessage(string msg)
    {
        var user = Context.User!.Identity!.Name;
        return Clients.All.SendAsync("Msg", user, msg);
    }
}

// JWT via query string (WebSocket requirement):
builder.Services.AddAuthentication().AddJwtBearer(opt =>
{
    opt.Events = new JwtBearerEvents
    {
        OnMessageReceived = ctx =>
        {
            var token = ctx.Request.Query["access_token"];
            if (!string.IsNullOrEmpty(token))
                ctx.Token = token;
            return Task.CompletedTask;
        }
    };
});

빠른 확인

백그라운드 서비스(허브 클래스 외부)에서 SignalR 메시지를 어떻게 보냅니까?

복습: SignalR 허브 및 연결

핵심 요점:

  • SignalR은 가장 적합한 전송 방식(WebSockets, SSE, 긴 폴링)을 자동으로 선택합니다
  • 허브 메서드는 client가 호출할 수 있으며, Clients.*는 특정 수신자를 대상으로 합니다
  • IHubContext<T>를 주입하여 허브 외부에서 메시지를 푸시합니다
  • 수명 주기 관리를 위해 OnConnectedAsync/OnDisconnectedAsync를 재정의합니다
  • 탄력적인 client connection을 위해 withAutomaticReconnect()를 사용합니다
  • WebSocket connection에는 쿼리 문자열을 통한 JWT 인증이 필요합니다

자주 묻는 질문

“SignalR 허브와 연결” 강의는 무료인가요?

네 — “SignalR 허브와 연결” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“SignalR 허브와 연결”에서 뭘 배우나요?

SignalR 허브를 만들고 ASP.NET Core에 매핑하며 JavaScript 및 .NET 클라이언트에서 WebSocket 연결을 설정합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“SignalR 허브와 연결” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. SignalR 허브와 연결
  2. 그룹, 사용자와 연결 관리
  3. 강력한 형식의 허브
  4. Redis 백플레인으로 확장하기
← C# Academy(으)로 돌아가기