์ด์ ๊ธ์์ SSE ์ฐ๊ฒฐ ํ ์คํธ๋ฅผ ๋ง์นํ์ ์ค์ ๋ก ๊ฐ๋ฐ์ ์ฐฉ์ํ๋ ๋จ๊ณ๊ฐ ๋์๋ค. ๊ฐ๋ฐ ์ด์ ์ ๋ด๊ฐ ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ๋ํด ์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ค.
1. SSE๋ ๋ธ๋ผ์ฐ์ ํญ๋ง๋ค ์ฐ๊ฒฐ์ด ์๋ก ์ด๋ฆฐ๋ค.
2. ํค๋ ์ปค์คํ ์ด ํ์ํ์ง๋ง SSE์ ๊ฒฝ์ฐ ํค๋ ์ปค์คํ ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์ด ์กฐ๊ฑด์ ๋์์ ๋ง์กฑ์ํค๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ด๋ฒ ์ค์๊ฐ ์๋ฆผ ๊ฐ๋ฐ์ ํต์ฌ ๊ณผ์ ์๋ค.
1. ํญ๋ง๋ค ์๋ก ์ด๋ฆฌ๋ SSE ์ฐ๊ฒฐ ๋ฌธ์
SSE๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ํญ ๋จ์๋ก ์ฐ๊ฒฐ์ด ์์ฑ๋๋ค.
์ฆ, ์ฌ์ฉ์๊ฐ ๊ฐ์ ์๋น์ค์์ ํญ์ 3๊ฐ ์ด๋ฉด ์๋ฒ ์
์ฅ์์๋ SSE ์ฐ๊ฒฐ์ด 3๊ฐ๊ฐ ์ด๋ฆฐ๋ค.
๊ธฐ์ ๊ฒํ ์ด๊ธฐ์๋ ์ด ๋ถ๋ถ์ ํฌ๊ฒ ๋ฌธ์ ์ผ์ง ์์๋ค.
ํ์ง๋ง ์ค์๊ฐ ์๋ฆผ์ ํน์ ํ์ด์ง๊ฐ ์๋๋ผ ํค๋์ ํญ์ ๋ ์์ด์ผ ํ๋ ๊ธฐ๋ฅ์ด์๊ณ , ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉ์๋ ์ฌ๋ฌ ํญ์ ์ด์ด๋ ์ํ์์๋ ๋์ผํ ์๋ฆผ์ ๋์์ ๋ฐ์์ผ ํ๋ค. ์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
- ์๋ฒ ์ ์ฅ์์ ๊ฐ์ ์ ์ ์๊ฒ ์ค๋ณต๋ SSE ์ฐ๊ฒฐ์ด ๊ณ์ ์ด๋ฆฐ๋ค
- ํธ๋ํฝ๊ณผ ์ปค๋ฅ์ ์๊ฐ ์ฌ์ฉ์ ์ × ํญ ์๋งํผ ์ฆ๊ฐํ๋ค
- ์ค์๋น์ค ํ๊ฒฝ์์๋ ๋น์ฉ๊ณผ ์์ ์ฑ ๋ชจ๋์ ๋ถ๋ด์ด ๋๋ค
์ฆ, “ํญ๋ง๋ค SSE๋ฅผ ์ฌ๋ ๊ตฌ์กฐ๋ ๊ธฐ์ ์ ์ผ๋ก๋ ๊ฐ๋จํ์ง๋ง, ์ด์ ์ธก๋ฉด์์๋ ๋งค์ฐ ๋นํจ์จ์ ”์ด๋ผ๋ ๊ฒฐ๋ก ์ ๋๋ฌํ๊ฒ ๋์๋ค.
2. SSE๋ ํค๋ ์ปค์คํ ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ์ ์ฝ
๋ง์ง๋ง์ผ๋ก ๊ฐ์ฅ ํ์ค์ ์ธ ์ ์ฝ์ด ํ๋ ๋ ์์๋ค. ๋ฐ๋ก SSE๋ ๊ธฐ๋ณธ EventSource API๋ก๋ ์ปค์คํ ํค๋๋ฅผ ๋ฃ์ ์ ์๋ค๋ ์ ์ด๋ค.
์ฐ๋ฆฌ ์๋น์ค๋ ์ธ์ฆ ๊ตฌ์กฐ๊ฐ ๋ค์๊ณผ ๊ฐ์๋ค.
- API ์์ฒญ ์ Authorization: Bearer accessToken ํ์
- ์ผ๋ถ ํ๊ฒฝ์์๋ ์ฟ ํค ๊ธฐ๋ฐ ์ธ์ฆ๊ณผ ํค๋ ์ธ์ฆ์ ํจ๊ป ์ฌ์ฉ
ํ์ง๋ง ๊ธฐ๋ณธ EventSource๋ ๋ค์๊ณผ ๊ฐ์ ํ๊ณ๋ฅผ ๊ฐ์ง๋ค.
- Authorization ํค๋๋ฅผ ์ง์ ๋ฃ์ ์ ์์
- ์ฆ, ๊ธฐ์กด ์ธ์ฆ ๋ฐฉ์ ๊ทธ๋๋ก๋ SSE ์ธ์ฆ์ด ๋ถ๊ฐ๋ฅํ ๊ตฌ์กฐ
๋ฌผ๋ก event-source-polyfill ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ํค๋๋ฅผ ์ถ๊ฐํ ์๋ ์์๋ค.
ํ์ง๋ง ์ด ๋ฐฉ์์ 1๋ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ Shared Worker์ ํจ๊ป ์ฌ์ฉํ๊ธฐ์๋ ์ฌ๋ฌ ์ ์ฝ์ด ์กด์ฌํ๋ค.
ํนํ Shared Worker๋
- next.js์์ public ๊ฒฝ๋ก์ ์์ .js ํ์ผ์์ ๋์ํด์ผ ํ๊ณ
- ๋ฒ๋ค๋ง๋ ๋ชจ๋์ import ํ๋ ๊ฒ๋ ์ ํ์ ์ด๋ฉฐ
- ๋ณด์์ ํ ํฐ์ URL query๋ก ๋๊ธฐ๋ ๋ฐฉ์ ์ญ์ ๋ถ๋ด์ด ์ปธ๋ค
๊ฒฐ๊ตญ ๋๋ ์ด๋ ๊ฒ ์ ๋ฆฌํ๊ฒ ๋์๋ค.
“SSE ์ธ์ฆ ๋ฌธ์ ๋ ํด๋ผ์ด์ธํธ์์ ์ต์ง๋ก ํด๊ฒฐํ ๊ฒ ์๋๋ผ, ์ค๊ฐ์์ ํ ๋ฒ ๋ ์ ์ดํ ์ ์๋ ๋ ์ด์ด๊ฐ ํ์ํ๊ฒ ๋ค.”
๊ทธ๋์ ๊ตฌ์กฐ๋ฅผ ‘ํ๋ก์ ๊ธฐ๋ฐ’์ผ๋ก ๋ค์ ๋ณด๊ธฐ ์์ํ๋ค
์ด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ์ข ํฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ๊ฒ ๋๋ค.
- SSE ์ฐ๊ฒฐ์ ๊ฐ๋ฅํ๋ฉด ํ๋๋ง ์ ์งํ๊ณ ์ถ๊ณ
- ์ธ์ฆ ํค๋๋ ์์ ํ๊ฒ ์ค์ด์ ์ ๋ฌํด์ผ ํ๋ค
์ด ๋ ์๊ตฌ์ฌํญ์ ๋์์ ๋ง์กฑ์ํค๊ธฐ ์ํด, ๋๋ SSE๋ฅผ ์ง์ ๋ฐฑ์๋์ ๋ถ์ด๋ ๊ตฌ์กฐ๊ฐ ์๋๋ผ,
์ด์ ๊ธ์์ ๋ฐ์ํ๋ Next.js์ gzip ์ด์ ํด๊ฒฐ์ ์ํด ๊ณ ๋ ค๋์๋ Next.js API Routes๋ฅผ ๊ฑฐ์น๋ ๊ตฌ์กฐ๋ก ๊ฐ์ ธ๊ฐ๊ธฐ๋ก ํ์ ํ๋ค.
โ API Routes๋ฅผ SSE ํ๋ก์๋ก ์ฌ์ฉํ๊ธฐ๋ก ํ ์ด์
Next.js API Routes๋ฅผ ์ค๊ฐ์ ๋๋ ๊ตฌ์กฐ๋ ์ฒ์๋ถํฐ ์๋ํ ์ ํ์ ์๋์๋ค.
ํ์ง๋ง ์ง๊ธ ์์ ๋์๋ณด๋ฉด, ์ด ์ ํ ํ๋๋ก ๋ค์ ๋ฌธ์ ๋ค์ด ํ ๋ฒ์ ์ ๋ฆฌ๋๊ธฐ ์์ํ๋ค.
1๏ธโฃ gzip ์์ถ์ผ๋ก ์ธํด SSE ์ค์๊ฐ์ฑ์ด ๊นจ์ง๋ ๋ฌธ์ ํด๊ฒฐ
๊ธฐ์กด์๋ next.config.js์ rewrites๋ฅผ ํตํด
ํ๋ก ํธ์์ ๋ฐฑ์๋ SSE ์๋ฒ๋ก ์ง์ ์ฐ๊ฒฐํ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
ํ์ง๋ง Next.js์ ๊ธฐ๋ณธ ์ต์ ์ธ compress: true๋ก ์ธํด:
- ์๋ต์ด gzip์ผ๋ก ์์ถ๋๋ฉด์
- ์ถฉ๋ถํ ๋ฐ์ดํฐ๊ฐ ์์ด๊ธฐ ์ ๊น์ง ์๋ต์ด ๋ฒํผ๋ง๋๊ณ
- ๊ทธ ๊ฒฐ๊ณผ SSE์ ์ค์๊ฐ์ฑ์ด ์์ ํ ๊นจ์ง๋ ํ์์ด ๋ฐ์ํ๋ค.
๋ฐ๋ฉด API Routes๋:
- Next.js์ gzip ์์ถ ์์ธ ๊ฒฝ๋ก์ ํด๋นํ๊ณ
- ์คํธ๋ฆฌ๋ฐ ์๋ต์ ๋ฒํผ๋ง ์์ด ๊ทธ๋๋ก ์ ๋ฌํ ์ ์๋ ๊ตฌ์กฐ์๋ค.
์ฆ, API Routes๋ฅผ ํ๋ก์๋ก ์ฌ์ฉํ๋ฉด, gzip ๋ฌธ์ ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ํํผํ ์ ์์๋ค.
2๏ธโฃ SSE ์ธ์ฆ ๋ฌธ์ ๋ฅผ ์๋ฒ ์ฌ์ด๋์์ ํด๊ฒฐํ ์ ์๋ค
์์ ์ธ๊ธํ๋ฏ์ด, ๊ธฐ๋ณธ EventSource๋ Authorization ํค๋๋ฅผ ์ง์ ๋ฃ์ ์ ์๋ค.
ํ์ง๋ง API Routes๋ฅผ ๊ฑฐ์น๊ฒ ๋๋ฉด ์ํฉ์ด ์์ ํ ๋ฌ๋ผ์ง๋ค.
- ํด๋ผ์ด์ธํธ → API Routes ์์ฒญ์๋ ์ฟ ํค๊ฐ ์๋์ผ๋ก ํฌํจ๋๊ณ
- API Routes์์๋ ๊ทธ ์ฟ ํค๋ฅผ ์ฝ์ด
- ๋ฐฑ์๋ SSE ์์ฒญ ์ Authorization: Bearer token ํค๋๋ฅผ ์ง์ ๊ตฌ์ฑํด์ ์ ๋ฌํ ์ ์๋ค.
์ฆ, ํด๋ผ์ด์ธํธ์์๋ ๋ ์ด์ ์ธ์ฆ์ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ด์ง๊ณ , SSE ์ธ์ฆ ๋ก์ง์ ์ ๋ถ ์๋ฒ ์ฌ์ด๋์์ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์๋ค.
3๏ธโฃ ์ดํ Shared Worker ๊ตฌ์กฐ๊น์ง ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์๋ค
๊ทธ๋ฆฌ๊ณ ์ด ๊ตฌ์กฐ๋ ์์ฐ์ค๋ฝ๊ฒ, “SSE ์ฐ๊ฒฐ์ ๋ฌด์กฐ๊ฑด API Routes ํ ๊ณณ์ผ๋ก๋ง ๋ชจ์๋ค”๋ผ๋ ์ ์ ์กฐ๊ฑด์ ๋ง๋ค์ด์ฃผ์๋ค.
์ด ๋ง์ ๊ณง,
- Shared Worker์์ SSE๋ฅผ ์ด๋๋ผ๋
- ํญ์ /api/sse/event๋ผ๋ ํ๋์ ๊ณ ์ ๋ ์๋ํฌ์ธํธ๋ง ๋ฐ๋ผ๋ณด๊ฒ ๋๊ณ
- ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ด๋ป๋ , ํด๋ผ์ด์ธํธ์ ๋ฐฑ์๋ ์ฌ์ด์ ์ ์ ์ ๋จ ํ๋๋ก ์๋ ด๋๋ค.
์ด ๋๋ถ์ ์ดํ์:
- Shared Worker์์ SSE๋ฅผ ํ๋๋ง ์ด๊ณ
- ์ฌ๋ฌ ํญ์ผ๋ก ๋ธ๋ก๋์บ์คํธํ๋ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฐ์๋ ํฐ ๋ฐฉํฅ์ฑ ์์ ์์ด ๊ทธ๋๋ก ํ์ฅํ ์ ์์๋ค.
์ ๋ฆฌํด ๋ณด๋ฉด
Next.js API Routes๋ฅผ SSE ํ๋ก์๋ก ์ฌ์ฉํ๊ธฐ๋ก ํ ๊ฒฐ์ ์, ๋จ์ํ “์ฐํ ๊ฒฝ๋ก๋ฅผ ํ๋ ์ถ๊ฐํ ๊ฒ”์ด ์๋์๋ค.
์ด ์ ํ ํ๋๋ก ์ด ์ธ ๊ฐ์ง๊ฐ ํ ๋ฒ์ ์ ๋ฆฌ๋๊ธฐ ์์ํ๋ค.
- โ gzip์ผ๋ก ์ธํ SSE ์ง์ฐ ๋ฌธ์
- โ SSE ์ธ์ฆ ํค๋ ์ ๋ฌ ๋ฌธ์
- โ Shared Worker ๋จ์ผ ์ฑ๋ ๊ตฌ์กฐ ์ค๊ณ์ ๊ธฐ๋ฐ
์ด์ SSE๋ ํญ์ /api/sse/event๋ฅผ ํตํด์๋ง ์ด๋ฆฌ๊ฒ ๋์๊ณ ,
ํ๋ก ํธ์๋ ์
์ฅ์์๋ “์ธ์ฆ๊ณผ gzip ๋ฌธ์ ๋ ๋ ์ด์ ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋ ์ํ”๊ฐ ๋์๋ค.
ํ์ง๋ง ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๊ฐ ํ๋ ๋จ์ ์์๋ค.
“SSE ์ฐ๊ฒฐ์ ํ๋๋ง ์ ์งํ๊ณ ์ถ๋ค.”
API Routes๊ฐ ์ค๊ฐ์ ์๊ธฐ๋ฉด์ ๊ตฌ์กฐ๋ ์ ๋ฆฌ๋์์ง๋ง, ์ฌ์ ํ ๋ธ๋ผ์ฐ์ ํญ๋ง๋ค /api/sse/event๋ก SSE ์ฐ๊ฒฐ์ ์๋ก ์ด๊ณ ์๋ค๋ ์ฌ์ค ์์ฒด๋ ๋ณํ์ง ์์๋ค.
์ฆ, ๊ตฌ์กฐ๋ ์์ ํด์ก์ง๋ง, ์ฐ๊ฒฐ ์ ์์ฒด๋ฅผ ์ค์ด๋ ๋ฌธ์ ๋ ์์ง ํด๊ฒฐ๋์ง ์์ ์ํ์๋ค.
โ ๊ทธ๋์ ๋ค์ ๋ง์ฃผํ ๋ฌธ์ : “ํญ์ด ์ฌ๋ฌ ๊ฐ๋ฉด SSE๋ ์ฌ๋ฌ ๊ฐ๋ค”
ํ์ค์ ์ธ ์ฌ์ฉ ์๋๋ฆฌ์ค๋ฅผ ๋ค์ ๋ ์ฌ๋ ค ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์๋ค.
- ์ฌ์ฉ์๋ ๋ฉ์ธ ํ๋ฉด์ ์ผ ๋ ์ํ์์
- ์๋ก์ด ๊ธฐ๋ฅ์ ๋ณด๊ฒ ๋ค๊ณ ํญ์ ํ๋ ๋ ์ด๊ณ
- ํ์ํ๋ฉด ๋ ํ๋๋ฅผ ๋ ์ฐ๋ค
UI๋ ์ ๋ถ ๋์ผํ๊ณ ,
ํค๋์๋ ๋์ผํ ์ค์๊ฐ ์๋ฆผ ์ข
์์ด์ฝ์ด ๋ ์๋ค.
ํ์ง๋ง ๊ธฐ์ ์ ์ผ๋ก๋:
- ๊ฐ ํญ์ด ์ ๋ถ ๋ ๋ฆฝ์ ์ผ๋ก /api/sse/event์ ์ฐ๊ฒฐ
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ ์ ์ ๊ฐ ๋์ผํ ์๋ฆผ ์คํธ๋ฆผ์ ์ฌ๋ฌ ๊ฐ๋ก ๋ฐ์๊ฐ๊ณ ์๋ ์ํ
์ด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๋๋ฉด:
- ์๋ฒ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ์ ์ ์๊ฒ ์ฌ๋ฌ ๋ฒ ์ค๋ณต ์ ์ก
- ํด๋ผ์ด์ธํธ๋ ํ์ ์ด์์ผ๋ก ๋์ผํ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฒ๋ฆฌ
- SSE์ ์ฅ์ ์ธ “๊ฐ๋ณ๊ณ ๋จ์ํ ์ค์๊ฐ ์คํธ๋ฆผ”์ด
์คํ๋ ค ๊ตฌ์กฐ์ ์ผ๋ก ๋ฌด๊ฑฐ์์ง๋ ์ํฉ์ด ๋๋ค.
๊ทธ๋์ ์ด ์์ ๋ถํฐ ๊ณ ๋ฏผ์ ์ด๋ ๊ฒ ๋ฐ๋์๋ค.
“SSE ์ฐ๊ฒฐ์ ํญ๋ง๋ค ์ด์ง ๋ง๊ณ , ๋ธ๋ผ์ฐ์ ๋จ์์ ํ๋๋ก ๊ณต์ ํ ์๋ ์์๊น?”
์ด ๋ต์ ๋ํด์๋ ๋ค์ ๋ ํผ๋ฐ์ค๋ฅผ ํตํด์ ๋ํ๊ตฌ๋ฅผ ์ฐพ์ ์ ์์๋ค.
toss slash 24: N๊ฐ์ ํญ, ๋จ ํ๋์ websocket์ ํ๋ ์ค ํ์ ๋ชจ๋ ํญ์ ํผ์ง๋ ์ค์๊ฐ ์ด๋ฒคํธ, SSE 1๊ฐ๋ก ๋๋ด๋ ์ ๋ต ๊ธ์ ํตํด์ worker์ ์กด์ฌ๋ฅผ ํตํด ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ค๋ ํํธ๋ฅผ ์ป์๋ค.

๋ ๊ธ์ ๊ณตํต๋ ํต์ฌ์,Worker๋ฅผ ํ๋ธ๋ก ๋๊ณ ์ค์๊ฐ ์ฐ๊ฒฐ์ ํ๋๋ก ์๋ ด์ํจ๋ค๋ ์ ๋ต์ด์๋ค.
โ Service Worker๊ฐ ์๋, Shared Worker๋ฅผ ์ ํํ ์ด์
Worker๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ฐฉํฅ์ฑ์ ์กํ์ง๋ง, ๋ค์ ์ ํ์ง๋ Service Worker vs Shared Worker์๋ค.
Service Worker๋:
- ์บ์ฑ, ๋คํธ์ํฌ ์ธํฐ์ ํธ, ํธ์ ์๋ฆผ ๋ฑ
- ์ฑ ์ ์ฒด๋ฅผ ๋ํํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ตฌ์กฐ์ ๊ฐ๊น๋ค.
๋ฐ๋ฉด ๋ด๊ฐ ๋ง๋ค๊ณ ์ ํ๋ ๊ตฌ์กฐ๋:
- ์ง๊ธ ์ด๋ ค ์๋ ํญ๋ค๋ผ๋ฆฌ๋ง
- SSE ํ๋๋ฅผ ๊ณต์ ํ๋ ์ค์๊ฐ ํ๋ธ
์ด ์ฑ๊ฒฉ์๋ Shared Worker๊ฐ ํจ์ฌ ์ ๋ง์๋ค.
Shared Worker๋:
- ์ฌ๋ฌ ํญ์ด ํ๋์ ์์ปค๋ฅผ ๊ณต์ ํ ์ ์๊ณ
- ๊ทธ ์์์ SSE ์ฐ๊ฒฐ์ ๋จ ํ๋๋ง ์ ์งํ ์ ์์ผ๋ฉฐ
- ๋ชจ๋ ํญ์ด ๋ซํ๋ฉด ์์ปค๋ ์์ฐ์ค๋ฝ๊ฒ ์ข ๋ฃ๋๋ค.
์ฆ, ์ค์๊ฐ ์๋ฆผ ์ ์ฉ ํ๋ธ ์ญํ ์๋ Service Worker๋ณด๋ค Shared Worker๊ฐ ๋ ์ ์ ํ ์ ํ์ง์๋ค.
๊ทธ๋์ ์ด ์์ ์์ ๋ฐฉํฅ์ ๋ช ํํด์ก๋ค.
“SSE๋ Shared Worker ์์์ ํ๋๋ง ์ด๊ณ , ๊ฐ ํญ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ ๋ณด์ฌ์ฃผ์.”
โ ๋ค๋ง, Shared Worker๋ ‘๋ง๋ฅ ํด๊ฒฐ์ฑ ’์ ์๋์๋ค
Shared Worker๋ ๊ตฌ์กฐ์ ์ผ๋ก๋ ์๋ฒฝํด ๋ณด์์ง๋ง, ์ค์ ๋์ ์ ๊ณ ๋ คํ๋ฉด์ ๋ช ๊ฐ์ง ํ์ค์ ์ธ ์ ์ฝ๋ ํจ๊ป ๋ง์ฃผํ๊ฒ ๋์๋ค.
- ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์์๋ ์ง์์ด ์ ํ์ ์ด๊ณ
- public ๊ฒฝ๋ก์ ์์ .js ํ์ผ์์ ๋ก๋๋์ด์ผ ํ๋ฉฐ
- ๋ฒ๋ค๋ง, ๋ชจ๋ import, ๋๋ฒ๊น ๋ฐฉ์๋ ๊ธฐ์กด๊ณผ๋ ์ ํ ๋ฌ๋๋ค
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ,“SSE ์ฐ๊ฒฐ์ ์ฌ์ฉ์ ๊ธฐ์ค์ผ๋ก ํ๋๋ง ์ ์งํ๋ค”๋ ๋ชฉํ๋ฅผ ๊ฐ์ฅ ์ ํํ๊ฒ ๋ฌ์ฑํ ์ ์๋ ์๋จ์ ์ฌ์ ํ Shared Worker๋ฟ์ด์๋ค.
โBroadcasting Channel๋ก๋ ํด๊ฒฐํ ์ ์์ง ์์๊น?
ํํธ์ผ๋ก๋ ์ด๋ฐ ์๊ฐ๋ ์์ฐ์ค๋ฝ๊ฒ ๋ค์๋ค.
“Broadcasting Channel์ ํตํด ์ฑ๋์ ํ๋๋ง ์ด๊ณ , ๋ฆฌ๋ ํญ์์ ๋ค๋ฅธ ํญ์ผ๋ก ์ค์๊ฐ ์ด๋ฒคํธ ์๋ฆผ์ ๋๊ธฐํํ๋ฉด ๋์ง ์์๊น?”
์ด ๋ฐฉ์ ์ญ์ ์ด๋ก ์ ์ผ๋ก๋ ๊ฐ๋ฅํ๋ค. ํน์ ํญ์ ๋ฆฌ๋ ํญ์ผ๋ก ์ผ์ ๊ทธ ํญ์์๋ง SSE๋ฅผ ์ด๊ณ ,์์ ํ ์ด๋ฒคํธ๋ฅผ Broadcasting Channel์ ํตํด ๋ค๋ฅธ ํญ์ผ๋ก ์ ํํ๋ ๋ฐฉ์์ด๋ค.
ํ์ง๋ง ์ด ๊ตฌ์กฐ๋ ๋ช ํํ ๋จ์ ์ ๊ฐ์ง๊ณ ์์๋ค.
- ๋ฆฌ๋ ํญ์ด ๋ซํ๋ ์๊ฐ SSE ์ฐ๊ฒฐ์ด ํจ๊ป ๋๊ธฐ๊ณ
- ๊ทธ ์ฆ์ ์๋ก์ด ๋ฆฌ๋ ํญ์ ์ ์ถํ๋ ๋ก์ง์ด ์ถ๊ฐ๋ก ํ์ํด์ง๋ค
- ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ตฌ์กฐ๊ฐ ๋จ์ํด์ง๊ธฐ๋ณด๋ค๋ ์คํ๋ ค ๋ ๋ณต์กํด์ง ๊ฐ๋ฅ์ฑ์ด ์ปธ๋ค
์ฆ,“ํญ์ ํ๋์ ์ฑ๋์ ์ ์งํ๋ค”๋ ๋ชฉํ๋ฅผ ์์ ์ ์ผ๋ก ๋ฌ์ฑํ๊ธฐ์๋, Broadcasting Channel ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ ๋ถํ์ ์ฑ์ด ํฐ ์ ํ์ง๋ผ๊ณ ํ๋จํ๊ฒ ๋์๋ค.
๊ทธ๋์ ๋๋ ๊ฒฐ๊ตญ ์ด ์์ ์์ ์ด๋ ๊ฒ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ฒ ๋๋ค.
“PC ํ๊ฒฝ์์๋ Shared Worker๋ก ๋จ์ผ SSE ์ฑ๋์ ๊ตฌ์ฑํ๊ณ , ์ง์ํ์ง ์๋ ํ๊ฒฝ์์๋ ๊ธฐ์กด SSE ๋ฐฉ์์ผ๋ก fallback ์ฒ๋ฆฌํ์.”
์ต์ข ์ํคํ ์ฒ: Shared Worker + Fallback ์ด์ค ๊ตฌ์กฐ
์์ ๊ณ ๋ฏผ๊ณผ ์ ํ์ ๋ฐํ์ผ๋ก,
์ค์๊ฐ ์๋ฆผ ์์คํ
์ ์ต์ข
์ํคํ
์ฒ๋ Shared Worker ๊ธฐ๋ฐ + Fallback ๊ตฌ์กฐ๋ก ์ ๋ฆฌ๋์๋ค.
ํต์ฌ ์ ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- PC ํ๊ฒฝ → Shared Worker๋ฅผ ํตํด SSE ์ฐ๊ฒฐ 1๊ฐ๋ง ์ ์ง
- Shared Worker ๋ฏธ์ง์ ํ๊ฒฝ(๋ชจ๋ฐ์ผ ๋ฑ) → ๊ธฐ์กด ๋ฐฉ์๋๋ก ํญ๋ง๋ค SSE ์ง์ ์ฐ๊ฒฐ
์ด๋ ๊ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด:
- ์ฑ๋ฅ๊ณผ ๋น์ฉ์ด ์ค์ํ PC ํ๊ฒฝ์์๋ ๊ฐ์ฅ ์ด์์ ์ธ ๊ตฌ์กฐ
- ํธํ์ฑ์ด ์ค์ํ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์๋ ์์ ์ฑ์ด ์ฐ์ ์ธ ๊ตฌ์กฐ
๋ฅผ ๋์์ ๋ง์กฑ์ํฌ ์ ์์๋ค.
Shared Worker๊ฐ ๋์ํ๋ ํ๋ฆ
Shared Worker ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ๋์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ฌ๋ฌ ํญ์์ useEventSSE ํ ์ด ์คํ๋๋ค.
- ๊ฐ ํญ์ Shared Worker์ ์ฐ๊ฒฐํ๊ณ , MessagePort๋ฅผ ํตํด ํต์ ํ๋ค.
- Shared Worker ๋ด๋ถ์์๋ ๋จ ํ๋์ SSE ์ฐ๊ฒฐ๋ง ์์ฑ๋๋ค.
- ์๋ฒ์์ ์ค์๊ฐ ์ด๋ฒคํธ๊ฐ ๋์ฐฉํ๋ฉด,
- Shared Worker๊ฐ ๊ทธ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ ํญ์ผ๋ก ๋ธ๋ก๋์บ์คํธํ๋ค.
- ๊ฐ ํญ์ ์ ๋ฌ๋ฐ์ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋๋ก UI์ ๋ฐ์ํ๋ค.
์ด ๊ตฌ์กฐ๋ฅผ ํตํด
๋ธ๋ผ์ฐ์ ํญ ์์ ์๊ด์์ด SSE ์ฐ๊ฒฐ์ ํญ์ 1๊ฐ๋ก ์ ์ง๋๋ค.
Shared Worker ๋ฏธ์ง์ ํ๊ฒฝ์ Fallback ๊ตฌ์กฐ
๋ฐ๋ฉด Shared Worker๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์์๋
์ด๊ธฐ ์ค๊ณ๋๋ก ๋จ์ํ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋๋ก ํ๋ค.
- ๊ฐ ํญ์ด /api/sse/event๋ก ์ง์ SSE ์ฐ๊ฒฐ
- ์ด๋ฒคํธ๋ ๊ฐ๋ณ ํญ์์ ๋ฐ๋ก ์ฒ๋ฆฌ
- ๋ณ๋์ ๋ธ๋ก๋์บ์คํธ๋ ํ๋ธ ๋ ์ด์ด๋ ๋์ง ์์
์ด ๋ฐฉ์์ ์ฐ๊ฒฐ ์๋ ๋์ด๋์ง๋ง, ์ง์ ๋ฒ์์ ์์ ์ฑ ๋ฉด์์๋ ๊ฐ์ฅ ํ์คํ ์ ํ์ง์ด๊ธฐ๋ ํ๋ค.
์ฆ, ์ด ์ํคํ ์ฒ๋ ์ฒ์๋ถํฐ “์ต์ ํ๋ ๊ตฌ์กฐ + ์ธ์ ๋ fallback ๊ฐ๋ฅํ ๊ตฌ์กฐ”๋ฅผ ํจ๊ป ๊ฐ๋๋ก ์ค๊ณ๋ ํํ๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ด ๊ตฌ์กฐ์ ํต์ฌ ์์ฝ
์ ๋ฆฌํ๋ฉด, ์ต์ข ๊ตฌ์กฐ์ ํต์ฌ์ ๋ฑ ์ธ ๊ฐ์ง๋ค.
- SSE๋ ์ฌ์ฉ์ ๊ธฐ์ค์ผ๋ก 1๊ฐ๋ง ์ ์งํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค
- PC ํ๊ฒฝ์์๋ Shared Worker๊ฐ ๊ทธ ์ญํ ์ ๋ด๋นํ๋ค
- Shared Worker ๋ฏธ์ง์ ํ๊ฒฝ์์๋ ๊ธฐ์กด SSE ๋ฐฉ์์ผ๋ก ์์ ํ๊ฒ fallback ํ๋ค
์ด์ ์ค์๊ฐ ์๋ฆผ์:
- ๋ธ๋ผ์ฐ์ ํญ์ด ๋ช ๊ฐ๋
- ์ธ์ฆ๊ณผ ์ค์๊ฐ์ฑ์ ์ ์งํ๋ฉด์
- ์๋ฒ์์ ์ฐ๊ฒฐ ์๋ ์ต์ํํ๋ ๊ตฌ์กฐ๋ก ๋์ํ๊ฒ ๋์๋ค.
๋๊ธ