Azure Web PubSub 서비스를 사용하면 실시간 웹 메시징 애플리케이션을 쉽게 빌드할 수 있습니다. 이 자습서에서는 WebSocket API를 사용하여 서비스를 구독하는 방법과 Web PubSub 서비스 SDK를 사용하여 메시지를 게시하는 방법을 알아봅니다.
이 자습서에서는 다음 작업 방법을 알아봅니다.
- Web PubSub 서비스 인스턴스 만들기
- WebSocket 연결을 설정하기 위한 전체 URL 생성
- 표준 WebSocket 프로토콜을 사용하여 메시지를 받을 Web PubSub 구독자 클라이언트 만들기
- Web PubSub 서비스 SDK를 사용하여 메시지를 게시하는 Web PubSub 게시자 클라이언트 만들기
필수 구성 요소
- Azure 구독에서 체험 계정을 만듭니다.
- Bash 명령 셸. Azure Cloud Shell에서 로컬 셸 또는 Bash 환경을 사용합니다.
- 로컬 컴퓨터에서 실행되는 경우 Azure CLI를 설치합니다.
Bash 셸 대신 Windows cmd.exe 명령 셸을 사용하여 이 자습서의 명령을 실행할 수 있습니다.
로컬 컴퓨터에서 프로젝트를 만드는 경우 사용하는 언어에 대한 종속성을 설치해야 합니다.
중요
이 문서에서는 데모 목적으로만 원시 연결 문자열을 사용합니다.
연결 문자열에는 애플리케이션이 Azure Web PubSub 서비스에 액세스하는 데 필요한 권한 부여 정보가 포함됩니다. 연결 문자열 내의 액세스 키는 서비스의 루트 암호와 비슷합니다. 프로덕션 환경에서는 항상 액세스 키를 보호합니다. Azure Key Vault를 사용하여 키를 안전하게 관리하고 회전하고 WebPubSubServiceClient
를 통해 연결을 보호합니다.
액세스 키를 다른 사용자에게 배포하거나 하드 코딩하거나 다른 사용자가 액세스할 수 있는 일반 텍스트로 저장하지 않도록 합니다. 키가 손상되었다고 생각되면 키를 교체하세요.
환경 준비
로컬 개발을 위한 Azure CLI 설정
다음 단계에 따라 Azure CLI 및 프로젝트 환경을 설정합니다.
명령 셸을 엽니다.
최신 버전의 Azure CLI로 업그레이드합니다.
az upgrade
Web PubSub용 Azure CLI 확장을 설치합니다.
az extension add --name webpubsub
Azure CLI에 로그인합니다. 프롬프트에 따라 Azure 자격 증명을 입력합니다.
az login
리소스 그룹 만들기
리소스 그룹은 Azure 리소스가 배포 및 관리되는 논리적 컨테이너입니다. az group create 명령을 사용하여 eastus
위치에서 myResourceGroup
이라는 리소스 그룹을 만듭니다.
az group create --name myResourceGroup --___location EastUS
1. Azure Web PubSub 인스턴스 만들기
Web PubSub 인스턴스 만들기
만든 리소스 그룹에서 Web PubSub 인스턴스를 만들려면 Azure CLI az webpubsub create 명령을 사용합니다. 다음 명령은 EastUS
의 리소스 그룹 myResourceGroup
아래에 무료 Web PubSub 리소스를 만듭니다.
각 Web PubSub 리소스에는 고유한 이름이 있어야 합니다. 다음 명령에서 <your-unique-resource-name>을 Web PubSub 인스턴스의 이름으로 바꿉니다.
az webpubsub create --resource-group myResourceGroup --name <your-unique-resource-name> --___location EastUS --sku Free_F1
이 명령의 출력에는 새로 만든 리소스의 속성이 표시됩니다. 다음 속성을 참고합니다.
- name: 위의
--name
매개 변수에서 제공한 Web PubSub 이름입니다.
- hostName: 이 예제에서 호스트 이름은
<your-unique-resource-name>.webpubsub.azure.com/
입니다.
이때 Azure 계정은 이 새 리소스에서 모든 작업을 수행할 권한이 있는 유일한 계정입니다.
연결 문자열 가져오기
Azure CLI az webpubsub key 명령을 사용하여 서비스의 ConnectionString을 가져옵니다. <your-unique-resource-name>
자리 표시자를 Azure Web PubSub 인스턴스 이름으로 바꿉니다.
az webpubsub key show --resource-group myResourceGroup --name <your-unique-resource-name> --query primaryConnectionString --output tsv
나중에 사용할 수 있게 연결 문자열을 복사합니다.
구독자 클라이언트 만들기
클라이언트는 JWT(JSON Web Token) 인증을 사용하여 표준 WebSocket 프로토콜을 통해 Azure Web PubSub 서비스에 연결합니다. 서비스 SDK는 토큰을 생성하는 도우미 메서드를 제공합니다. 이 자습서에서 구독자는 ConnectionString에서 직접 토큰을 생성합니다. 실제 애플리케이션에서는 일반적으로 서버 쪽 애플리케이션이 인증/권한 부여 워크플로를 처리합니다. 워크플로를 더 잘 이해하려면 자습서 채팅 앱 빌드를 참조하세요.
이 문서에서는 데모 목적으로만 원시 연결 문자열을 사용합니다. 프로덕션 환경에서는 항상 액세스 키를 보호합니다. Azure Key Vault를 사용하여 키를 안전하게 관리하고 회전하고 WebPubSubServiceClient
를 통해 연결을 보호합니다.
먼저 이 프로젝트에 대한 subscriber
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
- Websocket.Client 패키지는 WebSocket 연결을 지원하는 타사 패키지입니다. WebSocket을 지원하는 API/라이브러리를 사용할 수 있습니다.
- SDK 패키지
Azure.Messaging.WebPubSub
는 JWT를 생성하는 데 도움이 됩니다.
mkdir subscriber
cd subscriber
dotnet new console
dotnet add package Websocket.Client --version 4.3.30
dotnet add package Azure.Messaging.WebPubSub --version 1.0.0
Program.cs
의 코드를 서비스에 연결하는 다음 코드로 바꿉니다.
using System;
using System.Threading.Tasks;
using Azure.Messaging.WebPubSub;
using Websocket.Client;
namespace subscriber
{
class Program
{
static async Task Main(string[] args)
{
if (args.Length != 2)
{
Console.WriteLine("Usage: subscriber <connectionString> <hub>");
return;
}
var connectionString = args[0];
var hub = args[1];
// Either generate the URL or fetch it from server or fetch a temp one from the portal
var serviceClient = new WebPubSubServiceClient(connectionString, hub);
var url = serviceClient.GetClientAccessUri();
using (var client = new WebsocketClient(url))
{
// Disable the auto disconnect and reconnect because the sample would like the client to stay online even no data comes in
client.ReconnectTimeout = null;
client.MessageReceived.Subscribe(msg => Console.WriteLine($"Message received: {msg}"));
await client.Start();
Console.WriteLine("Connected.");
Console.Read();
}
}
}
}
이 코드는 Web PubSub의 허브에 연결되는 WebSocket 연결을 만듭니다. 허브는 클라이언트 그룹에 메시지를 게시할 수 있는 Web PubSub의 논리적 단위입니다. 주요 개념에는 Web PubSub에서 사용되는 용어에 대한 자세한 설명이 포함되어 있습니다.
Web PubSub 서비스는 JWT(JSON Web Token) 인증을 사용합니다. 코드 샘플은 Web PubSub SDK에서 WebPubSubServiceClient.GetClientAccessUri()
를 사용하여 유효한 액세스 토큰이 있는 전체 URL을 포함하는 서비스에 대한 URL을 생성합니다.
연결이 설정되면 WebSocket 연결을 통해 메시지를 받게 됩니다. 클라이언트는 client.MessageReceived.Subscribe(msg => ...));
를 사용하여 들어오는 메시지를 수신 대기합니다.
구독자를 시작하려면 <Web-PubSub-connection-string>
을 이전에 복사한 연결 문자열로 바꾼 후 다음 명령을 실행합니다.
dotnet run <Web-PubSub-connection-string> "myHub1"
먼저 subscriber
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
mkdir subscriber
cd subscriber
npm init -y
npm install --save ws
npm install --save @azure/web-pubsub
WebSocket API를 사용하여 Web PubSub 서비스에 연결합니다. 다음 코드가 포함된 subscribe.js
파일을 만듭니다.
const WebSocket = require('ws');
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
async function main() {
const hub = "pubsub";
let service = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, hub);
let token = await service.getClientAccessToken();
let ws = new WebSocket(token.url);
ws.on('open', () => console.log('connected'));
ws.on('message', data => console.log('Message received: %s', data));
}
main();
이 코드는 Web PubSub의 허브에 연결되는 WebSocket 연결을 만듭니다. 허브는 클라이언트 그룹에 메시지를 게시할 수 있는 Web PubSub의 논리적 단위입니다. 주요 개념에는 Web PubSub에서 사용되는 용어에 대한 자세한 설명이 포함되어 있습니다.
Web PubSub 서비스는 JWT(JSON Web Token) 인증을 사용합니다. 코드 샘플은 Web PubSub SDK에서 WebPubSubServiceClient.GetClientAccessUri()
를 사용하여 유효한 액세스 토큰이 있는 전체 URL을 포함하는 서비스에 대한 URL을 생성합니다.
연결이 설정되면 WebSocket 연결을 통해 메시지를 받게 됩니다. 클라이언트는 client.MessageReceived.Subscribe(msg => ...));
를 사용하여 들어오는 메시지를 수신 대기합니다.
<Web-PubSub-connection-string>
을 이전에 복사한 연결 문자열로 바꾼 후 다음 명령을 실행합니다. Windows 명령 셸을 사용하는 경우 export
대신 set
를 사용할 수 있습니다.
export WebPubSubConnectionString=<Web-PubSub-connection-string>
node subscribe.js
먼저 subscriber
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
mkdir subscriber
cd subscriber
# Create venv
python -m venv env
# Activate venv
source ./env/bin/activate
pip install azure-messaging-webpubsubservice
pip install websockets
WebSocket API를 사용하여 Web PubSub 서비스에 연결합니다. 다음 코드가 포함된 subscribe.py
파일을 만듭니다.
import asyncio
import sys
import websockets
from azure.messaging.webpubsubservice import WebPubSubServiceClient
async def connect(url):
async with websockets.connect(url) as ws:
print('connected')
while True:
print('Received message: ' + await ws.recv())
if __name__ == '__main__':
if len(sys.argv) != 3:
print('Usage: python subscribe.py <connection-string> <hub-name>')
exit(1)
connection_string = sys.argv[1]
hub_name = sys.argv[2]
service = WebPubSubServiceClient.from_connection_string(connection_string, hub=hub_name)
token = service.get_client_access_token()
try:
asyncio.get_event_loop().run_until_complete(connect(token['url']))
except KeyboardInterrupt:
pass
이 코드는 Web PubSub의 허브에 연결되는 WebSocket 연결을 만듭니다. 허브는 클라이언트 그룹에 메시지를 게시할 수 있는 Web PubSub의 논리적 단위입니다. 주요 개념에는 Web PubSub에서 사용되는 용어에 대한 자세한 설명이 포함되어 있습니다.
Web PubSub 서비스는 JWT(JSON Web Token) 인증을 사용합니다. 코드 샘플은 Web PubSub SDK에서 WebPubSubServiceClient.GetClientAccessUri()
를 사용하여 유효한 액세스 토큰이 있는 전체 URL을 포함하는 서비스에 대한 URL을 생성합니다.
연결이 설정되면 WebSocket 연결을 통해 메시지를 받게 됩니다. await ws.recv()
를 사용하여 들어오는 메시지를 수신 대기합니다.
<Web-PubSub-connection-string>
을 이전에 복사한 연결 문자열로 바꾼 후 다음 명령을 실행합니다.
python subscribe.py <Web-PubSub-connection-string> "myHub1"
먼저 이 자습서에 대해 이름이 pubsub
인 프로젝트 디렉터리를 만듭니다.
mkdir pubsub
cd pubsub
pubsub
디렉터리 내에서 Maven을 사용하여 webpubsub-quickstart-subscriber
라는 새 콘솔 앱을 만든 다음, webpubsub-quickstart-subscriber 디렉터리로 이동합니다.
mvn archetype:generate --define interactiveMode=n --define groupId=com.webpubsub.quickstart --define artifactId=webpubsub-quickstart-subscriber --define archetypeArtifactId=maven-archetype-quickstart --define archetypeVersion=1.4
cd webpubsub-quickstart-subscriber
pom.xml
의 dependencies
노드에 WebSocket 및 Azure Web PubSub SDK를 추가합니다.
azure-messaging-webpubsub
: Java용 Web PubSub 서비스 SDK
Java-WebSocket
: Java용 WebSocket 클라이언트 SDK
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-webpubsub</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.1</version>
</dependency>
Web PubSub에서 WebSocket 연결을 통해 서비스에 연결하고 메시지를 구독할 수 있습니다. WebSocket은 완전한 전이중 통신 채널이므로 서비스에서 클라이언트에 메시지를 실시간으로 푸시할 수 있습니다. WebSocket을 지원하는 API 또는 라이브러리를 사용할 수 있습니다. 이 샘플에서는 Java-WebSocket 패키지를 사용합니다.
/src/main/java/com/webpubsub/quickstart 디렉터리로 이동합니다.
편집하여 App.java 파일의 콘텐츠를 다음 코드로 바꿉니다.
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
/**
* Connect to Azure Web PubSub service using WebSocket protocol
*/
public class App
{
public static void main( String[] args ) throws IOException, URISyntaxException
{
if (args.length != 2) {
System.out.println("Expecting 2 arguments: <connection-string> <hub-name>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
WebPubSubClientAccessToken token = service.getClientAccessToken(new GetClientAccessTokenOptions());
WebSocketClient webSocketClient = new WebSocketClient(new URI(token.getUrl())) {
@Override
public void onMessage(String message) {
System.out.println(String.format("Message received: %s", message));
}
@Override
public void onClose(int arg0, String arg1, boolean arg2) {
// TODO Auto-generated method stub
}
@Override
public void onError(Exception arg0) {
// TODO Auto-generated method stub
}
@Override
public void onOpen(ServerHandshake arg0) {
// TODO Auto-generated method stub
}
};
webSocketClient.connect();
System.in.read();
}
}
이 코드는 Azure Web PubSub의 허브에 연결되는 WebSocket 연결을 만듭니다. 허브는 클라이언트 그룹에 메시지를 게시할 수 있는 Azure Web PubSub의 논리적 단위입니다. 주요 개념에는 Azure Web PubSub에서 사용되는 용어에 대한 자세한 설명이 포함되어 있습니다.
Web PubSub 서비스는 JWT(JSON Web Token) 인증을 사용합니다. 코드 샘플은 Web PubSub SDK에서 WebPubSubServiceClient.GetClientAccessUri()
를 사용하여 유효한 액세스 토큰이 있는 전체 URL을 포함하는 서비스에 대한 URL을 생성합니다.
연결이 설정되면 WebSocket 연결을 통해 메시지를 받게 됩니다. onMessage(String message)
를 사용하여 들어오는 메시지를 수신 대기합니다.
구독자 앱을 시작하려면 webpubsub-quickstart-subscriber 디렉터리로 이동하여 다음 명령을 실행합니다. <Web-PubSub-connection-string>
을 앞에서 복사한 연결 문자열로 바꿉니다.
mvn compile & mvn package & mvn exec:java -Dexec.mainClass="com.webpubsub.quickstart.App" -Dexec.cleanupDaemonThreads=false -Dexec.args="<Web-PubSub-connection-string> 'myHub1'"
2. 서비스 SDK를 사용하여 메시지 게시
Azure Web PubSub SDK를 사용하여 연결된 클라이언트에 메시지를 게시하는 게시자를 만듭니다. 이 프로젝트에서는 다른 명령 셸을 열어야 합니다.
먼저 publisher
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
mkdir publisher
cd publisher
dotnet new console
dotnet add package Azure.Messaging.WebPubSub
WebPubSubServiceClient
클래스를 사용하여 클라이언트에 메시지를 보내도록 Program.cs
파일을 업데이트합니다.
using System;
using System.Threading.Tasks;
using Azure.Messaging.WebPubSub;
namespace publisher
{
class Program
{
static async Task Main(string[] args)
{
if (args.Length != 3) {
Console.WriteLine("Usage: publisher <connectionString> <hub> <message>");
return;
}
var connectionString = args[0];
var hub = args[1];
var message = args[2];
// Either generate the token or fetch it from server or fetch a temp one from the portal
var serviceClient = new WebPubSubServiceClient(connectionString, hub);
await serviceClient.SendToAllAsync(message);
}
}
}
SendToAllAsync()
를 호출하면 허브에 있는 모든 연결된 클라이언트에 메시지가 전송됩니다.
다음 명령을 실행하여 메시지를 보냅니다. <Web-PubSub-connection-string>
을 앞에서 복사한 연결 문자열로 바꿉니다.
dotnet run <Web-PubSub-connection-string> "myHub1" "Hello World"
구독자의 명령 셸이 메시지를 수신하는지 확인합니다.
Message received: Hello World
먼저 publisher
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
mkdir publisher
cd publisher
npm init -y
npm install --save @azure/web-pubsub
Azure Web PubSub SDK를 사용하여 서비스에 메시지를 게시합니다. 다음 코드가 포함된 publish.js
파일을 만듭니다.
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
const hub = "pubsub";
let service = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, hub);
// by default it uses `application/json`, specify contentType as `text/plain` if you want plain-text
service.sendToAll(process.argv[2], { contentType: "text/plain" });
service.sendToAll()
를 호출하면 허브에 있는 모든 연결된 클라이언트에 메시지가 전송됩니다.
메시지를 보내려면 <Web-PubSub-connection-string>
을 이전에 복사한 연결 문자열로 바꾼 후 다음 명령을 실행합니다. Windows 명령 셸을 사용하는 경우 export
대신 set
를 사용할 수 있습니다.
export WebPubSubConnectionString=<Web-PubSub-connection-string>
node publish "Hello World"
구독자가 다음 메시지를 수신한 것을 볼 수 있습니다.
Message received: Hello World
먼저 publisher
라는 프로젝트 디렉터리를 만들고 필요한 종속성을 설치합니다.
mkdir publisher
cd publisher
# Create venv
python -m venv env
# Active venv
source ./env/bin/activate
pip install azure-messaging-webpubsubservice
Azure Web PubSub SDK를 사용하여 서비스에 메시지를 게시합니다. 다음 코드가 포함된 publish.py
파일을 만듭니다.
import sys
from azure.messaging.webpubsubservice import WebPubSubServiceClient
if __name__ == '__main__':
if len(sys.argv) != 4:
print('Usage: python publish.py <connection-string> <hub-name> <message>')
exit(1)
connection_string = sys.argv[1]
hub_name = sys.argv[2]
message = sys.argv[3]
service = WebPubSubServiceClient.from_connection_string(connection_string, hub=hub_name)
res = service.send_to_all(message, content_type='text/plain')
print(res)
send_to_all()
은 메시지를 허브에서 연결된 모든 클라이언트에 보냅니다.
메시지를 보내려면 <Web-PubSub-connection-string>
을 이전에 복사한 연결 문자열로 바꾼 후 다음 명령을 실행합니다.
python publish.py <Web-PubSub-connection-string> "myHub1" "Hello World"
이전 명령 셸에서 구독자가 메시지를 수신했는지 확인합니다.
Received message: Hello World
pubsub
디렉터리로 이동합니다. Maven을 사용하여 게시지 콘솔 앱 webpubsub-quickstart-publisher
를 만들고 webpubsub-quickstart-publisher 디렉터리로 이동합니다.
mvn archetype:generate --define interactiveMode=n --define groupId=com.webpubsub.quickstart --define artifactId=webpubsub-quickstart-publisher --define archetypeArtifactId=maven-archetype-quickstart --define archetypeVersion=1.4
cd webpubsub-quickstart-publisher
다음과 같이 pom.xml
의 dependencies
노드에 Azure Web PubSub SDK 종속성을 추가합니다.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-webpubsub</artifactId>
<version>1.0.0</version>
</dependency>
Azure Web PubSub SDK를 사용하여 서비스에 메시지를 게시합니다. /src/main/java/com/webpubsub/quickstart 디렉터리로 이동하고, 편집기에서 App.java 파일을 열고, 콘텐츠를 다음 코드로 바꿉니다.
package com.webpubsub.quickstart;
import com.azure.messaging.webpubsub.*;
import com.azure.messaging.webpubsub.models.*;
/**
* Publish messages using Azure Web PubSub service SDK
*
*/
public class App
{
public static void main( String[] args )
{
if (args.length != 3) {
System.out.println("Expecting 3 arguments: <connection-string> <hub-name> <message>");
return;
}
WebPubSubServiceClient service = new WebPubSubServiceClientBuilder()
.connectionString(args[0])
.hub(args[1])
.buildClient();
service.sendToAll(args[2], WebPubSubContentType.TEXT_PLAIN);
}
}
sendToAll()
를 호출하면 허브에 있는 모든 연결된 클라이언트에 메시지가 전송됩니다.
메시지를 보내려면 webpubsub-quickstart-publisher 디렉터리로 이동하고 다음 명령을 사용하여 프로젝트를 실행합니다. <Web-PubSub-connection-string>
을 앞에서 복사한 연결 문자열로 바꿉니다.
mvn compile & mvn package & mvn exec:java -Dexec.mainClass="com.webpubsub.quickstart.App" -Dexec.cleanupDaemonThreads=false -Dexec.args="<Web-PubSub-connection-string> 'myHub1' 'Hello World'"
구독자가 다음 메시지를 수신한 것을 볼 수 있습니다.
Message received: Hello World
정리
이 빠른 시작에서 만든 리소스를 포함하는 리소스 그룹을 삭제하여 리소스를 삭제할 수 있습니다.
az group delete --name myResourceGroup --yes
Azure Cloud Shell을 계속 사용할 계획이 없는 경우 연결된 스토리지 계정이 포함된 리소스 그룹을 삭제하여 비용이 누적되는 것을 방지할 수 있습니다. 리소스 그룹의 이름은 cloud-shell-storage-<your-region>
입니다. 다음 명령을 실행하고 <CloudShellResourceGroup>
을 Cloud Shell 그룹 이름으로 바꿉니다.
az group delete --name <CloudShellResourceGroup> --yes
주의
리소스 그룹을 삭제하면 이 자습서의 범위 외부에서 만든 리소스를 비롯한 모든 리소스가 삭제됩니다.
다음 단계
이 자습서에서는 Web PubSub 서비스에 연결하고 연결된 클라이언트에 메시지를 게시하는 방법에 대한 기본 개념을 알아보았습니다.
다른 자습서를 확인하여 서비스 사용 방법을 자세히 알아보세요.