Getting Started
+

ํ‚ค์›€ OpenAPI ์•ฑ ํ‚ค์™€ ์‹œํฌ๋ฆฟ ํ‚ค๋Š” ์–ด๋–ป๊ฒŒ ๋ฐœ๊ธ‰๋ฐ›๋‚˜์š”?

ํ‚ค์›€์ฆ๊ถŒ ์˜์›…๋ฌธ ํ™ˆํŽ˜์ด์ง€์˜ Open API ์„น์…˜์—์„œ ์•ฑ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐœ๊ธ‰ ์ ˆ์ฐจ:

1. ํ‚ค์›€์ฆ๊ถŒ ํ™ˆํŽ˜์ด์ง€์— ๋กœ๊ทธ์ธ
2. Open API > API ์‹ ์ฒญ ๋ฉ”๋‰ด๋กœ ์ด๋™
3. ์•ฑ ์ด๋ฆ„๊ณผ ์šฉ๋„๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ์‹ ์ฒญ
4. ์Šน์ธ ํ›„ ์•ฑ ํ‚ค(App Key)์™€ ์‹œํฌ๋ฆฟ ํ‚ค(Secret Key)๋ฅผ ํ™•์ธ

๋ฐœ๊ธ‰๋ฐ›์€ ํ‚ค๋Š” ์™ธ๋ถ€์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์„ธ์š”. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋‚˜ KeyVault ๋“ฑ์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
+

์ง€์›ํ•˜๋Š” .NET ๋ฒ„์ „์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

.NET 6.0 ์ด์ƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

.NET STANDARD 2.0, 2.1, .NET 6, 7, 8, 10 ๋ชจ๋‘ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

+

NuGet ํŒจํ‚ค์ง€๋Š” ์–ด๋–ป๊ฒŒ ์„ค์น˜ํ•˜๋‚˜์š”?

๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

.NET CLI:

dotnet add package KiwoomRestApi.Net

NuGet ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž ์ฝ˜์†”:

PM> Install-Package KiwoomRestApi.Net
+

๋ชจ์˜ํˆฌ์ž์™€ ์‹ค๊ฑฐ๋ž˜์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ ์‹œ isMock ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค:

/* ๋ชจ์˜ํˆฌ์ž (ํ…Œ์ŠคํŠธ์šฉ) */ var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: true); /* ์‹ค๊ฑฐ๋ž˜ */ var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: false);

๋ชจ์˜ํˆฌ์ž ๋ชจ๋“œ์—์„œ๋Š” ์ผ๋ถ€ API(์ถœ๊ธˆ, ํŠน์ • ๊ณ„์ขŒ ์กฐํšŒ ๋“ฑ)๊ฐ€ ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ์˜ํˆฌ์ž์™€ ์‹ค๊ฑฐ๋ž˜๋Š” ๊ฐ๊ฐ ๋ณ„๋„์˜ ์•ฑ ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก API ์—ฐ๋™ ์—†์ด ๋งค๋งค ์ „๋žต๋งŒ ๊ฐ€๋ณ๊ฒŒ ๊ฒ€์ฆํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ๋ชจ์˜ํˆฌ์ž ๊ฒŒ์ž„ ํ”Œ๋žซํผ ox64.app๋„ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.
Authentication
+

์ ‘๊ทผ ํ† ํฐ์€ ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋˜๋‚˜์š”?

๋„ค. KiwoomRestApiClient.Create ๋˜๋Š” CreateAsync๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž๋™์œผ๋กœ OAuth 2.0 ์ ‘๊ทผ ํ† ํฐ์ด ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋‚ด๋ถ€์—์„œ ํ† ํฐ์„ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

/* Create ์‹œ ์ž๋™์œผ๋กœ ํ† ํฐ ๋ฐœ๊ธ‰ */ var client = KiwoomRestApiClient.Create(appKey, secretKey, isMock: true); /* ํ† ํฐ ์ˆ˜๋™ ์ ‘๊ทผ */ var token = client.Token;
+

ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

ํ‚ค์›€ REST API์˜ ์ ‘๊ทผ ํ† ํฐ์€ ๋ฐœ๊ธ‰ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ GetAccessTokenAsync๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

API Usage
+

ํŽ˜์ด์ง€๋„ค์ด์…˜์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋‚˜์š”?

๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” ์‘๋‹ต์˜ ContYn๊ณผ NextKey๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

var result = await client.Chart.GetTickChartsAsync("005930", 1, false); if (result.ContYn) { client.ContYn = true; client.NextKey = result.NextKey; var nextPage = await client.Chart.GetTickChartsAsync("", 1, false); }
+

API ํ˜ธ์ถœ ์†๋„ ์ œํ•œ์ด ์žˆ๋‚˜์š”?

ํ‚ค์›€ REST API์—๋Š” ์ดˆ๋‹น ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

PagingDelay ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ์‹œ ์ž๋™์œผ๋กœ ์ง€์—ฐ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

client.PagingDelay = 1000; // ํŽ˜์ด์ง€ ๊ฐ„ 1์ดˆ ์ง€์—ฐ
+

์–ด๋–ค Enum ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

๋ชจ๋“  API ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํƒ€์ž… ์•ˆ์ „ํ•œ Enum์œผ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ฐ API ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋งž๋Š” Enum์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

/* ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„ Enum */ using KiwoomRestApi.Net.Enums.Account; using KiwoomRestApi.Net.Enums.StockInfo; using KiwoomRestApi.Net.Enums.Order; using KiwoomRestApi.Net.Enums.Chart; // ... ๊ธฐํƒ€

์ „์ฒด Enum ๋ชฉ๋ก์€ API Reference์˜ Enums ์„น์…˜์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

+

๋ชจ์˜ํˆฌ์ž์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” API๊ฐ€ ์žˆ๋‚˜์š”?

๋„ค, ์ผ๋ถ€ API๋Š” ๋ชจ์˜ํˆฌ์ž ๋ชจ๋“œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค:

๋ชจ์˜ํˆฌ์ž ๋ฏธ์ง€์› API ์˜ˆ์‹œ:

• ์ถœ๊ธˆ ๊ฐ€๋Šฅ ๊ธˆ์•ก ์กฐํšŒ (GetAvailableWithdrawalAmountsAsync)
• ์œ„ํƒ๊ณ„์ขŒ ์ฒด๊ฒฐ๋‚ด์—ญ ์กฐํšŒ (GetConsignedTransactionsAsync)
• ์‹ ์šฉ์œต์ž์ฃผ๋ฌธ ์กฐํšŒ (GetCreditDepositOrdersAsync)
• ๋Œ€์ถœ/์‹ ์šฉ ๊ด€๋ จ API
• ๊ธˆํ˜„๋ฌผ ์ฃผ๋ฌธ (Gold Spot ์ฃผ๋ฌธ/์ˆ˜์ •/์ทจ์†Œ)

API Reference์—์„œ no mock ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” API๋Š” ๋ชจ์˜ํˆฌ์ž์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
WebSocket / Real-time
+

WebSocket ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๋‚˜์š”?

REST API ํด๋ผ์ด์–ธํŠธ์—์„œ ํ† ํฐ์„ ๊ฐ€์ ธ์™€ WebSocket ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ๊ตฌ๋…ํ•  ์„œ๋น„์Šค์™€ ์ข…๋ชฉ ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:

var socketClient = KiwoomSocketClient.Create(client.Token, isMock: true); /* ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก */ socketClient.OnRealtimeStockTradeReceived += (data) => { // ์ฒด๊ฒฐ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ }; /* ๊ตฌ๋… ์‹œ์ž‘ */ await socketClient.WebSocket.SubscribeAsync( serviceNames: [KiwoomWebSocketServiceName.StockTrade], parameters: ["005930"], groupId: "1" );
+

์–ด๋–ค ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋‹ค์Œ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

StockTrade — ์ฃผ์‹ ์ฒด๊ฒฐ ๋ฐ์ดํ„ฐ
OrderBook — ์ฃผ์‹ ํ˜ธ๊ฐ€
Balance — ์ž”๊ณ 
OrderTrade — ์ฃผ๋ฌธ ์ฒด๊ฒฐ
ViEvent — VI ๋ฐœ๋™
EtfNav — ETF NAV
ElwTheoreticalPrice — ELW ์ด๋ก ๊ฐ€
ElwIndicator — ELW ์ง€ํ‘œ
StockInfo — ์ฃผ์‹ ๊ธฐ๋ณธ ์ •๋ณด
BestQuote — ์šฐ์„ ํ˜ธ๊ฐ€
StockTrend — ์ฃผ์‹ ์ถ”์ด
ExpectedTrade — ์˜ˆ์ƒ ์ฒด๊ฒฐ
IndustryIndex — ์—…์ข… ์ง€์ˆ˜
IndustryChange — ์—…์ข… ๋“ฑ๋ฝ
ProgramTransaction — ํ”„๋กœ๊ทธ๋žจ ๋งค๋งค
DailyBroker — ์ผ์ค‘ ์ฆ๊ถŒ์‚ฌ
MarketOpenTime — ์žฅ์‹œ์ž‘ ์‹œ๊ฐ„
AfterMarketQuote — ์ฃผ์‹์‹œ๊ฐ„์™ธํ˜ธ๊ฐ€
InternationalGoldPrice — ๊ตญ์ œ๊ธˆํ™˜์‚ฐ๊ฐ€๊ฒฉ

+

WebSocket ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

WebSocket ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ด๋ฒคํŠธ ์ˆ˜์‹ ์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ž๋™ ์žฌ์—ฐ๊ฒฐ ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

try { await socketClient.WebSocket.SubscribeAsync(...); } catch (WebSocketException) { // ์žฌ์—ฐ๊ฒฐ ๋กœ์ง await Task.Delay(TimeSpan.FromSeconds(5)); socketClient = KiwoomSocketClient.Create(client.Token, isMock); await socketClient.WebSocket.SubscribeAsync(...); }
Trading
+

์‹œ์žฅ๊ฐ€์™€ ์ง€์ •๊ฐ€ ์ฃผ๋ฌธ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

TransactionType ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค:

/* ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ - ์ฆ‰์‹œ ์ฒด๊ฒฐ */ await client.Order.PlaceOrderAsync( orderType: KiwoomOrderType.Buy, domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx, stockCode: "005930", orderQuantity: 10, transactionType: KiwoomOrderTransactionType.Market ); /* ์ง€์ •๊ฐ€ ์ฃผ๋ฌธ - ํŠน์ • ๊ฐ€๊ฒฉ์— ์ฒด๊ฒฐ */ await client.Order.PlaceOrderAsync( orderType: KiwoomOrderType.Buy, domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx, stockCode: "005930", orderQuantity: 10, transactionType: KiwoomOrderTransactionType.Normal, orderPrice: 75000 );
+

์ฃผ๋ฌธ์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๋„ค, ๋ฏธ์ฒด๊ฒฐ ์ฃผ๋ฌธ์— ๋Œ€ํ•ด ์ทจ์†Œ ๋ฐ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

/* ์ฃผ๋ฌธ ์ทจ์†Œ */ await client.Order.CancelOrderAsync( domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx, originalOrderId: "์ฃผ๋ฌธ๋ฒˆํ˜ธ", stockCode: "005930", cancelQuantity: 5 ); /* ์ฃผ๋ฌธ ์ˆ˜์ • (์ˆ˜๋Ÿ‰, ๊ฐ€๊ฒฉ ๋ณ€๊ฒฝ) */ await client.Order.ModifyOrderAsync( domesticStockExchangeType: KiwoomOrderDomesticStockExchangeType.Krx, originalOrderId: "์ฃผ๋ฌธ๋ฒˆํ˜ธ", stockCode: "005930", modifyQuantity: 15, modifyPrice: 76000 );
+

๊ธˆํ˜„๋ฌผ ๊ฑฐ๋ž˜๋„ ์ง€์›ํ•˜๋‚˜์š”?

๋„ค, ๊ธˆํ˜„๋ฌผ ๊ฑฐ๋ž˜๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

/* ๊ธˆํ˜„๋ฌผ ๋งค์ˆ˜ */ await client.Order.GoldSpotPlaceOrderAsync( orderType: KiwoomOrderType.Buy, stockCode: KiwoomGoldSpotStockCode.MiniGold_100g, orderQuantity: 1, transactionType: KiwoomOrderGoldSpotTransactionType.Normal ); /* ๊ธˆํ˜„๋ฌผ ์ž”๊ณ  ์กฐํšŒ */ await client.Account.GetGoldEvaluationBalancesAsync();
๊ธˆํ˜„๋ฌผ ๊ฑฐ๋ž˜๋Š” ๋ชจ์˜ํˆฌ์ž ๋ชจ๋“œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Troubleshooting
+

"์ ‘๊ทผํ† ํฐ ๋ฐœ๊ธ‰์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜์„ธ์š”:

• ์•ฑ ํ‚ค์™€ ์‹œํฌ๋ฆฟ ํ‚ค๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
• ๋ชจ์˜ํˆฌ์ž/์‹ค๊ฑฐ๋ž˜์— ๋งž๋Š” ํ‚ค๋ฅผ ์‚ฌ์šฉ ์ค‘์ธ์ง€ ํ™•์ธ
• ํ‚ค์›€์ฆ๊ถŒ์—์„œ API ์Šน์ธ์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
• ์•ฑ ํ‚ค์— ๊ณต๋ฐฑ์ด ํฌํ•จ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ

+

API ํ˜ธ์ถœ ์‹œ "์กฐํšŒ๊ฐ€๋Šฅํ•œ ๊ฑด์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜์˜€์Šต๋‹ˆ๋‹ค" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค์›€ REST API์˜ ํ˜ธ์ถœ ํšŸ์ˆ˜ ์ œํ•œ์„ ์ดˆ๊ณผํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

• API ํ˜ธ์ถœ ์‚ฌ์ด์— ์ ์ ˆํ•œ ์ง€์—ฐ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”
PagingDelay ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฐ„ ์ง€์—ฐ์„ ์„ค์ •ํ•˜์„ธ์š”
• ๋ถˆํ•„์š”ํ•œ API ํ˜ธ์ถœ์„ ์ค„์ด์„ธ์š”

+

์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ null๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

IsSuccess๊ฐ€ true์ธ์ง€ ํ™•์ธ
• ์กฐํšŒ ์กฐ๊ฑด(๋‚ ์งœ, ์ข…๋ชฉ ์ฝ”๋“œ ๋“ฑ)์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
• ํ•ด๋‹น ๋‚ ์งœ์— ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ (ํœด์ผ, ์žฅ์™ธ ์‹œ๊ฐ„ ๋“ฑ)
• ๋ชจ์˜ํˆฌ์ž ๋ชจ๋“œ์—์„œ ์ง€์›๋˜๋Š” API์ธ์ง€ ํ™•์ธ

+

WebSocket ์ด๋ฒคํŠธ๊ฐ€ ์ˆ˜์‹ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

SubscribeAsync๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
• ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ SubscribeAsync ํ˜ธ์ถœ ์ด์ „์— ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
• ์ข…๋ชฉ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
• ์žฅ ์‹œ๊ฐ„ ์ค‘์ธ์ง€ ํ™•์ธ (์ผ๋ถ€ ์„œ๋น„์Šค๋Š” ์žฅ ์‹œ๊ฐ„์—๋งŒ ๋™์ž‘)
• REST API ํด๋ผ์ด์–ธํŠธ์™€ ๋™์ผํ•œ ๋ชจ์˜ํˆฌ์ž/์‹ค๊ฑฐ๋ž˜ ๋ชจ๋“œ์ธ์ง€ ํ™•์ธ