์ด์ ์๋ ์๋น์ค์ ์๋ฆผ์ ๋ณผ ์ ์๋ ์ฑ๋์ด ์กด์ฌํ์ง ์์๋ค.
์๋น์ค ๋ด์ ๊ธฐ์กด์ ์ง์ํ๋ ๋ถ์๊ณผ ๊ด๋ จ๋ ์๋น์ค ์ธ์ SBOM์ ํ์ฉํ ์๋น์ค์ ๊ณต์ ๊ธฐ๋ฅ์ด ์๊ธฐ๊ฒ ๋๋ฉด์ ์๋ฆผ ๊ธฐ๋ฅ์ด ์๊ตฌ์ฌํญ์ผ๋ก ์ถ๊ฐ ๋์๋ค.
์ฃผ์ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์๋ค.
- ์ด๋ฒคํธ ์์ ์ฌ๋ถ ์ค์๊ฐ ๋ฐ์
- ์๋ก์ด ์ด๋ฒคํธ ๋ฐ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ
- ์ด๋ฒคํธ ์ญ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ
์๊ตฌ ์ฌํญ ๋ถ์
โ ์๋ก์ด ์ด๋ฒคํธ ๋ฐ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ
- ๋ฐ์ดํฐ ์ ์ก ํ๋ฆ
- case 1 : ํด๋ผ์ด์ธํธ → ์๋ฒ (์์ฒญ)
- case 2 : ์๋ฒ → ํด๋ผ์ด์ธํธ
โ ์ด๋ฒคํธ ์์ ์ฌ๋ถ ์ค์๊ฐ ๋ฐ์, ์ด๋ฒคํธ ์ญ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ
- ๋ฐ์ดํฐ ์์ฒญ/์ ์ก ํ๋ฆ
- ํด๋ผ์ด์ธํธ ๋์ → ์๋ฒ (์์ฒญ)
- ์ค์๊ฐ์ฑ์ด ์๋ ํด๋ผ์ด์ธํธ ๋์์ ๋ฐ๋ฅธ ์๋ฒ ์์ฒญ์ผ๋ก ์ค์๊ฐ ์๋ฆผ๊ณผ ๋ณ๊ฐ๋ก ์๊ฐ
- ๊ธฐ์กด REST ์์ฒญ์ ํตํ ๊ตฌํ
๋ฐ๋ผ์, ์ค์๊ฐ ์๋ฆผ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ ์๋ก์ด ์ด๋ฒคํธ ์๋ฆผ ๋ฐ์ ์ ์ค์๊ฐ ์ ๋ฐ์ดํธ ๋๋ ๋ฐฉํฅ์ ๋ํด์๋ง ๊ณ ๋ ค
๊ตฌํ ๋ฐฉ๋ฒ๋ก ๋น๊ต
| ๋ฐฉ์ | ๋ฐ์ดํฐ ํ๋ฆ | ์ฅ์ | ๋จ์ | ์ฐ๋ฆฌ ์๊ตฌ(์๋ฒ→ํด๋ผ ๋จ๋ฐฉํฅ) ์ ํฉ๋ | ์ด์ ๋์ด๋ |
| Polling | ํด๋ผ์ด์ธํธ → ์๋ฒ (๋จ๋ฐฉํฅ ์์ฒญ) | ๊ตฌํ ์ฌ์, ์ธํ๋ผ ๋จ์ | ๋ถํ์ํ ํธ๋ํฝ↑, ์๋ต ์ง์ฐ(๊ฐ๊ฒฉ ๋งํผ) | โณ(๊ฐ๋ฅ์ ํจ) | โ โโ |
| Long polling | ํด๋ผ์ด์ธํธ → ์๋ฒ (๋จ๋ฐฉํฅ ์์ฒญ) | ์ง์ฐ↓, ํ๋ก์/๋ก๋๋ฐธ๋ฐ์ ์นํ | ์ฐ๊ฒฐ/ํด์ ๋ฐ๋ณต ์ค๋ฒํค๋ | โ | โ โ โ |
| SSE (Server-Sent Events) | ์๋ฒ → ํด๋ผ์ด์ธํธ(๋จ๋ฐฉํฅ ํธ์) | ๋จ๋ฐฉํฅ push ์ต์ , ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ์ง์(EventSource), HTTP/LB ์นํ, ์๋์ฌ์ฐ๊ฒฐ | ๋ฐ์ด๋๋ฆฌ×, ์ฑํ ๊ฐ์ ์๋ฐฉํฅ์๋ ๋ถ์ ํฉ | โ (๊ถ์ฅ) | โ โ โ |
| WebSocket | ํด๋ผ์ด์ธํธ ↔ ์๋ฒ(์๋ฐฉํฅ ์ํต) | ์์ ํ ์๋ฐฉํฅ, ์ง์ฐ ์ต์ | LB/ํ๋ก์/์ค์ผ์ผ๋ง ๋ณต์ก์ฑ↑, ํฌ์ค/๋ฐฑํ๋ ์ ์ค๊ณ ํ์ | โณ(์ค๋ฒ์คํ) | โ โ โ |
- polling
- ๋จ์ํ ์ผ์ ์ฃผ๊ธฐ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ ์์ฒญ์ ๋ณด๋ด๋ ๊ตฌ์กฐ
- ๊ทธ๋ฌ๋ ์ด๋ฒคํธ๊ฐ ์๋ ๊ฒฝ์ฐ์ผ ๋๋ ํด๋ผ์ด์ธํธ๋ ๋ถํ์ํ ์์ฒญ์ ๊ณ์ ๋ณด๋ด์ผ ํจ
- Polling ์ฃผ๊ธฐ๊ฐ ๊ธธ์ด์ง ์๋ก ๋ฐ์ดํฐ์ ์ค์๊ฐ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋ฌธ์
- ๊ตฌํ ๋์ด๋ ์ฉ์ด (์ด๋ฏธ ๋ถ์ ์งํ์ค ํผ์ผํธ์์ ํ์ฉ๋๊ณ ์๋ ๋ฐฉ์)
- long polling
- ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํด ์๋ฒ๊ฐ ๋ฐ๋ก ์๋ต์ ๋ณด๋ด์ง ์๊ณ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๊น์ง Connection์ ์ ์ง
- Polling๋ฐฉ์๋ณด๋ค๋ ์ค์๊ฐ์ฑ์ด ์ฆ๊ฐํ๋ฉด์๋ ๋ถํ์ํ ์์ฒญ์๋ฅผ ์ค์ผ ์ ์์
- ๋ค๋ง ๊ฒฐ๊ตญ์ ์๋ต์ด ์ฌ ์๋ ์๋ ์ํฉ ๋๋ฌธ์ ๋ถํ์ํ ์์ฒญ์ ๋ณด๋ธ๋ค๋ ์ ์ polling ๋ฐฉ์๊ณผ ๋์ผ
- SSE(Server Sent Event)
- HTML5 ํ์ค๊ธฐ์ ๋ก์ ํด๋ผ์ด์ธํธ ์์ฒญ์์ด๋ ์๋ฒ -> ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์
- ์ต์ด ์ฐ๊ฒฐ ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์์ฒญ์ ๋ณด๋ด์ผ ํจ
- ์์ ๋ ๊ธฐ์ ๊ณผ ๋ค๋ฅด๊ฒ ์ค์๊ฐ ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ณผ ์ ์๋ ๊ธฐ์
- HTTP๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฐฉํ๋ฒฝ ๊ฐ๋ฐฉ ๋ฑ์ ์ ์ฐจ ๋ถํ์
- HTML5 ํ์ค๊ธฐ์ ๋ก์ ํด๋ผ์ด์ธํธ ์์ฒญ์์ด๋ ์๋ฒ -> ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์
- websocket
- ์น์์ผ์ ์๋ฐฉํฅ ํต์ ์ ์ง์ํ๋ Layer 7 ํ๋กํ ์ฝ
- SSE๋ณด๋ค๋ ์กฐ๊ธ ๋ ์๋ฐฉํฅ ์ค์๊ฐ์ฑ์ ๋ณด์ฅ
๐ฅ SSE vs WebSockets
๋ ๊ธฐ์ ๋ชจ๋ ์ค์๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ๋์ ๋ฐฉ์์์ ์ฐจ์ด๊ฐ ์๋ค.
- WebSockets
- ์๋ฐฉํฅ(full-duplex) ํต์ ์ ์ง์ํ๋ค.
- ์ฆ, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
- ์ด๋ฐ ํน์ฑ ๋๋ถ์ **์๋ฐฉํฅ ์ํธ์์ฉ์ด ํ์ํ ์๋น์ค(์: ์ค์๊ฐ ์ฑํ , ๋ฉํฐํ๋ ์ด์ด ๊ฒ์)**์ ์ ํฉ
- SSE (Server-Sent Events)
- ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ก(push) ํ ์๋ง ์๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ์๋ฒ๋ก ๋ณด๋ผ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ตฌํ์ด ๋จ์ํ๊ณ ๊ฐ๋ฒผ์ด ์ ํ์ง
๐ฅ SSE vs Polling
- Long Polling
- ํด๋ผ์ด์ธํธ๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์๋ฒ์ “์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๋์?” ํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๋ฐฉ์
- ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๋๋ผ๋ ๊ณ์ ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ฏ๋ก ๋นํจ์จ์
- SSE
- ํ ๋ฒ ์ฐ๊ฒฐ์ ๋งบ์ ๋ค, ์๋ฒ์์ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๊ธธ ๋๋ง๋ค ํด๋ผ์ด์ธํธ๋ก ์ง์ ํธ์
- ๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ์ ๋ฐ๋ณต ์์ฒญ์ด ํ์ ์๊ณ , ๋คํธ์ํฌ ๋ฆฌ์์ค๋ฅผ ์ ์ฝ
๊ฒฐ๋ก
ํญ๋ชฉ ์ถ์ฒ ๋ฐฉ์ ๋น๊ณ
| ํญ๋ชฉ | ์ถ์ฒ ๋ฐฉ์ | ๋น๊ณ |
| ์ค์๊ฐ ์๋ฆผ (์ ๊ท ์ด๋ฒคํธ ๋ฐ์) | SSE | ์๋ฒ → ํด๋ผ์ด์ธํธ ๋จ๋ฐฉํฅ ํธ์ |
| ์ด๋ฒคํธ ์ฝ์/์ญ์ ์ฒ๋ฆฌ | REST API | ํด๋ผ์ด์ธํธ ์ก์ ์ ๋ฐ๋ผ ์์ฒญ ๋ฐ์ |
- ๊ธฐ์กด ์๋น์ค์ ํ์ฌ ์งํ ์ค์ธ ๋ถ์ ์งํ๋ฅ ํ์ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ๊ฐ ๋ช ์์ ์ผ๋ก ์์ฒญํ๋ Polling ๋ฐฉ์์ด ์ ํฉ (์ผ์์ ์ํ ํ์ธ ๋ชฉ์ ).
- ๋ฐ๋ฉด, ํค๋์์ ์ ์ญ์ ์ผ๋ก ํ์๋๋ ์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ์ ์ง์์ ์ธ ์์ฒญ ์์ด ์๋ฒ๊ฐ ๋ณ๊ฒฝ์ฌํญ์ ํธ์ํด์ผ ํ๋ฏ๋ก → SSE(Server-Sent Events) ๋ฐฉ์์ด ๊ฐ์ฅ ์ ํฉ.
Reference
https://kangs-develop.tistory.com/40
https://sanghee01.tistory.com/186
https://velog.io/@galmegi/5.-์๋๊ธฐ๋ฅ-๊ตฌํ
https://velog.io/@tkddn_dev8430/์ค์๊ฐ-ํต์ -์ด๋ป๊ฒ-ํ ๋-ํด๋ง๋ถํฐ-WebSocket๊น์ง
https://sol-aftercoding.tistory.com/entry/STOMP๋-WebSocket๊ณผ์-์ฐจ์ด
๋๊ธ