STOMP (ํ๋กํ ์ฝ)
STOMP๋? (Simple Text Oriented Messaging Protocol)
STOMP๋ ๊ฐ๋จํ ํ ์คํธ ๊ธฐ๋ฐ ๋ฉ์์ง ํ๋กํ ์ฝ์ด๋ค.
๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ํ์ฉํด์ pub/sub ๋ฐฉ์์ผ๋ก Client-Server๊ฐ ์ฝ๊ฒ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ํ๋กํ ์ฝ์ด๋ค.
๋ฉ์์ง ๋ธ๋ก์ปค: ๋ฐ์ ์์ ๋ฉ์์ง๋ฅผ ๋ฐ์์์ ์์ ์๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๊ฒ
pub/sub: ๋ฐ์ ์๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ฉด ์์ ์๋ค์ ๊ทธ๊ฒ์ ์์ ํ๋ ๋ฉ์์ง ํจ๋ฌ๋ค์

๋ฐ๋ผ์ STOMP๋ WebSocket ์์ ์น์ด์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ํ์(์๋ธ) ํ๋กํ ์ฝ์ด๋ค.
STOMP๋ฅผ ์ฌ์ฉํ๋ ์ด์ ? ์ฅ์ ?
WebSocket ํ๋กํ ์ฝ์ ๋ ๊ฐ์ง ์ ํ์ ๋ฉ์์ง๋ฅผ ์ ์ํ๋ค.
Text Frame: UTF-8๋ก ์ธ์ฝ๋ฉ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋ฉ์์ง์ด๋ค. ์ฃผ๋ก ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ๋๋ค.
Binary Frame: ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ๋ฉ์์ง๋ก ์ด๋ฏธ์ง, ๋น๋์ค, ํ์ผ ๋ฑ ํ ์คํธ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉ๋๋ค.
์ด๋ ๊ฒ ๋ ๊ฐ์ง ์ ํ์ ๋ฉ์์ง๋ฅผ ์ ์ํ๊ณ ์์ง๋ง, ๋ฉ์์ง์ ํ์์ด๋ ๊ตฌ์กฐ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๊ท์ ์ ์ ๊ณตํ์ง ์๋๋ค.
๋ฐ๋ผ์ ๋ฉ์์ง๋ฅผ ์ด๋ค ํ์์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ง ์ ํด์ง๊ฒ ์๊ธฐ ๋๋ฌธ์ ์ง์ ๋ณ๋์ ๊ตฌํ์ด ํ์ํ๋ค.
๋ฉ์์ง ํ์ ์ ์ (= ์ ํ๋ฆฌ์ผ์ด์ ์๊ตฌ์ฌํญ์ ๋ง๋ ๋ฉ์์ง ํฌ๋งท ์ ์), ex) json, xml ..
๋ฉ์์ง ํจํด ๊ตฌํ (pub/sub ๊ฐ์ ๋ฉ์์ง ํจํด์ด๋, ๋ผ์ฐํ ์ ๊ด๋ฆฌํ๋ ๋ก์ง ๋ฑ)
์ฐ๊ฒฐ ๋ฐ ์ธ์ ๊ด๋ฆฌ (์ธ์ ๊ด๋ฆฌ๋ ์ํ ์ ์ง๋ฅผ ์ํ ์ถ๊ฐ์ ์ธ ๊ตฌํ์ด ํ์)
๊ฐ๋ฐ์๋ Client-Server๊ฐ ์ด๋ ํ ํ์์ผ๋ก ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์์ง ์ ์ํ๊ณ ํ์ฑํ๋ ๋ก์ง์ ๊ตฌํํด์ผ ํ๋ค.
์ฆ WebSocket ํ๋กํ ์ฝ๋ง ์ฌ์ฉํด์ ์์ผ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด ํด๋น ๋ฉ์์ง๊ฐ ์ด๋ค ์์ฒญ์ธ์ง, ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋์ง์ ๋ฐ๋ผ์ ์ฑํ ๋ฐฉ๊ณผ ์ธ์ ์ ์ผ์ผ์ด ๊ตฌํํด์ผ ํ๊ณ ๋ฉ์์ง ๋ฐ์ก์ ๊ด๋ฆฌํ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค.
STOMP๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ํ์, ํ์ฑ ์ฝ๋๋ฅผ ๊ตฌํํ์ง ์์๋ ๋๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก pub/sub ๊ตฌ์กฐ๋ก ๋์ด์์ด์ ๋ฉ์์ง๋ฅผ ์ ์กํ๊ณ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ๋ถ๋ถ์ด ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ ๊ตฌํ์ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์๋ค.
STOMP๋ WebSocket ์์์ ๋์ํ๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ ์กํ ๋ฉ์์ง์ ์ ํ, ํ์, ๋ด์ฉ๋ค์ ์ ์ํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
Frame์ด๋ผ๊ณ ํด์"Command, body, Header"๋ก ๊ทธ ํ์์ ์ด๋ฏธ ์ ํด๋์๋ค.
์ด๋ฐ ์์ผ๋ก ๋ฉ์์ง์ ํค๋์ ๊ฐ์ ์ค ์ ์์ด์ ํค๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํต์ ์ ์ธ์ฆ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ STOMP ์คํ์ ์ ์ํ ๊ท์น์ ์งํค๋ฉด์ ์ฌ๋ฌ ์ธ์ด ๋ฐ ํ๋ซํผ ๊ฐ ๋ฉ์์ง๋ฅผ ์ํธ ์ด์ํ ์ ์๋ค.
STOMP์ Frame
STOMP๋ TCP ๋๋ WebSocket๊ณผ ๊ฐ์ ์๋ฐฉํฅ ๋คํธ์ํฌ ํ๋กํ ์ฝ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
HTTP์์ ๋ชจ๋ธ๋ง๋๋ Frame ๊ธฐ๋ฐ ํ๋กํ ์ฝ์ด๋ฉฐ, Frame์ ๋ช ๊ฐ์ Text Line์ผ๋ก ์ง์ ๋ ๊ตฌ์กฐ์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ผ์ธ์ Text์ด๋ค.
SEND, SUBSCRIBE, UNSUBSCRIBE, ACK ๋ฑ์ ๋ช ๋ น์ด๊ฐ ์๋ค.
์ดํ์ ๋ฑ์ฅํ๋ ๋ผ์ธ์ Key:Value ํํ๋ก Header์ ์ ๋ณด๋ฅผ ํฌํจํ๋ค. (์ฌ๋ฌ ๊ฐ์ ํค๋ ์กด์ฌ ๊ฐ๋ฅ)
destination, content-type, subscription ๋ฑ์ด ์๋ค.
ํค๋ ๋ค์์ผ๋ก๋ ๋น ๋ผ์ธ์ ์ถ๊ฐํ๊ณ ์ค์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ ๋ณธ๋ฌธ(Body, Payload)๊ฐ ์กด์ฌํ๋ค.
์ด ๊ตฌ์กฐ๋ HTTP ์์ฒญ ํ์๊ณผ ๋งค์ฐ ์ ์ฌํ๋ค.
Command: SEND, SUBSCRIBE๋ฅผ ์ง์ํ ์ ์๋ค.
Header: ๊ธฐ์กด์ WebSocket์ผ๋ก๋ ํํ์ด ๋ถ๊ฐ๋ฅ ํ์๋ header๋ฅผ ์์ฑํ ์ ์๋ค.
destination: ์ด ํค๋๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๊ตฌ๋ ํ ์ ์๋ค.
destination์ ์๋์ ์ผ๋ก ์ ๋ณด๋ฅด๋ฅด ๋ถ๋ถ๋ช ํ๊ฒ ์ ์ํ๋๋ฐ, ์ด๋ STOMP ๊ตฌํ์ฒด์์ ๋ฌธ์์ด ๊ตฌ๋ฌธ์ ๋ฐ๋ผ ์ง์ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋๋ก ํ๊ธฐ ์ํจ์ด๋ค. ๋ฐ๋ผ์ destination ์ ๋ณด๋ STOMP ์๋ฒ ๊ตฌํ์ฒด๋ง๋ค ๋ฌ๋ผ์ง ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์ ํ์์ ๋ฐ๋ฅธ๋ค.
ํด๋ผ์ด์ธํธ B์์ ์ฑํ ์ ๋ณด๋ด๋ ์์์ด๋ค.
STOMP๋ ๋ชจ๋ ๊ตฌ๋ ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ธ๋ก๋์บ์คํธ ํ๊ธฐ ์ํด MESSAGE COMMAND๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์๋ฒ๋ ๋ด์ฉ(roomId)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ Broker์๊ฒ ์ ๋ฌํ๋ค.
Spring์ด STOMP๋ฅผ ์ฌ์ฉํ ๋ ๋์ ํ๋ฆ

๋ฐ์ ์๋ ๊ตฌ๋ ์์๊ฒ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๊ณ ํ๋ค. ๊ตฌ๋ ์๋ค์ "/topic"์ด๋ผ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ค.
๋ฐ์ ์๋ endpoint์ "/topic"์ ๋ฃ์ด์ ๋ฐ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ์ ์์ง๋ง, "/app"์ด๋ผ๋ endpoint๋ก ๋ฉ์์ง๋ฅผ ์ก์ ํด์ ์๋ฒ ๋ด์์ ๋ฉ์์ง๋ฅผ ๊ฐ๊ณต, ์ฒ๋ฆฌ ํ ์ ์๋ค. ๊ฐ๊ณตํ ํ์๊ฐ ์์ผ๋ฉด ๋ธ๋ก์ปค๋ฅผ ํตํด ๋ฐ๋ก ๋ณด๋ด๋ ๋๋ค.
์๋ฒ๊ฐ ๊ฐ๊ณต์ ๋ง์น๋ฉด "/topic"์ด๋ผ๋ ๊ฒฝ๋ก์ ๋ด์ผ๋ฉด ๋ฉ์์ง๋ ๋ธ๋ก์ปค์๊ฒ ์ ๋ฌ๋๊ณ , ๋ฉ์์ง ๋ธ๋ก์ปค๋ "/topic"์ ๊ตฌ๋ ํ ๊ตฌ๋ ์์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
Last updated