๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TECH STACK REVIEW/๐Ÿ’ฌ WEB SOCKET

STOMP์™€ ์›น์†Œ์ผ“์„ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง•

by SSOLVED 2025. 3. 6.

๊ฐœ์š”


์›น์†Œ์ผ“๋งŒ์„ ์ด์šฉํ•ด ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค ํ–ˆ์„ ๋•Œ, ์—ฌ๋Ÿฌ ์ œ์•ฝ์ด ์žˆ์Œ์„ ๋А๊ผˆ๋‹ค. ์›น์†Œ์ผ“ ์ž์ฒด์—๋Š” ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ทœ์น™์ด ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์•„ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ๊ณ , PUB/SUB ๊ฐœ๋…์ด ์—†์–ด ํŠน์ • ์‚ฌ์šฉ์ž๋‚˜ ๊ทธ๋ฃน์„ ๋Œ€์ƒ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด STOMP๋ฅผ ๋„์ž…ํ–ˆ์ง€๋งŒ, ์ดˆ๊ธฐ ์„ค์ • ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์—ฌ๋Ÿฌ ์‹œํ–‰์ฐฉ์˜ค์™€ ๊ฐœ๋… ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋“ค์„ ๊ฒฝํ—˜ํ–ˆ๋‹ค.

์ด์— STOMP์˜ ๊ฐœ๋…๊ณผ ๋™์ž‘ ๋ฐฉ์‹์„ ๊นŠ์ด ์žˆ๊ฒŒ ํ•™์Šตํ•˜์—ฌ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

 

 

์›น์†Œ์ผ“๋งŒ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ์ด์œ 


์›น์†Œ์ผ“์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•˜๋Š” ์ €์ˆ˜์ค€ ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

ํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ „์†ก ์ฑ„๋„์ผ ๋ฟ, ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…, ๊ทธ๋ฃน ๊ด€๋ฆฌ(PUB/SUB), ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ ์ •์˜ ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•˜๋‹ค.

 

์›น์†Œ์ผ“์ด ๊ฐ€์ง„ ํ•œ๊ณ„

 

๏น’ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…, Routing: ํŠน์ • ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ๊ทธ๋ฃน(์ฑ„๋„)์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†๋‹ค.

๏น’ ๋ฉ”์‹œ์ง€ ํฌ๋งท ์ •์˜ ๋ถ€์กฑ: ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ์ „์†กํ•  ๋ฐ์ดํ„ฐ์˜ ํฌ๋งท์„ ์ •์˜ํ•˜๋Š” ํ‘œ์ค€์ด ์—†๋‹ค.

๏น’ ๊ตฌ๋…(Publish-Subscribe) ๋ชจ๋ธ ๋ฏธ์ง€์›: PUB/SUB ๋ชจ๋ธ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด STOMP, Simple Text Oriented Messaging Protocol์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

 

 

STOMP๋ž€?


STOMP๋Š” ์›น์†Œ์ผ“ ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ๋กœ, ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ… ๋ฐ PUB/SUB ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ๊ณ ์ˆ˜์ค€ ๋ฉ”์‹œ์ง• ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

์ฆ‰, ์›น์†Œ์ผ“์€ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ํ†ต๋กœ์ด๋ฉฐ, STOMP๋Š” ๊ทธ ์œ„์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„์ง€ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.

 

 

STOMP๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฃผ์š” ๊ธฐ๋Šฅ

 

1. ๋ฉ”์‹œ์ง€์˜ ๋ชฉ์ ์ง€(destination) ์ง€์ •

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ์ฑ„๋„(”/topic/chat”)์„ ๊ตฌ๋…ํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

2. Pub/Sub ๋ชจ๋ธ ์ง€์›

 

๏น’ STOMP๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ™์€ ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๊ณ , ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์ฑ„๋„๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

3. ๋ฉ”์‹œ์ง€ ํ—ค๋” ์ง€์›

 

๏น’ HTTP ํ—ค๋”์ฒ˜๋Ÿผ, STOMP ๋ฉ”์‹œ์ง€์—๋„ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

4. ACK(ํ™•์ธ ์‘๋‹ต) ์ง€์›

 

๏น’ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ ํ›„, ์ˆ˜์‹  ํ™•์ธ(Acknowledgment, ACK)์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

STOMP์˜ ๋™์ž‘ ๊ตฌ์กฐ (PUB/SUB ๋ชจ๋ธ)


์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ, ๋ฐœํ–‰์ž(Publisher)๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ธŒ๋กœ์ปค(Broker)์— ์ „์†กํ•˜๋ฉด, ์ด๋ฅผ ๊ตฌ๋…์ž(Subscriber)๋“ค์ด๋ฐ›์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์— ์ง์ ‘ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ, ํŠน์ • ์ฑ„๋„(Topic)์„ ๊ตฌ๋…ํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

 

๏น’ Publisher(๋ฐœํ–‰์ž)๊ฐ€ ํŠน์ • ์ฃผ์ œ(Topic)๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค.

๏น’ Broker(์ค‘์•™ ๋ฉ”์‹œ์ง€ ๊ด€๋ฆฌ์ž)๋Š” ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.

๏น’ Subscriber(๊ตฌ๋…์ž)๋Š” ํ•ด๋‹น ํ† ํ”ฝ์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜์‹ ํ•œ๋‹ค.

 

์ด์ฒ˜๋Ÿผ, STOMP๋Š” ์›น์†Œ์ผ“์„ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ชฉ์ ์ง€(ํ† ํ”ฝ)๋กœ ๋ถ„๋ฐฐํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

STOMP ๋ฉ”์‹œ์ง€ ํ”„๋ ˆ์ž„ ๊ตฌ์กฐ


STOMP๋Š” ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ์ฝœ๋กœ, ํ”„๋ ˆ์ž„์ด๋ผ๋Š” ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•œ๋‹ค.

 

[ STOMP ๋ฉ”์‹œ์ง€ ๊ธฐ๋ณธ ๊ตฌ์กฐ ]

๏น’ COMMAND: ํ•ด๋‹น ํ”„๋ ˆ์ž„์ด ์ˆ˜ํ–‰ํ•  ๋™์ž‘ (CONNECT, SEND, SUBSCRIBE ๋“ฑ)

๏น’ Header: ์ถ”๊ฐ€์ ์ธ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(๋ชฉ์ ์ง€, ๋ฉ”์‹œ์ง€ ID ๋“ฑ)

๏น’ Body: ๋ฉ”์‹œ์ง€์˜ ์‹ค์ œ ๋‚ด์šฉ

๏น’ ^@(NULL ๋ฌธ์ž): STOMP ํ”„๋ ˆ์ž„์˜ ๋์„ ์˜๋ฏธ

 

 

STOMP์˜ ํ•ธ๋“œ์…ฐ์ดํฌ ๊ณผ์ •

 

์›น์†Œ์ผ“๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, STOMP๋„ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •(ํ•ธ๋“œ์…ฐ์ดํฌ)์ด ํ•„์š”ํ•˜๋‹ค.

์ด ๊ณผ์ •์—์„œ ์ฃผ์š”ํ•œ STOMP ํ”„๋ ˆ์ž„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

1. ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์š”์ฒญ, CONNECT

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ STOMP ์„œ๋ฒ„์— ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ์›น์†Œ์ผ“์˜ Upgrade: websocket ์š”์ฒญ๊ณผ ์œ ์‚ฌํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

2. ์„œ๋ฒ„์˜ ์—ฐ๊ฒฐ ์Šน์ธ, CONNECTED

 

๏น’ ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์„ ์Šน์ธํ•˜๋ฉด CONNECTED ํ”„๋ ˆ์ž„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๏น’ ์›น์†Œ์ผ“์˜ 101 Switching Protocols ์‘๋‹ต๊ณผ ์œ ์‚ฌํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

 

3. ํŠน์ • ์ฃผ์ œ ๊ตฌ๋… ์š”์ฒญ, SUBSCRIBE

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ์ฑ„๋„(Topic)์„ ๊ตฌ๋…ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ํด๋ผ์ด์–ธํŠธ๋Š” “/topic/chat”์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

4. ๋ฉ”์‹œ์ง€ ์ „์†ก, SEND

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํŠน์ • ์ฑ„๋„๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค.

 

 

 

5. ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ , MESSAGE

 

๏น’ ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋… ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ๊ตฌ๋…ํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค.

 

 

 

6. ๊ตฌ๋… ํ•ด์ œ, UNSUBSCRIBE

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ตฌ๋…์„ ์ทจ์†Œํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ๊ตฌ๋…์„ ์ค‘๋‹จํ•˜๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋” ์ด์ƒ ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ๋‹ค.

 

 

 

7. ์—ฐ๊ฒฐ ์ข…๋ฃŒ, DISCONNECT

 

๏น’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๏น’ ์›น์†Œ์ผ“์˜ socket.close( ) ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

 

 

STOMP์™€ ์›น์†Œ์ผ“์˜ ๊ด€๊ณ„


STOMP๋Š” ์›น์†Œ์ผ“์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ƒ์œ„ ํ”„๋กœํ† ์ฝœ๋กœ, ์›น์†Œ์ผ“์ด ํ†ต์‹ ์„ ์œ„ํ•œ ์ €์ˆ˜์ค€ ์—ฐ๊ฒฐ์„ ์ œ๊ณตํ•˜๋ฉด, STOMP๋Š” ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง•์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ์›น์†Œ์ผ“ ์—†์ด STOMP๋Š” ๋‹จ๋…์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์—†๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์€ STOMP๊ฐ€ ์›น์†Œ์ผ“ ์œ„์—์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

๏น’ TCP/IP Network Layer: ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•œ๋‹ค.

๏น’ WebSocket Communication: ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์‹ค์‹œ๊ฐ„ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

๏น’ STOMP Messaging Layer: ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…, PUB/SUB, ACKC ๋“ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

๏น’ Web Application: UI๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๋Š” ์ตœ์ƒ์œ„ ๊ณ„์ธต์ด๋‹ค.

 

STOMP๋Š” ์›น์†Œ์ผ“์ด ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ฉ”์‹œ์ง• ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ์ฒด๊ณ„์ ์ธ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง•์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

์›น์†Œ์ผ“์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๊ณ , STOMP๊ฐ€ ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ชฉ์ ์ง€์— ๋”ฐ๋ผ ๋ผ์šฐํŒ…ํ•˜๊ณ , PUB/SUB์„ ์ง€์›ํ•˜๋ฉฐ, ๋ฉ”์‹œ์ง€ ํ™•์ธ(ACK) ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

 

๋”ฐ๋ผ์„œ ์›น์†Œ์ผ“๋งŒ์œผ๋กœ ๊ตฌํ˜„์ด ์–ด๋ ค์šด ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์•Œ๋ฆผ ์‹œ์Šคํ…œ, ์ฃผ์‹ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๊ฐ™์€ ์„œ๋น„์Šค์—์„œ STOMP๋Š” ํ•„์ˆ˜์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค.

'TECH STACK REVIEW > ๐Ÿ’ฌ WEB SOCKET' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์›น์†Œ์ผ“ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ  (0) 2024.11.23