๐ SSE vs Web Socket
์๋
์ ์์ธ์ฝ ํ์ฌ๋ฅผ ์ํ ์ฑ๋ด ์๋น์ค ๋ง๋ค๋ฉด์ Server Sent Events
๋ฅผ ์ฌ์ฉํด ๋ณผ ๊ธฐํ๊ฐ ์๊ฒผ์ต๋๋ค.
๊ฐ๋ ์ ๋ํด์๋ง ์๊ณ ์์์ง ์ง์ ์ ์ฉํด ๋ณธ ์ ์ ์์๋๋ฐ, ๊ฐ๋จํ ์ด๋ค ํ๋กํ ์ฝ์ธ์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ Server Sent Events
์ Web Socket
๊ณผ ์ด๋ค ์ฐจ์ด์ ์ด ์กด์ฌํ๋์ง ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฑ๋ด ์๋น์ค๋ ํน์ฑ์ ์ค์๊ฐ์ผ๋ก ์๋ฐฉํฅ ํต์ ์ด ํ์ํ์ง ์์๊ณ 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์์ ๊ฐ๋ฐํ ํจํค์ง๋ผ ๊ตฌํ ์์ค์ ๋ํ ์ ๋ขฐ๋๊ฐ ์์ต๋๋ค.
๋ค๋ง ํ์ฌ ์ ์ง๋ณด์๊ฐ ํ๋ฐํ ์งํ๋์ง๋ ์์ต๋๋ค.
- eventsource
Node.js์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ์ํ isomorphic polyfill
์ด๋ฉด์ header์ error์ฒ๋ฆฌ๋ฅผ ์ํ ํ์ฅ์ ์ ๊ณตํด ์ค๋๋ค.
EventSource
๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํด๋น ์๋ํฌ์ธํธ๋ก http ์์ฒญ์ ๋ณด๋ด์ ๋คํธ์ํฌ ์ค๋ฅ๋ ๋ด/์ธ๋ถ ์๋ฒ ์๋ฌ ๋ฑ์ ์ฒ๋ฆฌํ๋ ์ผ์ข
์ ํฌ์ค์ฒดํฌ ๋ก์ง์ ํฌํจํ๊ณ ์์ต๋๋ค.
fetch-event-source
ํจํค์ง๋ณด๋ค ์ฌ์ฉ์๊ฐ ๋ง๊ณ ์น ํ์ค ์คํ์ ์ค์ํฉ๋๋ค.
https://github.com/EventSource/eventsource
๐ค ๋ ์ค ์ด๋ ๊ฑธ ์ ํํ์ง?
๋ ํจํค์ง ๋ชจ๋ ์์ฒญ ์ทจ์ ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๊ณ ์์ต๋๋ค.
์๋ฌ ํธ๋ค๋ง์ ์น ํ์ค 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๋ฅผ ๋ ธ์ถํ๋ค.
'๐จโ๐ป web.dev > fe' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
TRIPLE ์น ์ผ์ ํ ํธ๋ฌ๋ธ ์ํ ํ๊ณ ๋ก (0) | 2024.03.11 |
---|---|
์ ๊ทํํ์๊ณผ ํจ๊ป URL ๋ฏ์ด๋ณด๊ธฐ (0) | 2024.03.01 |
Chrome ๊ฐ๋ฐ์๋๊ตฌ๋ฅผ ์ด์ฉํด์ ์์น์ ๋ณด ์ค์ ํ๊ธฐ (0) | 2024.03.01 |
storybook middleware proxy ๋ก CORS ์ฐํํ๊ธฐ (0) | 2024.03.01 |
์ ๊ท์์ผ๋ก camel-case ํ์ฑํ๊ธฐ (1) | 2024.02.24 |
๐ฌ ๋๊ธ