๊ฐ์
์ฌ๋ฌ ์๋น์ค๋ฅผ ๋ณด๋ค๋ณด๋ฉด ์ค์๊ฐ์ฑ์ด ์ค์ํ ์๋น์ค๋ค์ด ์์ต๋๋ค. ์๋๋ฐฉ๊ณผ ํจ๊ป ๊ฒจ๋ฃจ๋ ๊ฒ์์ด๋, ์ฃผ์์ด๋ ๊ฒฝ๋งค ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๋ ์ฌ๋ฆด ์ ์๋๋ฐ์. ๊ทธ์ค์ ์ฐ๋ฆฌ์๊ฒ ์น์ํ ์๋น์ค๋ก๋ ์ฑํ ์๋น์ค๊ฐ ์์ต๋๋ค. ํ ๋ํ ๋ฐฉ์์ ์๋ก ์๋ก ์ฃผ๊ณ ๋ฐ๋ ๋ฉ์ธ์ง๋ฅผ ๋ฐ๋ก๋ฐ๋ก ์ฃผ๊ณ ๋ฐ์์ผํ๋๊ฒ ์ค์ํ ์ฑํ ๋ ์ค์๊ฐ์ฑ์ด ์ค์ํ์ฃ !
์ ํฌ ํ๋ก์ ํธ์์๋ ์๋ ํ๋งค ์ํ์ ๋ํ ๋ค๊ณ ๊ธฐ๋ฅ์ด ์์๊ณ , ์ด๋ฐ ๋ค๊ณ ๋ฅผ ํ๊ธฐ ์ํด ์ฑํ ์๋น์ค ๋์ ์ด ํ์ํ๋ค๊ณ ๋๊ผ์ต๋๋ค.
๊ฐ๊ฒฉ ์ ์ํ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด 1๋1 ์ฑํ ๋ฐฉ์ด ์๊ธฐ๊ณ ๊ฐ๊ฒฉ ๋ค๊ณ ๋ฅผ ํ ์์๋ ์ฑํ ์ด ๊ฐ๋ฅํด์ง์ฃ .
์ฑํ ๋๋ฉ์ธ์ ๋ํ ์ค๊ณ๋ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์๊ณ , ์ค๋์ ์ค์๊ฐ ์ฑํ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
https://programmer-may.tistory.com/189
์ผ๋์ ํ ํฌ์ค์ฟจ ํ์ด๋ ํ๋ก์ ํธ - ์ฑํ ๋๋ฉ์ธ ์ค๊ณ(์ ์ฝ์ ๋ฉ์์ง ์, ์ฑํ ๋ฐฉ ์ญ์ , ์ฑํ ๋ฉ
ํ์ด๋ ํ๋ก์ ํธ ์ผ๋๋ฐ๋ค ํ๋ก์ ํธ๋ฅผ ์์ํ๊ฒ ๋๋ฉด์, ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ๊ฐ ๊ฐ์์ ํํธ๋ฅผ ๋๋๊ธฐ ์์ํ๋ค. ํ๋ก ํธ์๋๋ ํ์ด์ง ํ๋ฉด์ ์ค์ฌ์ผ๋ก ํํธ๋ฅผ ๋๋ ๊ฐ์ ๋งํฌ์ ๋จ๊ณ๋ฅผ ์
programmer-may.tistory.com
HTTP ๋ฅผ ์ด์ฉํ ์ค์๊ฐ ์๋น์ค
์ ๊ฐ ๊ฐ๋ฐํ ์ค์๊ฐ ์ฑํ ์๋น์ค๋ฅผ ๋ง์๋๋ฆฌ๊ธฐ ์์ ์ค์๊ฐ ๊ธฐ์ ๋ค์ ๋ํด ๊ณต๋ถํ๋ ๋ด์ฉ์ ๊ณต์ ํด๋๋ฆฌ๊ฒ ์ต๋๋ค.
API ๋ง๋๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ์ค์๊ฐ์ฑ์ ํ๋ด๋ด๋ HTTP ๊ธฐ์ ๋ก ํ๋ง์ ๋ง์ด ์๊ณ ์์ ๊ฒ๋๋ค. ํ์ง๋ง ํ๋ง ๋ง๊ณ ๋ ๋ ์์ฃ !
HTTP ํ๋กํ ์ฝ์ ํ์ฉํ ์ค์๊ฐ ๊ธฐ์ ์ ํ๋ง ๋ง๊ณ ๋ ๋กฑํ๋ง, ์คํธ๋ฆฌ๋ฐ, SSE ๊ฐ ์์ต๋๋ค.
โ๏ธ ๋จ๋ฐฉํฅ ํต์
1๏ธโฃ ํ๋ง
ํ๋ง(Polling) ๊ธฐ์ ์ ์ ํต์ ์ธ AJAX ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ๋ฐฉ์์ผ๋ก, ์ฃผ๊ธฐ์ ์ผ๋ก HTTP ์์ฒญ์ ์๋ฒ์ ๋ ๋ ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ ๋๋ค. ์ฆ, ์ผ์ ๊ฐ๊ฒฉ๋ง๋ค ์์ฒญ์ด ์ด๋ค์ง๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๋ ์๋ ์๋ต์ ๋ฐ๊ณ ์ผ์ ์๊ฐ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ฒญ์ ๋ ๋ฆฌ๊ณ ์๋ต๋ฐ๊ณ , ๋ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ฒญ์ ๋ ๋ฆฌ๊ณ ์๋ต๋ฐ๊ณ …์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
๊ฐ๋จํ ๋งํผ ์ค๋ฒํค๋๋ ํฐ๋ฐ์. ๋ง์ฝ ์๋ฒ์์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๋ค๋ฉด ์ธ๋ฐ์๋ ์์ฒญ์ด ๊ณ์ ์๊ธฐ๋ ๊ฒ์ด๊ณ ์ด๋ ๋ถํ์ํ ํธ๋ํฝ์ ๊ณ์ ๋ง๋ค์ด๋ด๋ ๊ฒ์ด๋ผ๊ณ ๋ ํ ์ ์์ต๋๋ค.
- ๋จ์ : ์๋ฒ์ ๋ฐ์์ผํ ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๋๋ผ๋ ์ฃผ๊ธฐ์ ์ธ ์์ฒญ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ์๋ฒ ๋ถํ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
์ผ์ ๊ฐ๊ฒฉ์ ๊ฐ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฑธ๋ก ๊ตฌํ์ด ๊ฐ๋จํ ๋์ ์ด ์ผ์ ๊ฐ๊ฒฉ์ ๋ํ ํธ๋ ์ด๋์คํ๊ฐ ์์ต๋๋ค.
- ์ค์๊ฐ์ฑ์ ์ต๋ํํ๊ณ ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฐ๊ฒฉ์ ์ค์ด์๋ ์์ฒญ ์๊ฐ ๋ง์์ ธ์ ์๋ฒ์ ๋ถ๋ด์ด ๊ฐ๊ฒ ๋ฉ๋๋ค. ํนํ ์์ฒญ์ ๋ณด๋ผ ๋ HTTP ํค๋ ๋ํ ๊ฐ์ด ์ ์ก๋๋ฏ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ๊ฐ๊ฒฉ์ ์ค์ด๊ฒ ๋๋ฉด ๊ทธ๋งํผ ์๋ฒ๊ฐ ๋ฐ๋ ๋ถํ๊ฐ ์ปค์ง๊ฒ ๋ฉ๋๋ค.
- ๋ฐ๋๋ก ์๋ฒ ๋ถ๋ด์ ๋๊ณ ์ ๊ฐ๊ฒฉ์ ๋๋ฆฌ๊ฒ ๋๋ฉด ์ค์๊ฐ์ฑ์ด ๋จ์ด์ง๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
2๏ธโฃ ๋กฑํ๋ง
๋กฑ ํด๋ง(Long-polling) ๊ธฐ์ ๋ํ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ง ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ HTTP ์์ฒญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋ ๋ ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ฐฉ์์ ๋๋ค. ํ์ง๋ง ํด๋ง๊ณผ ๋ฌ๋ฆฌ ๋กฑ ํด๋ง์ ๊ฒฝ์ฐ ์๋ฒ์ ์์ฒญ์ ๋ ๋ ธ์ ๋ ์๋ตํด์ค ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ผ์ ์๊ฐ ๊ธฐ๋ค๋ฆฌ๋ค๊ฐ ๋ฐ์ดํฐ๊ฐ ์๊ธฐ๋ฉด ๊ทธ๋์์ผ ์๋ตํด์ฃผ๋ ๋ฐฉ์์ ๋๋ค (ํน์ ํ์์์์ด ๋ฐ์ํ๋ฉด ๋น ์๋ต์ ๋ณด๋ผ ์๋ ์์ต๋๋ค). ๊ทธ๋ฆฌ๊ณ ์๋ต์ ๋ฐ์ ํด๋ผ์ด์ธํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ณง์ฅ ๋ค์ ์์ฒญ์ ์๋ฒ์ ๋ณด๋ ๋๋ค. (๋ฌผ๋ก ์ผ์ ์๊ฐ ๊ธฐ๋ค๋ฆฐ ์ดํ์ ๋ณด๋ผ ์๋ ์์ต๋๋ค)
- ์ง์ฐ๋ ์๋ต: ์๋ฒ๋ ๋ฐ์ดํฐ๊ฐ ์ค๋น๋ ๋๊น์ง ์๋ต์ ์ง์ฐ์ํต๋๋ค.
- ์ฆ์ ์ฌ์์ฒญ: ํด๋ผ์ด์ธํธ๋ ์๋ต์ ๋ฐ์ผ๋ฉด ์ฆ์ ์๋ก์ด ์์ฒญ์ ๋ณด๋ ๋๋ค.
- ์ค์๊ฐ์ฑ ํฅ์: ํด๋ง๋ณด๋ค ์ค์๊ฐ์ฑ ์ธก๋ฉด์์ ๋ ํจ์จ์ ์ ๋๋ค.
๋กฑ ํด๋ง์ ๊ฒฝ์ฐ, ํด๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด์จ๋ HTTP ์์ฒญ์ ๊ณ์ํด์ ๋ ๋ฆฌ๋ ๊ฒ์ด๋ฏ๋ก HTTP ํค๋์ ์ํ ์ค๋ฒํค๋๊ฐ ์กด์ฌํฉ๋๋ค. ๋ฐ์ดํฐ๊ฐ ๋น๋ฒํ๊ฒ ์ ๋ฐ์ดํธ๋๋ ์ํฉ์์ ํด๋ง๋ฐฉ์๊ณผ ๋ณ๋ค๋ฅธ ์ฐจ์ด๊ฐ ์๊ฒ ๋ฉ๋๋ค. ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ๊ฐ ๋น๋ฒํ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์์ฒญ ์ฆ์ ์๋ต์ ๋ฐ๊ฒ ๋๊ณ , ๋ฐ๋ก ์ด์ด์ ๋ค์ ์์ฒญ์ ๋ณด๋ด ์๋ต์ ๋ฐ๊ฒ ๋๊ณ , ๋ ๋ฐ๋ก ์ด์ด์ ๋ค์ ์์ฒญ์ ๋ณด๋ด ์๋ต์ ๋ฐ๊ณ … (๋ฌดํ ๋ฐ๋ณต)์ ๊ฐ์ ์ํฉ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ํ ๋ค์์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์ ์์ ์๋ํ๋ค๋ฉด ์๋ฒ์ ๋ถ๋ด์ด ์ปค์ง๊ฒ ๋ฉ๋๋ค.
3๏ธโฃ ์คํธ๋ฆฌ๋ฐ
HTTP ์คํธ๋ฆฌ๋ฐ(HTTP Streaming) ๋ฐฉ์์ ์์ฒญ์ ๋ํ ์๋ต์ ์๋ฃํ์ง ์์์ฑ(์ฆ, ์๋ฒ์์ ์์ฒญ์ ๊ณ์ํด์ ์ด์ด๋์ฑ๋ก) ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ํด๋ผ์ด์ธํธ๋ก ํธ์ํ๋ ๋ฐฉ์์ ๋๋ค. ๋งค๋ฒ ์๋ต์ ํ ๋๋ง๋ค ๊ณง ์ด์ด ๋ค์ ์์ฒญํด์ผ ํ๋ (๋กฑ)ํ๋ง ๋ฐฉ์์ ๋นํด ํจ์จ์ ์ด๋ฉฐ, ์๋ฒ์ ์ํ ๋ณ๊ฒฝ์ด ์ฆ์ ๊ฒฝ์ฐ์ ์ ๋ฆฌํ ๋ฐฉ์์ ๋๋ค.
์ฃผ๋ก ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ(์: ๋น๋์ค, ์ค๋์ค)๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ์กํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
Streaming ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด Long Polling๊ณผ ๋ค๋ฅด๊ฒ ์๋ต ํ ์ฐ๊ฒฐ์ ๋์ง ์์ HTTP ์์ฒญ์ ์ํ ์ฌ์ฐ๊ฒฐ ๊ณผ์ ์ด ์์ด ์๋ฒ์ ๋ถ๋ด์ด ๋์ด์ง๋๋ค. ํ์ง๋ง ์ด๋ ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ Response๋ฅผ ์ ๋ฌํ ๋ฟ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก์ ๋ฐ์ดํฐ ์ก์ ์ ์ด๋ ต๋ค๋ ๋จ์ ๊ณผ ๊ตฌํ์ด Polling, Long Polling๋ณด๋ค ๋ ๋ณต์กํ๋ค๋ ๋จ์ ์ด ์์ต๋๋ค.
- ๋จ์ : ์๋ฒ๊ฐ ์ผ๋ฐฉ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ Response๋ฅผ ์ ๋ฌํ ๋ฟ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก์ ๋ฐ์ดํฐ ์ก์ ์ ์ด๋ ต๋ค(๋จ ๋ฐฉํฅํต์ )๋ ์ . Polling, Long Polling๋ณด๋ค ๋ ๋ณต์กํ๋ค๋ ์ .
4๏ธโฃ SSE
๋จ๋ฐฉํฅ ํต์ ๊ธฐ์ ์ธ SSE(Server Sent Events)๋ ์ฒ์๋ถํฐ ํจ์จ์ ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. SSE ๋ํ HTTP๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ๊ธฐ์ ์ด์ง๋ง, ํด๋ง·๋กฑ ํด๋ง๊ณผ๋ ๋ฌ๋ฆฌ, SSE๋ ์๋ฒ๊ฐ ์ํ ๋ ์ธ์ ๋ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ “์๋ฒ๊ฐ ์ํ ๋”๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ์๊ฒผ์ ๋, ์ฆ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์๋๋ฅผ ๋งํฉ๋๋ค.
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ์ค์๊ฐ ๋ฉ์์ง๋ ์ ๋ฐ์ดํธ๋ฅผ ์ ์กํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ธฐ์ ์ ์ฃผ๋ก ํ ์คํธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐ ์ต์ ํ๋์ด ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ง์์ ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง ์์๋ ์๋ฒ๋ก๋ถํฐ ์๋์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ์ค์๊ฐ ์๋ฆผ ์๋น์ค์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ ์ฌ์ฐ๊ฒฐ: ์ฐ๊ฒฐ์ด ๋์ด์ง ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐ์ ์๋ํฉ๋๋ค.( ํด๋ผ์ด์ธํธ์ธก์์ EventSource ๊ฐ์ฒด ์ฌ์ฉ )
- ํ ์คํธ ๊ธฐ๋ฐ: ์ฃผ๋ก ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
- ๋จ์ : ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์์ง๋ง, ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก์ ๋ฐ์ดํฐ ์ ์ก์ ๋ณ๋์ ์์ฒญ์ ํตํด ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.(๋จ๋ฐฉํฅ ํต์ )
๋น๊ต์์ฝ
๋ฐฉ์ | ์ฐ๊ฒฐ ์ง์์ฑ | ๋ฐ์ดํฐ ์ ์ก ์ฃผ์ฒด | ์ค์๊ฐ์ฑ |
ํด๋ง | ์ง์์ ์ด์ง ์์ | ํด๋ผ์ด์ธํธ | ๋ฎ์ |
๋กฑ ํด๋ง | ์ง์์ ์ด์ง ์์ | ํด๋ผ์ด์ธํธ | ์ค๊ฐ |
์คํธ๋ฆฌ๋ฐ | ์ง์์ ์ | ์๋ฒ | ๋์ |
SSE | ์ง์์ ์ | ์๋ฒ | ๋์ |
๐ช ๋ฌธ์ ํด๊ฒฐ
์ด๋ ๊ฒ HTTP ๋ฅผ ์ด์ฉํ ์ค์๊ฐ ๊ธฐ์ ์ ๋จ๋ฐฉํฅ ํต์ ์ ๊ฐ๊ฐ์ ๋จ์ ์ด ์์ด, ์ค์๊ฐ ์ฑํ ๊ธฐ์ ๋ก ์ฐ๊ธฐ์ ์ ๋งคํ์ต๋๋ค.
ํ๋ง, ๋กฑํ๋ง : ๋ถํ์ํ ์ง์์ ์์ฒญ์ด ์์ ์ ์๊ธฐ์ ์ฌํ ํธ๋ํฝ๊ณผ ์ค๋ฒํค๋๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ, SSE : ์ฐ๊ฒฐ์ ๋งบ๊ณ ๋ ๋ค์ ๋ถํ์ํ ๋ฐ์ดํฐ ์ ์ก ์์ด ์ค์๊ฐ์ผ๋ก ์๋ฒํํ ์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์์ง๋ง, ๋จ๋ฐฉํฅ ํต์ ์ด๋ผ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ ๋ฐ์ดํฐ ์ ์ก์์ ์๋ก์ด ์์ฒญ์ ๋ณด๋ด์ผํฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ ๋ณด์๊ณ , ์น์์ผ ๊ธฐ์ ์ ์ฐพ์, ๊ณต๋ถํ๊ณ ์ ์ฉํ๊ฒ ๋์ต๋๋ค.
โ๏ธ ์๋ฐฉํฅ ํต์
์น์์ผ
์น์์ผ์ ์ง์ ํ ์๋ฏธ์ ์๋ฐํฅ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋จผ์ ์ด๊ธฐ ํธ๋์ ฐ์ดํฌ ๊ณผ์ ์์ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ง๋ง ์ดํ์ ๋ฐ์ดํฐ ์ ์ก์ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ฆฝ์ ์ธ ์๋ฐฉํฅ ํต์ ์ฑ๋์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
- ์ด๊ธฐ ํธ๋์ ฐ์ดํฌ: ์น์์ผ ์ฐ๊ฒฐ์ HTTP/HTTPS ์์ฒญ์ ํตํด ์์๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์ด ์์ฒญ์ Upgrade ํค๋๋ฅผ ํฌํจํ์ฌ ์น์์ผ ํ๋กํ ์ฝ๋ก์ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์ฒญํฉ๋๋ค.
- ์๋ฒ ์๋ต : ์๋ฒ๊ฐ ์ด ์์ฒญ์ ์น์ธํ๋ฉด, HTTP ์๋ต์ผ๋ก ์ ๊ทธ๋ ์ด๋๋ฅผ ํ์ธํ๊ณ ์น์์ผ ์ฐ๊ฒฐ์ ์๋ฆฝํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก : ํธ๋์
ฐ์ดํฌ๊ฐ ์๋ฃ๋๋ฉด, ์น์์ผ ์ฐ๊ฒฐ์ด ์ด๋ฆฌ๊ณ , ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๋
๋ฆฝ์ ์ธ ์๋ฐฉํฅ ํต์ ์ฑ๋์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. ์ด ๋จ๊ณ๋ถํฐ๋ HTTP ํ๋กํ ์ฝ์ด ์๋ ์น์์ผ ํ๋ ์์ ์ฌ์ฉํ์ฌ ํต์ ํฉ๋๋ค.
์ด๋ ๋ฐ์ดํฐ๋ ํ ์คํธ์ ๋ฐ์ด๋๋ฆฌ๋ง์ ๋ณด๋ผ ์ ์๊ณ ํด๋น ๋ฐ์ดํฐ ํด๋ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งก๊ธฐ๊ฒ ๋ฉ๋๋ค. - ์ฐ๊ฒฐ ์ข ๋ฃ : ๊ทธ ํ ํ์ชฝ์ Close ์ ํธ๋ฅผ ํตํด ์น์์ผ ์ฐ๊ฒฐ์ ๋๊ฒ ๋ฉ๋๋ค.
์น์์ผ์ ํน์ง
- ์๋ฐฉํฅ ํต์ (์ ์ด์ค ํต์ ): ์น์์ผ์ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์๋ฐฉํฅ ํต์ ์ ์ง์ํฉ๋๋ค. ์ด๋ ์ฑํ , ์ค์๊ฐ ๊ฒ์, ์ค์๊ฐ ์ ๋ฐ์ดํธ ๋ฑ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
- ์ง์์ ์ธ ์ฐ๊ฒฐ: ์น์์ผ ์ฐ๊ฒฐ์ ๋ช ์์ ์ผ๋ก ๋ซํ๊ธฐ ์ ๊น์ง ์ด๋ ค ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์ง์์ ์ธ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฎ์ ์ค๋ฒํค๋: HTTP ์์ฒญ/์๋ต ๋ชจ๋ธ์ ๋นํด ์น์์ผ์ ๋ฐ์ดํฐ ํ๋ ์์ ์ค๋ฒํค๋๊ฐ ๋ฎ์, ๋ ํจ์จ์ ์ธ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ด๊ธฐ ํธ๋์ ฐ์ดํฌ: HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์ฐ๊ฒฐ์ ์๋ฆฝํฉ๋๋ค.
- ๋ฐ์ดํฐ ์ ์ก: HTTP๊ฐ ์๋ ์น์์ผ ํ๋ ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค.
ํ์ง๋ง ์ด๋ฐ ์น์์ผ์๋ ๋จ์ ์ ์์ต๋๋ค. HTTP๋ ๋๋ฆฌ ์ฌ์ฉํ๊ณ , ๊ท์ฝ์ด ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ํต์ ์ ํ๊ฒ ๋๋ฉด ๋๊ตฌ๋ ํด์์ด ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์น์์ผ์ ํ์์ด ์ ํด์ ธ ์์ง ์์ ์ฃผ๊ณ ๋ฐ๋ ์ฃผ์ฒด ๊ฐ์ ๋ฐ๋ก ์ฝ์์ ํ ๊ฒ ์๋๋ผ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฝ๊ฒ ํด์ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๋ํ ์น์์ผ์ ๋ฌธ์์ด์ ์ฃผ๊ณ ๋ฐ์ ๋ฟ ๊ทธ ์ด์์ ์ผ์ ํด์ฃผ์ง ์์ต๋๋ค.
STOMP
์น์์ผ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ํ์์ ์ ์ ์๋ค๋ผ๋ ๋จ์ ์ ์ํด์ ๋ณด์กฐ ํ๋กํ ์ฝ์ธ STOMP ๊ฐ ์์ต๋๋ค.
STOMP๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์๋ก ํต์ ํ๋ ๋ฐ ์์ด ๋ฉ์์ง ํ์, ๋ด์ฉ ๋ฑ์ ์ ์ํด ์ค๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์น์์ผ ๋ฉ์์ง๋ฅผ ์ด๋ป๊ฒ ํด์ํด์ผ ํ ์ง, ์ด๋ค ํฌ๋งท์ผ๋ก ์ค๋์ง ๋ฑ์ ๋ํ ๊ด๋ฆฌ๋ฅผ ํ์ง ์์๋ ๋์ด ํธ๋ฆฌํ์ฃ . ๋ฉ์์ง ํจํด์ ๋ณด๋ค ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์ต๋๋ค.
STOMP์ ์ฃผ์ ํน์ง
- ํ ์คํธ ๊ธฐ๋ฐ ํ๋กํ ์ฝ: STOMP๋ ๋จ์ํ ํ ์คํธ ๊ธฐ๋ฐ ํ๋กํ ์ฝ๋ก, ์ฌ๋์ด ์ฝ๊ธฐ ์ฝ๊ฒ ์ค๊ณ๋์์ต๋๋ค.
- ๋ฉ์์ง ํจํด ์ง์: Pub/Sub(๋ฐํ/๊ตฌ๋ ) ํจํด, ํ์, ํธ๋์ญ์ ๋ฑ์ ๋ค์ํ ๋ฉ์์ง ํจํด์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ฉํฐ ํ๋กํ ์ฝ ์ง์: STOMP๋ ์น์์ผ ์ธ์๋ TCP, WebSocket, HTTP ๋ฑ์ ํตํด ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ค์ ๋ฉ์์ง ๋ธ๋ก์ปค ์ฌ์ฉ: RabbitMQ, ActiveMQ ๊ฐ์ ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ฝ๊ฒ ํตํฉํ ์ ์์ต๋๋ค.
์น์์ผ๊ณผ STOMP์ ๊ฒฐํฉ
์น์์ผ๊ณผ STOMP๋ฅผ ๊ฒฐํฉํ๋ฉด, ์น์์ผ์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด์๋ STOMP์ ๋ฉ์์ง ํจํด์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํฉ๋๋ค.
- ์น์์ผ: ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- STOMP: ๋ฉ์์ง ๊ตฌ์กฐ์ ํจํด์ ํ์คํํ์ฌ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์ต๋๋ค.
์คํ๋ง์์ ์น์์ผ๊ณผ STOMP ๊ธฐ์ ํ์ฉ
์ด์ฒ๋ผ ๊ฐ ๊ธฐ์ ์ ์ฅ์ ๊ณผ ๋จ์ ์ ์๊ฐํ์ฌ, ์ต์ข ์ ์ผ๋ก ์น์์ผ๊ณผ STOMP๋ฅผ ํ์ฉํ์ฌ ์ฑํ ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ๋ก ํ์์ต๋๋ค. ํนํ๋ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ด๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ ๋ชจ๋์ ์ ๊ณตํด์ฃผ๋๋ฐ์. WebSocketMessageBrokerConfigurer ๊ตฌํํ์ฌ ๊ธฐ์ ์ ์ ๋ชฉ์ํฌ ์ ์์ต๋๋ค. WebSocketMessageBrokerConfigurer ์ ์คํ๋ง ๋ด๋ถ์ ์ผ๋ก ๋ฉ์ธ์ง ๋ธ๋ก์ปค๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ , ๋ฉ์์ง ๋ธ๋ก์ปค ์ค์ , ์๋ํฌ์ธํธ ๊ตฌ์ฑ, ๋ฉ์์ง ๋งคํ ๋ฑ์ ํฌํจํ WebSocket ๊ด๋ จ ์ค์ ์ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋๋ ์ ๊ฐ ์ปค์คํ ํ ์น์์ผ ์ปจํผ๊ทธ์ ๋๋ค.
package kr.co.fastcampus.yanabada.common.config;
import kr.co.fastcampus.yanabada.common.handler.StompHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@RequiredArgsConstructor
@EnableWebSocketMessageBroker
public class WebSockConfig implements WebSocketMessageBrokerConfigurer {
private final StompHandler stompHandler;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/sub");
config.setApplicationDestinationPrefixes("/pub");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws-stomp").setAllowedOriginPatterns("*");
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(stompHandler);
}
}
- enableSimpleBroker("/sub"): ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ํ์ฑํํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ ํ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ /sub ๊ฒฝ๋ก๊ฐ ๊ตฌ๋ ๊ฒฝ๋ก๋ก ์ค์ ๋ฉ๋๋ค.
- setApplicationDestinationPrefixes("/pub"): ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ๊ฒฝ๋ก์ ์ ๋์ฌ๋ฅผ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ /pub ๊ฒฝ๋ก๊ฐ ์ค์ ๋ฉ๋๋ค.
- addEndpoint("/ws-stomp"): WebSocket ์๋ํฌ์ธํธ๋ฅผ ๋ฑ๋กํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ด ์๋ํฌ์ธํธ๋ฅผ ํตํด WebSocket ์ฐ๊ฒฐ์ ์์ํฉ๋๋ค.
- setAllowedOriginPatterns("*"): CORS ์ค์ ์ ํตํด ํน์ ๋๋ฉ์ธ์์์ ์ ๊ทผ์ ํ์ฉ์ ์ค์ ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ํ๊ฒฝ์์ ๋ชจ๋๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ ์ฉํ์ง๋ง, ํ๋ก๋์ ํ๊ฒฝ์์๋ ๋ณด์์์ ์ด์ ๋ก ํน์ ๋๋ฉ์ธ๋ง ํ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ค์์ ์ ๊ฐ ๋ง๋ ์ฑํ ๋๋ฉ์ธ ์ปจํธ๋กค๋ฌ ์ผ๋ถ์ ๋๋ค.
@RestController
@RequestMapping("/v1/chats")
@RequiredArgsConstructor
public class ChatController {
@Value("${chatroom.topic.prefix}")
private String chatroomTopicPrefix;
private final ChatService chatService;
private final SimpMessagingTemplate messagingTemplate;
@MessageMapping("/message")
public void message(ReceivedChatMessage message) {
messagingTemplate.convertAndSend(
chatroomTopicPrefix + message.chatRoomCode(),
chatService.saveChatMessage(message)
);
}
}
- @MessageMapping("/message"): STOMP ํ๋กํ ์ฝ์ ํตํด ํด๋ผ์ด์ธํธ์์ /{์ค์ ๊ฒฝ๋ก}/message ๊ฒฝ๋ก๋ก ์ ์ก๋ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๊ธฐ์ /{์ค์ ๊ฒฝ๋ก} ์ WebSockConfig์์ ์ค์ ๋ setApplicationDestinationPrefixes ๊ฐ์ ๋ฐ๋ผ ์๋์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค.(์ ๊ฐ์ ๊ฒฝ์ฐ /pub ์ด ์ถ๊ฐ๋ฉ๋๋ค.)
- messagingTemplate.convertAndSend(...): SimpMessagingTemplate์ ์ฌ์ฉํ์ฌ ๋ฐ์ ๋ฉ์์ง๋ฅผ ํน์ ์ฃผ์ ๋ก ๋ค์ ์ ์กํฉ๋๋ค. (๊ตฌ๋ ์ฃผ์ฒด์๊ฒ ์ ์ก)
โก๏ธ ๋ฉ์ธ์ง ๋ฐํ (โป ์ฃผ์ ํ๋งค์ -> ๊ตฌ๋งค์ ๋ฉ์ธ์ง ์ก์ ์ด ์๋, ํด๋ผ์ด์ธํธ -> ์๋ฒ ์ ๋๋ค.)
์ฑํ ๋ฉ์ธ์ง ๋ฐํ๊ณผ ๊ตฌ๋ ๊ฒฝ๋ก์ ๋ํด์ ์ฑํ ๋๋ฉ์ธ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋ถ๊ณผ ํ์ํ์ฌ ๊ฒฐ์ ํ์์ต๋๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ์์ ๋ฉ์์ง๋ฅผ ๋ฐํํ ๋๋
wss://{์๋ฒ ์๋ํฌ์ธํธ}/ws-stomp
๋ก ์น์์ผ ์ฐ๊ฒฐ์ ๋งบ์ ํ,
/pub/message
๊ฒฝ๋ก๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ฉด ๋ฉ์ธ์ง๋ฅผ ๋ฐํํ ์ ์๊ฒ ๋ฉ๋๋ค.
โฌ ๏ธ ๋ฉ์ธ์ง ๊ตฌ๋ (โป ์ฃผ์ ํ๋งค์ -> ๊ตฌ๋งค์ ๋ฉ์ธ์ง ์์ ์ด ์๋, ์๋ฒ-> ํด๋ผ์ด์ธํธ ์ ๋๋ค.)
ํ๊ฒฝ๋ณ์์ /sub/chatroom ์ ๋ช ์ํด ๋จ๊ธฐ ๋๋ฌธ์ chatroomTopicPrefix ๋ก ๋ฐ๊ณ , ์ ์ก๋ ์ฑํ ๋ฐฉ ๋ฃธ ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ,
/sub/chatroom/{chatRoomCode}
๊ฒฝ๋ก๋ก ์ฑํ ๋ฐฉ์ ๋ด๊ฐ ๋ณด๋ธ ๊ทธ๋ฆฌ๊ณ ์๋๋ฐฉ์ด ๋ณด๋ธ ๋ฉ์ธ์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ตฌ๋ ํ์ฌ ๋ฐ์ ์ ์์ต๋๋ค.
๋ฌผ๋ก ์ด ๊ฒฝ์ฐ๋ ์น์์ผ ์ฐ๊ฒฐ์ด ์ ํ ๋์ด์ผ ํฉ๋๋ค!
์ด๋ ๊ฒ ํ๋ฉด {chatRoomCode} ๋ฅผ ๊ฐ์ง ์ฑํ ๋ฐฉ์์ ๋ด๊ฐ ๋ณด๋ธ ๊ทธ๋ฆฌ๊ณ ์๋๋ฐฉ์ด ๋ณด๋ธ ๋ฉ์ธ์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐํ ๋ฐ ๊ตฌ๋ ์ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
โจ ๊ฒฐ๊ณผ๋ฌผ
โ๏ธ ์ ๋ฆฌ
- ์๊ตฌ์ฌํญ ์ ์์๋ฅผ ํตํด์, ์ค์๊ฐ ์ฑํ ์ ํ์์ฑ์ ๋๊ผ์ต๋๋ค.
- ์คํ๋ง MVC๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTTP ๊ธฐ๋ฐ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์ HTTP ํ์ฉํ ์ค์๊ฐ ๊ธฐ์ ์ ํ์ํด ๋ณด์์ต๋๋ค.
- ํ์ง๋ง ๊ฐ๊ฐ์ ๊ธฐ์ ๋ค์ ์ค์๊ฐ ์ฑํ ์๋น์ค์ ๊ธฐ์ ๋ก ์ฐ๊ธฐ์๋ ์น๋ช ์ ์ธ ๋จ์ ๋ค์ด ์์์ต๋๋ค.
- ๋ค๋ฅธ ๊ธฐ์ ์ ์ฐพ์ผ๋ฉฐ ์น์์ผ ๊ณผ STOMP๋ฅผ ์๊ฒ ๋์๊ณ , Spring์์๋ ์ด ๊ธฐ์ ์ ์ง์ํด์ค๋ค๋ ๊ฑธ ์๊ฒ ๋์ต๋๋ค.
- ์น์์ผ + STOMP ๋ฅผ ํตํด ์ง์ ํ ์๋ฐฉํฅ ํต์ ๊ณผ ๋ฉ์์ง ๊ตฌ์กฐ์ ํจํด์ ํ์คํํ์ฌ ์ค์๊ฐ ์ฑํ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ ์ ์์์ต๋๋ค.
๐ง๐ป ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ฑํ ๋๋ฉ์ธ์ ๋ด๋นํ๊ฒ ๋๋ฉด์ ์ค์๊ฐ ์ฑํ ์๋น์ค๋ฅผ ๋ง๋ค๋ฉฐ, ์ ๋ง ๋ง์ ๋คํธ์ํฌ ์ง์์ ๋ฐฐ์๊ฐ๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋์ต๋๋ค. ๊ฐ๊ฐ์ ์ ํ์ ๋ง๋ ํ๋กํ ์ฝ์ด ์กด์ฌํ๋ฉฐ ๊ทธ์ ๋ฐ๋ฅธ ์ฅ๋จ์ ์ด ์๊ธฐ์ ๊ทธ๊ฒ์ ์ ๊ณ ๋ คํ์ฌ ํ์ฉํด์ผ, ์ฌ์ฉ์ ๋ฟ ์๋๋ผ ์๋ฒ๊น์ง ์๊ฐํ๋ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์๋ค๋ ๊ฑธ ๋ชธ์ ๊นจ๋ฌ์์ต๋๋ค.
HTTP ํ๋กํ ์ฝ๊ณผ HTTP ๋ฅผ ํ์ฉํ ์ค์๊ฐ ๊ธฐ์ , ์น์์ผ, STOMP๋ฅผ ๊ณต๋ถํ๋ฉฐ ๋ง์ฐํ๊ฒ ๊ธฐ์ ์ ๋์ ํ๋ ๊ฒ์ด ์๋, ์ด ๊ธฐ์ ์ ์ ์จ์ผํ๋์ง, ์ด๋ค ์ด์ ์ด ์๋์ง ์ ์ค๋ช ํ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋ ๊ฒ ๊ฐ์ ๋งค์ฐ ๋ฟ๋ฏํ๊ณ ๊ธฐ๋ปค์ต๋๋ค.
๋๊ธ