
์ง๋ ํฌ์คํ
(Spring Cloud Eureka, Gateway๋ฅผ ํตํ ์ธ์ฆ/์ธ๊ฐ ์ฒ๋ฆฌ)์ ์ด์ด ๋๋์ด ๋ง์ดํฌ๋ก์๋น์ค์ค ํ๋์ธ ์ฑํ
์๋น์ค
๋ฅผ ๊ฐ๋ฐํ๊ธฐ์ ์์ ์ ํํ ๊ธฐ์ ๋ค์ ๋ํด ๊น์ด ์๊ฒ ์์๋ณด๊ณ , ์ ์ด๋ฐ ์ ํ์ ํ๋์ง ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค. (์ ๋ Spring Cloud Eureka, Gateway๋ฅผ ํตํ ์ธ์ฆ/์ธ๊ฐ ์ฒ๋ฆฌ ์ดํ Spring Cloud BUS๋ฅผ ์ด์ฉํ ์ค์ ์ ๋ณด ์๋ฒ ๊ฐ๋ฐ์ ์งํํ๋๋ฐ, ์ ๊ฐ ์ด์ ์ ์์ฑํ ํฌ์คํ
์ด ์์ด ๋ฐ๋ก ํด๋น ๊ณผ์ ์ ํฌ์คํ
ํ์ง ์๊ฒ ์ต๋๋ค. ์๋ ๋งํฌ ์ฐธ์กฐํด์ฃผ์ธ์!)
๐๐ Spring Cloud (Cloud bus,RabbitMQ ์ด์ฉํ Config ์ ๋ณด ๋ฐ์)
๐ ๋ชฉ์ฐจ
- STOMP๋?
- WebSocket๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ด์
- STOMP ๋ฉ์์ง ๋ธ๋ก์ปค์ ํ์์ฑ
- Kafka vs RabbitMQ: ๋ฉ์์ง ๋ธ๋ก์ปค ์ ํ
- ์ฑํ
๋ฐ์ดํฐ ์ ์ฅ: MongoDB vs MySQL
- SSE(Server-Sent Events)๋?
- ์๋ฆผ ๊ธฐ๋ฅ์ SSE๋ฅผ ์ ํํ ์ด์
1. STOMP๋?
STOMP(Simple Text Oriented Messaging Protocol)๋ ๊ฐ๋จํ๋ฉด์๋ ๊ฐ๋ ฅํ ํ
์คํธ ๊ธฐ๋ฐ ๋ฉ์์ง ํ๋กํ ์ฝ์
๋๋ค. ๐
STOMP์ ์ฃผ์ ํน์ง:
- ๊ฐ๋จํ ํ
์คํธ ๊ธฐ๋ฐ ๋ช
๋ น์ด:
CONNECT
, SUBSCRIBE
, SEND
๋ฑ
- ๋ฉ์์ง ๋ธ๋ก์ปค ์ฌ์ฉ: ํจ์จ์ ์ธ ๋ฉ์์ง ๋ผ์ฐํ
- ํ๋ ์ ๊ตฌ์กฐ: ๋ช
ํํ ๋ช
๋ น๊ณผ ๋ฐ์ดํฐ ๊ตฌ๋ถ
- ๋ฐํ/๊ตฌ๋
๋ชจ๋ธ ์ง์: ์ ์ฐํ ๋ฉ์์ง ์ ๋ฌ ๊ตฌ์กฐ
๐ก ์ STOMP๋ฅผ ์ ํํ๋์?
- ์ธ๋ถ ๋ธ๋ก์ปค ํ์ฉ: ์ฌ๋ฌ ์๋ฒ ๊ฐ ํจ์จ์ ์ธ ๋ฉ์์ง ๊ด๋ฆฌ
- ๊ฐํธํ ๋ผ์ฐํ
:
@Controller
์ @MessageMapping
์ ์ด์ฉํ ์ฌ์ด ๋ฉ์์ง ์ฒ๋ฆฌ
- ํ์คํ๋ ํ๋กํ ์ฝ: ๋ค์ํ ์ธ์ด์ ํ๋ซํผ ๊ฐ ํธํ์ฑ
2. WebSocket๋ง์ผ๋ก๋ ๋ถ์กฑํ ์ด์
WebSocket์ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง, ์ฑํ
์๋น์ค์๋ ๋ช ๊ฐ์ง ํ๊ณ๊ฐ ์์ต๋๋ค:
- ๋ฉ์์ง ํ์ ์ ์ ๋ถ์ฌ: WebSocket์ ๋ฉ์์ง ๊ตฌ์กฐ๋ฅผ ์ ์ํ์ง ์์ ์ถ๊ฐ ์์
ํ์
- ๋ณต์กํ ๋ผ์ฐํ
: ๊ฐ ์ฐ๊ฒฐ๋ง๋ค ๊ฐ๋ณ์ ์ธ ํธ๋ค๋ฌ ๊ด๋ฆฌ ํ์
- ์ธ์
๊ด๋ฆฌ์ ์ด๋ ค์: ์ฑํ
๋ฐฉ๋ณ ์ ์์ ์ ๋ณด๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ผ ํจ
STOMP๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ๋ ๊ตฌ์กฐํ๋ ์ฑํ
์์คํ
๊ตฌํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๐ ๏ธ
3. STOMP ๋ฉ์์ง ๋ธ๋ก์ปค์ ํ์์ฑ
STOMP์ ๋ฉ์์ง ๋ธ๋ก์ปค๋ ์ฑํ
์์คํ
์ ํต์ฌ ์ญํ ์ ๋ด๋นํฉ๋๋ค:
- ํจ์จ์ ์ธ ๋ฉ์์ง ๋ผ์ฐํ
: ๊ตฌ๋
์์๊ฒ ์ ํํ๊ฒ ๋ฉ์์ง ์ ๋ฌ
- ์ฑํ
๋ฐฉ ๊ด๋ฆฌ ๊ฐ์ํ: ๊ตฌ๋
๊ธฐ๋ฐ์ผ๋ก ์๋ ๋ฉ์์ง ์ ๋ฌ
- ํ์ฅ์ฑ ํฅ์: ๋ค์์ ํด๋ผ์ด์ธํธ ์ฒ๋ฆฌ ์ฉ์ด
๊ทธ๋ฌ๋ STOMP ๋ด์ฅ ๋ธ๋ก์ปค๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์์ด, ์ถ๊ฐ์ ์ธ ์๋ฃจ์
์ด ํ์ํ์ต๋๋ค. ๐ค
4. Kafka vs RabbitMQ: ๋ฉ์์ง ๋ธ๋ก์ปค ์ ํ
Kafka๋ฅผ ์ ํํ์ต๋๋ค! ๊ทธ ์ด์ ๋:
- ๋์ ํ์ฅ์ฑ:
- ์ฌ์ด ๋ธ๋ก์ปค ์ถ๊ฐ
- ํํฐ์
๋์ ํตํ ๋ณ๋ ฌ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ์์ ์ฑ:
- ๋์คํฌ์ ์ง์์ ๋ฉ์์ง ์ ์ฅ
- ๋ฐ์ดํฐ ๋ณต์ ๋ก ์ ์ค ์ํ ์ต์ํ
- ๋์ฉ๋ ์ฒ๋ฆฌ: ๋๊ท๋ชจ ์ค์๊ฐ ๋ฉ์์ง์ ์ต์ ํ
RabbitMQ๋ ์ข์ ์ ํ์ด์ง๋ง, ์๊ตฌํ์ ํ๋ก์ ํธ์ ๊ท๋ชจ์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ ๋ Kafka๊ฐ ๋ ์ ํฉํ์ต๋๋ค. ๐
5. ์ฑํ
๋ฐ์ดํฐ ์ ์ฅ: MongoDB vs MySQL
์ฑํ
๋ฐ์ดํฐ ์ ์ฅ์๋ก MongoDB๋ฅผ ์ ํํ ์ด์ :
- ๋น์ ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ: ์ฑํ
๋ด์ฉ์ ๋ค์ํ ํ์ ์์ฉ
(ex) ์ด๋ชจํฐ์ฝ)
- ๋น ๋ฅธ ์ฝ๊ธฐ/์ฐ๊ธฐ: ์ค์๊ฐ ์ฑํ
์ ํ์์ ์ธ ๊ณ ์ฑ๋ฅ
- ํ์ฅ์ฑ: ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ๋ฆฌ
- ์ ์ฐํ ์คํค๋ง: ์ฑํ
๊ธฐ๋ฅ ํ์ฅ ์ ์ฉ์ด
(ex) ์ค๋ฉ)
MySQL๋ ์ข์ ์ ํ์ง์ด์ง๋ง, ์ฑํ
์๋น์ค์ ํน์ฑ์ MongoDB๊ฐ ๋ ์ ํฉํ๋ค๊ณ ํ๋จํ์ต๋๋ค. ๐
6. SSE(Server-Sent-Events)
์ดํ์ ์ฑํ
์๋ฆผ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํ SSE์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
SSE๋ ์๋ฒ์ ํ๋ฒ ์ฐ๊ฒฐ์ ๋งบ๊ณ ๋๋ฉด, ์ผ์ ์๊ฐ ๋์ ์๋ฒ์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ๋๋ง๋ค ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๋ฐฉ๋ฒ์
๋๋ค.

๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ฅผ ๊ตฌ๋
ํ๋ค.(SSE Connection์ ๋งบ๋๋ค.)
2. ์๋ฒ๋ ๋ณ๋์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ๊ตฌ๋
ํ ํด๋ผ์ด์ธํธ๋ค์๊ฒ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ค.
SSE๋ ์ํฉ์ ๋ฐ๋ผ์ ์๋ต๋ง๋ค ๋ค์ ์์ฒญ์ ํด์ผ ํ๋ Long Polling ๋ฐฉ์๋ณด๋ค ํจ์จ์ ์
๋๋ค. SSE๋ ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก text message๋ฅผ ๋ณด๋ด๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ธฐ์ ์ด๋ฉฐ HTTP์ persistent connections์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ HTML5 ํ์ค ๊ธฐ์ ์
๋๋ค.
ํ์ง๋ง HTTP๋ฅผ ํตํ SSE(HTTP/2๊ฐ ์๋ ๊ฒฝ์ฐ)๋ ๋ธ๋ผ์ฐ์ ๋น 6๊ฐ์ ์ฐ๊ฒฐ๋ก ์ ํ๋๋ฏ๋ก, ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ์ฌ๋ฌ ํญ์ ์ด๋ฉด ์ฒซ 6๊ฐ์ ํญ ์ดํ์๋ SSE๊ฐ ์๋ํ์ง ์๋๋ค๋ ๋จ์ ๋ ์๊ธด ํฉ๋๋ค. (HTTP/2์์๋ 100๊ฐ๊น์ง์ ์ ์์ ํ์ฉํฉ๋๋ค.)
ํ์ง๋ง ์ ๋ฐ์ ์ผ๋ก SSE๋ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํฌ๊ฒ ํต์ ํ ํ์ ์์ด ๋จ์ง ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ง ๋ฐ์์ผ ํ๋ ์ค์๊ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํ ๊ตฌํ์ด ํ์ํ ๋๋ ๋งค์ฐ ํ๋ฅญํ ์ ํ์
๋๋ค.
7. ์๋ฆผ ๊ธฐ๋ฅ์ SSE๋ฅผ ์ ํํ ์ด์
์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ์ SSE๋ฅผ ์ ํํ ์ด์ :
- ๋ฆฌ์์ค ํจ์จ์ฑ: ํด๋ง ๋ฐฉ์๋ณด๋ค ์๋ฒ ๋ถํ ๊ฐ์
- ์ค์๊ฐ์ฑ: ์ฆ๊ฐ์ ์ธ ์๋ฆผ ์ ๋ฌ ๊ฐ๋ฅ
- ๋จ์์ฑ: WebSocket๋ณด๋ค ๊ตฌํ๊ณผ ๊ด๋ฆฌ๊ฐ ์ฉ์ด
- ๋ธ๋ผ์ฐ์ ์ง์: ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ง์
WebSocket๋ ๊ณ ๋ คํ์ง๋ง, ์๋ฆผ์ ๋จ๋ฐฉํฅ ํน์ฑ์ ๊ณ ๋ คํ ๋ SSE๊ฐ ๋ ์ ํฉํ์ต๋๋ค. ๐
์ฐธ๊ณ
https://velog.io/@mw310/Stomp-WebSocket-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%ACver-Spring
https://dkswnkk.tistory.com/702
https://velog.io/@ch4570/Stomp-Kafka%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%B1%84%ED%8C%85-%EA%B8%B0%EB%8A%A5-%EA%B0%9C%EB%B0%9C%ED%95%98%EA%B8%B0-with-Spring-Boot-1-Kafka%EC%99%80-Stomp%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C
https://igotanoffer.com/blogs/tech/polling-sse-websockets-system-design-interview
https://jinjinyang.tistory.com/59