๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ‘จ‍๐Ÿ’ป web.dev/fe

Server Sent Events ์ ์šฉํ•ด๋ณด๊ธฐ

by HandHand 2024. 3. 10.

 

 

๐Ÿ“Œ SSE vs Web Socket

์ž‘๋…„์— ์„œ์šธ์ฝ˜ ํ–‰์‚ฌ๋ฅผ ์œ„ํ•œ ์ฑ—๋ด‡ ์„œ๋น„์Šค ๋งŒ๋“ค๋ฉด์„œ Server Sent Events ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ์ง€ ์ง์ ‘ ์ ์šฉํ•ด ๋ณธ ์ ์€ ์—†์—ˆ๋Š”๋ฐ, ๊ฐ„๋‹จํžˆ ์–ด๋–ค ํ”„๋กœํ† ์ฝœ์ธ์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ์„  Server Sent Events ์™€ Web Socket๊ณผ ์–ด๋–ค ์ฐจ์ด์ ์ด ์กด์žฌํ•˜๋Š”์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

https://softwaremill.com/sse-vs-websockets-comparing-real-time-communication-protocols/

 

์ฑ—๋ด‡ ์„œ๋น„์Šค๋Š” ํŠน์„ฑ์ƒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜๊ณ  UTF-8 ํ…์ŠคํŠธ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— Server Sent Events ๋กœ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.
EventSource ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ ๋ฐฉ๋ฒ•๊ณผ ๊ด€๋ จ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ๊ธฐ์กด EventSource์˜ ํ•œ๊ณ„์ 

1๏ธโƒฃ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์˜ ์–ด๋ ค์›€

ํ‘œ์ค€ EventSource ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํŒจ ํ˜น์€ ์„œ๋ฒ„ ์—๋Ÿฌ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์ด๋Š” EventSource ์˜ error ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ธ์ž๋กœ Event ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

onerror = (this: EventSource, ev: Event) => any

 

์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ๊ฐ€์ง€๊ณ ๋Š” ํŠน์ • ์—๋Ÿฌ์˜ ์ƒํƒœ์ฝ”๋“œ, ๋ฉ”์‹œ์ง€ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‚

2๏ธโƒฃ ์ธ์ฆ ์ฒ˜๋ฆฌ์˜ ์–ด๋ ค์›€

์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์„œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์ƒ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด withCredentials ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋งŒ์•ฝ Authorization ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด EventSource ๋Š” ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ์‹œ HTTP ํ—ค๋”๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ํ•œ๊ณ„๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ Fetch API ๊ธฐ๋ฐ˜์˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ์ˆ˜์‹ 

์œ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” EventSource ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  fetch+TextDecoder ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ผํ•œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fetch API ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— HTTP ํ—ค๋”๋‚˜ ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ƒํƒœ๊ฐ’ ๊ตฌ๋ถ„ ๋ฐ ์—๋Ÿฌ ํด๋ž˜์Šค ๋ถ„๊ธฐ์ฒ˜๋ฆฌ ๋“ฑ์„ ์œ ์—ฐํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NPM ํŒจํ‚ค์ง€ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

์ง์ ‘ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ž˜ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š” ์˜คํ”ˆ์†Œ์Šค ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํŒจํ‚ค์ง€์ค‘์—์„œ 2๊ฐ€์ง€๊ฐ€ ๊ฐ€์žฅ ๋ˆˆ์— ๋„์—ˆ์Šต๋‹ˆ๋‹ค.

 

- fetch-event-source

microsoft์—์„œ ๊ฐœ๋ฐœํ•œ ํŒจํ‚ค์ง€๋ผ ๊ตฌํ˜„ ์ˆ˜์ค€์— ๋Œ€ํ•œ ์‹ ๋ขฐ๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ ํ˜„์žฌ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ™œ๋ฐœํžˆ ์ง„ํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

Azure/fetch-event-source: A better API for making Event Source requests, with all the features of fetch()

 

GitHub - Azure/fetch-event-source: A better API for making Event Source requests, with all the features of fetch()

A better API for making Event Source requests, with all the features of fetch() - Azure/fetch-event-source

github.com

 

- eventsource

Node.js์™€ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ์œ„ํ•œ isomorphic polyfill ์ด๋ฉด์„œ header์™€ error์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ํ™•์žฅ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.

EventSource๋ฅผ ํ†ตํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ํ•ด๋‹น ์—”๋“œํฌ์ธํŠธ๋กœ http ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋‚˜ ๋‚ด/์™ธ๋ถ€ ์„œ๋ฒ„ ์—๋Ÿฌ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ ํ—ฌ์Šค์ฒดํฌ ๋กœ์ง์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

fetch-event-source ํŒจํ‚ค์ง€๋ณด๋‹ค ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ๊ณ  ์›น ํ‘œ์ค€ ์ŠคํŽ™์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

 

https://github.com/EventSource/eventsource

 

GitHub - EventSource/eventsource: EventSource client for Node.js and Browser (polyfill)

EventSource client for Node.js and Browser (polyfill) - EventSource/eventsource

github.com

 

๐Ÿค” ๋‘˜ ์ค‘ ์–ด๋Š ๊ฑธ ์„ ํƒํ•˜์ง€?

๋‘ ํŒจํ‚ค์ง€ ๋ชจ๋‘ ์š”์ฒญ ์ทจ์†Œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ ํ•ธ๋“ค๋ง์€ ์›น ํ‘œ์ค€ Response ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” fetch-event-source ๊ฐ€ ๋” ์œ ์—ฐํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์˜€๊ณ ,

fetch-event-source ๋Š” ์š”์ฒญ ์žฌ์‹œ๋„ ๊ธฐ๋Šฅ์„ ํ•จ๊ป˜ ์ œ๊ณตํ•ด ์ค€๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ์— ๋”ฐ๋ผ ์ตœ์ข…์ ์œผ๋กœ fetch-event-source ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๊ณ , ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜ ์ œํ•œ์€ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“Œ ์ŠคํŠธ๋ฆฌ๋ฐ ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ๋“ค

๋ฐ์ดํ„ฐ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐ ํ•  ๋•Œ์—๋Š” ์˜ˆ์™ธ๋ฅผ ๋น„๋กฏํ•ด์„œ ๊ณ ๋ คํ•  ์—ฌ๋Ÿฌ ๋ถ€๋ถ„๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ด ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๊ธฐ ์ „์— ํ˜„์žฌ API ๊ตฌ์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฑ—๋ด‡ API๋Š” ์ตœ์ดˆ ์š”์ฒญ ์‹œ streamId ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ , ์ดํ›„ ๋Œ€ํ™”๋งฅ๋ฝ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

streamId ๋ฅผ ํ†ตํ•ด์„œ ๋Œ€ํ™” ๋งฅ๋ฝ์„ ๊ตฌ๋ถ„ ๋ฐ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์š”์ฒญ -> stream id ์ˆ˜์‹  -> Text, Content ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  -> End ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 

 

 

์ฑ—๋ด‡ API๋Š” Text ์™€ Content ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋“ค์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ์ ํ•ฉํ•œ ๋‹ต๋ณ€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๋ณ„๋กœ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•  ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

1๏ธโƒฃ ์—๋Ÿฌ ์ƒํ™ฉ ๋ถ„๋ฅ˜ํ•˜๊ธฐ

์ด์ œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์—๋Ÿฌ ์ƒํ™ฉ๋“ค์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์žฌ์‹œ๋„ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ (Retriable)
  • ์žฌ์‹œ๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ (Fatal)
  • ์žฌ์‹œ๋„ NํšŒ ํ–ˆ์Œ์—๋„ ์‹คํŒจํ•œ ๊ฒฝ์šฐ (Maximum Retrial Exceed)
  • ํŠน์ • N์ดˆ ๋™์•ˆ ๋‹ต๋ณ€์ด ์ˆ˜์‹ ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํƒ€์ž„์•„์›ƒ (Timeout)
  • ๋„คํŠธ์›Œํฌ ์ด์Šˆ๋กœ ์ธํ•œ fetch ์š”์ฒญ ์‹คํŒจ (Network Error)

์ด์™ธ์— ๊ตฌํ˜„ ์š”๊ตฌ์กฐ๊ฑด์— ๋”ฐ๋ผ์„œ ๋ณด๋‹ค ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ์ƒํ™ฉ์„ ์ •๋ฆฌํ•˜๊ณ  ๊ธฐํš์ž๋ถ„๊ณผ ํ˜‘์˜ํ•˜์—ฌ ๋Œ€์‘ ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

 

2๏ธโƒฃ ์—๋Ÿฌ ๋ฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ ์„ธ๋ถ„ํ™”ํ•˜๊ธฐ

์•ž์„œ ์ •์˜ํ•œ ์—๋Ÿฌ ์ƒํ™ฉ์— ๋”๋ถˆ์–ด API ์š”์ฒญ์„ ์ค‘์ง€ํ•˜๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ด๋ฒˆ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ์‹œ ์ •์˜ํ–ˆ๋˜ ์ •์ฑ…๋“ค์˜ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

API์—์„œ ๋ฐœ์ƒํ•œ ์žฌ์‹œ๋„ ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ

  • ์ด ๊ฒฝ์šฐ ์ตœ๋Œ€ N๋ฒˆ ์žฌ์‹œ๋„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • ๋งŒ์•ฝ N๋ฒˆ ์ดํ›„์—๋„ ์‹คํŒจํ•œ๋‹ค๋ฉด, MAX_RETRY_EXCEED ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์—๋Ÿฌ UI๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

API์—์„œ ๋ฐœ์ƒํ•œ ์žฌ์‹œ๋„ ๋ถˆ๊ฐ€๋Šฅํ•œ ์—๋Ÿฌ

  • ์š”์ฒญ์ด ์ž˜๋ชป๋œ ํ˜•์‹์ธ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ ์žฌ์‹œ๋„ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • FATAL_ERROR๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์—๋Ÿฌ UI๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

API ์‘๋‹ต์ด ์˜ฌ๋ฐ”๋ฅด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ

  • API ์š”์ฒญ ์‹œ ์„œ๋ฒ„ ์ด์Šˆ๋กœ ์‘๋‹ต ์‹œ์ž‘ ์งํ›„ stream id ์ˆ˜์‹  ์ดํ›„์— ์•„๋ฌด๋Ÿฐ ์‘๋‹ต์ด ์—†๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์œผ๋กœ ์ธํ•ด ๋‹ต๋ณ€ ์ˆ˜์‹ ์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•œ๋‹ค.
  • ์ตœ๋Œ€ N์ดˆ ๋™์•ˆ ์œ ํšจํ•œ ๋ฉ”์‹œ์ง€ ํƒ€์ž…์ธ Text, Content, End ํƒ€์ž…์˜ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • N์ดˆ ์ดํ›„์—๋Š” TIMEOUT ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—๋Ÿฌ UI๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

API ์‘๋‹ต์„ ์ค‘์ง€ํ•œ ๊ฒฝ์šฐ

  • ๋งŒ์•ฝ ๋„คํŠธ์›Œํฌ๊ฐ€ ์ง€์—ฐ๋œ ์ƒํƒœ๋ผ๋ฉด ์•„์ง fetch ์š”์ฒญ์„ ๋ณด๋‚ด์ง€ ๋ชปํ•œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— abort ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • fetch ์š”์ฒญ์€ ์„ฑ๊ณต์ ์œผ๋กœ ๋˜์—ˆ๊ณ  ์‘๋‹ต์„ ์ˆ˜์‹  ์ค‘์ธ ์ƒํƒœ๋ผ๋ฉด ๋‹ต๋ณ€ ์ค‘์ง€ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ŠคํŠธ๋ฆผ์„ ์ข…๋ฃŒํ•œ๋‹ค.

๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ

  • ๋„คํŠธ์›Œํฌ ๋ฏธ์—ฐ๊ฒฐ ํ˜น์€ gateway ์ด์Šˆ๋กœ ์ธํ•ด ์š”์ฒญ ์ž์ฒด๋ฅผ ๋ณด๋‚ด์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์ด๋‹ค.
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ์„ ์œ„ํ•œ ์—๋Ÿฌ UI๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

 

๋ฐ˜์‘ํ˜•

๐Ÿ’ฌ ๋Œ“๊ธ€