์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ฆ‰์‹œ ์ „๋‹ฌ๋˜๊ณ , ์‰ฝ๊ฒŒ ๊ณผ๊ฑฐ ๊ธฐ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์†์ ์œผ๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์“ฐ๋ฉด ๋™์‹œ์„ฑ์ด ๋†’์€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‰ฝ๊ฒŒ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฉ”์‹œ์ง€์˜ ์‹ค์‹œ๊ฐ„์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋Š” ์—†๋‹ค"๋Š” ๊ฐœ๋…์„ ๊ณ ์ˆ˜ํ•˜์—ฌ ๋น„๋™๊ธฐ ์ €์žฅ์„ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ํ(MQ)๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์šฐ์•„ํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๋Š” ์ฆ‰๊ฐ์ ์ธ ์ „๋‹ฌ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € MQ์— ๋น ๋ฅด๊ฒŒ ๊ธฐ๋ก๋œ ๋‹ค์Œ, ์ „๋‹ด ์†Œ๋น„์ž ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ์—ด์—์„œ ๊บผ๋‚ด์ ธ ์›ํ™œํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Spring Boot 3์™€ ๋ฉ”์‹œ์ง€ ํ ๊ธฐ์ˆ ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ •์ ์ธ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ €์žฅ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

MQ ์†Œ๊ฐœ

์—ฌ๊ธฐ์„œ MQ์˜ ์ฃผ์š” ์—ญํ• ์€ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ์ฑ„ํŒ… ์ฝ˜ํ…์ธ ์˜ ์ €์žฅ ํ”„๋กœ์„ธ์Šค๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜๊ณ  ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ณต์žฅ๊ณผ ๋„๋งค์—…์ฒด ๊ฐ„์˜ ์ฃผ๋ฌธ ๊ด€๊ณ„๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์กด ๋ชจ๋ธ์—์„œ๋Š” ๊ณต์žฅ์—์„œ ์ œํ’ˆ์„ ์ถœํ•˜ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ ๋„๋งค์—…์ฒด์— ๊ฐœ๋ณ„์ ์œผ๋กœ ํ†ต์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ค‘๊ฐœ์ž๋กœ์„œ ๋ฉ”์‹œ์ง€ ํ๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์œผ๋กœ๋Š” ์ „๋ฌธ์ ์ธ ๋ฉ”์‹œ์ง€ ํ ์‹œ์Šคํ…œ(์˜ˆ: RabbitMQ, Kafka, RocketMQ ๋“ฑ), ๋ถ„์‚ฐ ์กฐ์ • ์„œ๋น„์Šค Zookeeper, Redis ๊ธฐ๋ฐ˜์˜ ๊ฒฝ๋Ÿ‰ ํ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

MQ ์„ ํƒ

๋งŽ์€ ๋ฉ”์‹œ์ง€ ํ ์ œํ’ˆ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ํŠน์„ฑ๊ณผ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ํ๊ฐœ๋ฐœ ์–ธ์–ดํŠน์ง•์ ์šฉ ๊ฐ€๋Šฅํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค
๋ž˜๋น— MQ๊ณ ๋žญ์„ฑ์ˆ™ํ•˜๊ณ  ์•ˆ์ •์ ์ด๋ฉฐ ๋ฐฐํฌ๊ฐ€ ์‰ฝ๊ณ  ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์ด ํ’๋ถ€ํ•˜๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Œ๋ณต์žกํ•œ ๋ผ์šฐํŒ… ์š”๊ตฌ ์‚ฌํ•ญ, ์ค‘์†Œ ๊ทœ๋ชจ ๋ฉ”์‹œ์ง€ ๋ณผ๋ฅจ ๋ฐ ์•ˆ์ •์„ฑ ๋ณด์žฅ์ด ํ•„์š”ํ•  ๋•Œ
์•กํ‹ฐ๋ธŒ MQ์ž๋ฐ”๊ตฌ์‹ MQ ๋ฐ JMS ๊ตฌํ˜„, ๋†’์€ ๋ฆฌ์†Œ์Šค ์†Œ๋ชจJava ์ƒํƒœ๊ณ„์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋œ ๊ธฐ์กด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
๋กœ์ผ“ MQ์ž๋ฐ”๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰, ๋‚ฎ์€ ์ง€์—ฐ ์‹œ๊ฐ„, ์žฌ์ •์  ์ˆ˜์ค€์˜ ์•ˆ์ •์„ฑ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ์Šคํ† ๋ฆฌ์ง€ ์ง€์›๋Œ€๊ทœ๋ชจ ์ธํ„ฐ๋„ท ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ ๊ธˆ์œต ๊ฒฐ์ œ ์‹œ๋‚˜๋ฆฌ์˜ค
์นดํ”„์นด์Šค์นผ๋ผ / ์ž๋ฐ”์ดˆ๊ณ ์ฒ˜๋ฆฌ๋Ÿ‰, ์ง€์†์„ฑ, ํŒŒํ‹ฐ์…˜ ์„ค๊ณ„, ์ŠคํŠธ๋ฆผ ์ฒ˜๋ฆฌ์— ๋Šฅ์ˆ™๋กœ๊ทธ ์ˆ˜์ง‘, ๋น…๋ฐ์ดํ„ฐ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„
์ œ๋กœ MQC++๊ฐ€๋ณ๊ณ  ๋ถ„์‚ฐํ™”๋œ ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์„ฑ๋Šฅ, ์ง€์—ฐ ๊ฐ„ ํ†ต์‹ ์ด ๋งค์šฐ ๋ฏผ๊ฐํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค
Redis ํC๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜, ๋‚ฎ์€ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ฐ„๋‹จํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค, ์ž„์‹œ ๋Œ€๊ธฐ์—ด ๋ฐ ๋‚ฎ์€ ์ง€์†์„ฑ ์š”๊ตฌ ์ƒํ™ฉ

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ €์žฅ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ๋ ค ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ RabbitMQ๋ฅผ ์ตœ์ข…์ ์œผ๋กœ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์„ฑ์ˆ™ํ•˜๊ณ  ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค: RabbitMQ๋Š” ์˜ค๋žœ ์—ญ์‚ฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ๊ฒ€์ฆ๋˜์—ˆ์œผ๋ฉฐ ์•ˆ์ •์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

  2. ์œ ์—ฐํ•œ ๋ผ์šฐํŒ…: ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์ •๊ตํ•œ ๋ผ์šฐํŒ…์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์Šค์œ„์น˜ ์œ ํ˜•๊ณผ ๋ฐ”์ธ๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  3. ํ†ตํ•ฉ์ด ์‰ฝ์Šต๋‹ˆ๋‹ค: Spring ์ƒํƒœ๊ณ„์™€ ๊ธด๋ฐ€ํ•˜๊ฒŒ ํ†ตํ•ฉ๋œ Spring Boot๋Š” ํฌ๊ด„์ ์ธ ์Šคํƒ€ํ„ฐ ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  4. ์šด์˜ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํŽธ๋ฆฌํ•จ: ๊ฐ„๋‹จํ•œ ๋ฐฐํฌ, ๋‚ด์žฅ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€๋ฆฌ ์šฉ์ด

  5. ์ปค๋ฎค๋‹ˆํ‹ฐ ์ง€์›: ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ํ’๋ถ€ํ•œ ๋ฌธ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kafka๋‚˜ RocketMQ๊ฐ€ ๊ทน๋„๋กœ ๋†’์€ ๋™์‹œ์„ฑ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋” ๋‚˜์€ ์ฒ˜๋ฆฌ๋Ÿ‰ ์„ฑ๋Šฅ์„ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ์˜ ์ดˆ์ ์ด ์‹œ์Šคํ…œ ๋ถ„๋ฆฌ๋ผ๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด RabbitMQ๋Š” ์ด๋ฏธ ๊ฐœ๋ฐœ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์„ ์ค„์ด๋Š” ๋™์‹œ์— ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ž˜ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ ์‹œ๋‚˜๋ฆฌ์˜ค

๋ฉ”์‹œ์ง€ ํ๋Š” ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋งŽ์€ ๊ณ ์ „์ ์ธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…(์˜ˆ: ์ด๋ฉ”์ผ ์ „์†ก ๋ฐ ๋กœ๊ทธ ์ฒ˜๋ฆฌ)์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

  • ์„ฑ๋Šฅ ํ–ฅ์ƒ: ๋น„๋™๊ธฐ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๊ณ  ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ–ฅ์ƒ๋˜์–ด ํŠนํžˆ I/O ์ง‘์•ฝ์  ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  • ์‹œ์Šคํ…œ ๋ถ„๋ฆฌ: ์„œ๋น„์Šค ๊ฐ„์˜ ์ง์ ‘์ ์ธ ์ข…์†์„ฑ์„ ์ค„์ด๊ณ , ์‹œ์Šคํ…œ์˜ ํƒ„๋ ฅ์„ฑ๊ณผ ์œ ์ง€๊ด€๋ฆฌ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ๋…๋ฆฝ์ ์ธ ํ™•์žฅ๊ณผ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  • ํ”ผํฌ ์‰์ด๋น™ ๋ฐ ๋ฐธ๋ฆฌ ํ•„๋ง: ํŠธ๋ž˜ํ”ฝ ํ”ผํฌ ๋™์•ˆ ๋ฉ”์‹œ์ง€ ํ๋Š” ์š”์ฒญ์„ ์บ์‹œํ•˜๊ณ  ์ฒ˜๋ฆฌ ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ์ ์ง„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ๊ณผ๋ถ€ํ•˜ ๋ฐ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ €์žฅ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ฃผ๋กœ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ์ €์žฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฑ„ํŒ… ๊ธฐ๋Šฅ์˜ ์‘๋‹ต ์†๋„๋ฅผ ๋ณด์žฅํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ˆ์ •์ ์œผ๋กœ ๋ณด๊ด€ํ•˜๊ณ  ์‹œ์Šคํ…œ์ด ๋ฉ”์‹œ์ง€ ํ”ผํฌ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

RabbitMQ ์†Œ๊ฐœ

RabbitMQ์—์„œ ๋ฉ”์‹œ์ง€์˜ ์ „์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กœ๋“€์„œ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ… ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๋‚ด๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋ฅผ MQ ๋ฉ”์‹œ์ง€๋กœ ์บก์Аํ™”ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ตํ™˜์†Œ๋กœ ์ „๋‹ฌ: ์ƒ์‚ฐ์ž๋Š” ์ง€์ •๋œ ๊ตํ™˜์†Œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ์Šค์œ„์น˜ ๋ผ์šฐํŒ… ์ „๋‹ฌ: Exchange๋Š” ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ… ํ‚ค์™€ ๋ฐ”์ธ๋”ฉ ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ๋Œ€๊ธฐ์—ด์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

    • ์ง์ ‘ ์Šค์œ„์น˜์ธ ๊ฒฝ์šฐ ๋ผ์šฐํŒ… ํ‚ค๋Š” ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
    • Fanout ์Šค์œ„์น˜์ธ ๊ฒฝ์šฐ ๋ชจ๋“  ๋ฐ”์šด๋“œ ํ์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค.
    • ํ† ํ”ฝ ์Šค์œ„์น˜์ธ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๋Š” ํŒจํ„ด์— ๋”ฐ๋ผ ์ผ์น˜๋ฉ๋‹ˆ๋‹ค.
  4. ๋Œ€๊ธฐ์—ด์— ์ €์žฅ: ์ ๊ฒฉ ๋Œ€๊ธฐ์—ด์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ €์žฅํ•˜๋ฉฐ ์†Œ๋น„์ž๊ฐ€ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

  5. ์†Œ๋น„์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค: ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค๋Š” ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†Œ๋น„์ž ์—ญํ• ์„ ํ•˜๋ฉฐ, ์ด๋Š” ํ‘ธ์‹œ ๋ชจ๋“œ๋‚˜ ํ’€ ๋ชจ๋“œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  6. ํ™•์ธ ์ฒ˜๋ฆฌ: ์†Œ๋น„์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ํ›„(์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ฑ„ํŒ… ๋‚ด์šฉ ์ €์žฅ) RabbitMQ์— ํ™•์ธ(ACK)์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  7. ๋ฉ”์‹œ์ง€ ์‚ญ์ œ: ํ™•์ธ์„ ๋ฐ›์€ ํ›„ RabbitMQ๋Š” ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

RabbitMQ ์„ค์น˜

RabbitMQ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Docker๋Š” ๊ฐ€์žฅ ํŽธ๋ฆฌํ•œ ๋ฐฐํฌ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RabbitMQ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1. ์ด๋ฏธ์ง€๋ฅผ ๋Œ์–ด์˜ค์„ธ์š”

๋จผ์ € Docker Hub์—์„œ RabbitMQ ๊ณต์‹ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
management์ดํ›„์˜ ์‹œ๊ฐ์  ์ž‘์—… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ์›น ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํฌํ•จ๋œ ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๋ฒ„์ „์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

docker pull rabbitmq:4.1-management

ํŒ: ๋…์ž๋Š” Docker Hub๋ฅผ ๋ฐฉ๋ฌธํ•˜์—ฌ ์—ฐ์Šตํ•  ๋•Œ ์ตœ์‹  ๋ฒ„์ „์„ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ๋‹ค์Œ ๋ช…๋ น์œผ๋กœ RabbitMQ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

docker run --name rabbitmq -p 5681:5671 -p 5682:5672 -p 4379:4369 -p 15681:15671 -p 15682:15672 -p 25682:25672 --restart always -d rabbitmq:4.1-management

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งคํ•‘๊ณผ ๊ตฌ์„ฑ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

  • AMQP ํฌํŠธ(5672)์™€ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค ํฌํŠธ(15672)๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • RabbitMQ๊ฐ€ ์„œ๋ฒ„๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋œ ํ›„ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋„๋ก ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค(--restart always).
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค(-d)

3. ์„ค์น˜ ํ™•์ธ

์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘ํ•œ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://127.0.0.1:15682 RabbitMQ ๊ด€๋ฆฌ ์ฝ˜์†”์— ์•ก์„ธ์Šคํ•˜์—ฌ ์—ฝ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ(๋‘˜ ๋‹ค guest)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธํ•˜์„ธ์š”.

๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด RabbitMQ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ ์Šค์œ„์น˜์™€ ๋Œ€๊ธฐ์—ด์„ ์ƒ์„ฑํ•˜๊ณ , ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ๋ณด๊ณ , ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ง€ํ‘œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๊ธฐ๋ณธ ๊ฒŒ์ŠคํŠธ ์‚ฌ์šฉ์ž๋Š” ๋กœ์ปฌํ˜ธ์ŠคํŠธ์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›๊ฒฉ ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค๊ณ  ์ ์ ˆํ•œ ๊ถŒํ•œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Spring Boot๋Š” RabbitMQ๋ฅผ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค

์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ๋ฉ”์‹œ์ง€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์˜ ์ฑ„ํŒ… ์„œ๋น„์Šค๋Š” ์ด์ „ ๋ฌธ์„œ "Java ์—”์ง€๋‹ˆ์–ด ๊ณ ๊ธ‰ ํ•„์ˆ˜ ์‚ฌํ•ญ: Spring Boot 3 + Netty๋ฅผ ์ด์šฉํ•œ ๋†’์€ ๋™์‹œ์„ฑ ์ธ์Šคํ„ดํŠธ ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค ๊ตฌ์ถ•"์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€์‹ฌ ์žˆ๋Š” ๋…์ž๋Š” ํ™•์ธํ•ด ๋ณด์„ธ์š”.

1. chat_message โ€” ๋ฉ”์‹œ์ง€ ๊ธฐ๋ณธ ์ •๋ณด

DROP TABLE IF EXISTS `chat_message`;
CREATE TABLE `chat_message` (
  `id` VARCHAR(32) NOT NULL COMMENT '๋ฉ”์‹œ์ง€ ๊ณ ์œ  ID',
  `sender_id` VARCHAR(32) NOT NULL COMMENT '๋ณด๋‚ธ ์‚ฌ๋žŒ ์‚ฌ์šฉ์ž ID',
  `receiver_id` VARCHAR(32) NOT NULL COMMENT '๋ฐ›๋Š” ์‚ฌ๋žŒ ์‚ฌ์šฉ์ž ID',
  `receiver_type` INT NULL DEFAULT NULL COMMENT '์ˆ˜์‹ ์ž ์œ ํ˜• (์˜ˆ: ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน ๋“ฑ)',
  `msg_type` INT NOT NULL COMMENT '๋ฉ”์‹œ์ง€ ์œ ํ˜• (์˜ˆ: ํ…์ŠคํŠธ, ์ด๋ฏธ์ง€, ๋น„๋””์˜ค ๋“ฑ)',
  `msg` VARCHAR(255) NOT NULL COMMENT 'ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ',
  `chat_time` DATETIME NOT NULL COMMENT '์ฑ„ํŒ… ์‹œ๊ฐ„ (๋ณด๋‚ธ ์‹œ๊ฐ„๊ณผ ๋ฐ›์€ ์‹œ๊ฐ„ ๋™์ผ)',
  `show_msg_date_time_flag` INT NULL DEFAULT NULL COMMENT '๋ฉ”์‹œ์ง€ ์‹œ๊ฐ„ ํ‘œ์‹œ ์—ฌ๋ถ€ ํ”Œ๋ž˜๊ทธ (1๋ถ„ ์ด์ƒ ๊ฐ„๊ฒฉ์šฉ)',
  `is_read` TINYINT(1) NULL DEFAULT NULL COMMENT '์ฝ์Œ ์—ฌ๋ถ€ (1: ์ฝ์Œ, 0: ์•ˆ ์ฝ์Œ)',
  PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '๊ธฐ๋ณธ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ํ…Œ์ด๋ธ”';

2. chat_message_video โ€” ๋ฉ”์‹œ์ง€ ํƒ€์ž…์ด ๋น„๋””์˜ค์ผ ๋•Œ ์ƒ์„ธ ์ •๋ณด

DROP TABLE IF EXISTS `chat_message_video`;
CREATE TABLE `chat_message_video` (
  `message_id` VARCHAR(32) NOT NULL COMMENT '์—ฐ๊ฒฐ๋œ ๋ฉ”์‹œ์ง€ ID',
  `video_path` VARCHAR(128) NULL DEFAULT NULL COMMENT '๋น„๋””์˜ค ํŒŒ์ผ ๊ฒฝ๋กœ',
  `video_width` INT NULL DEFAULT NULL COMMENT '๋น„๋””์˜ค ํญ(px)',
  `video_height` INT NULL DEFAULT NULL COMMENT '๋น„๋””์˜ค ๋†’์ด(px)',
  `video_times` INT NULL DEFAULT NULL COMMENT '๋น„๋””์˜ค ์žฌ์ƒ ์‹œ๊ฐ„(์ดˆ)',
  PRIMARY KEY (`message_id`),
  CONSTRAINT `fk_video_message` FOREIGN KEY (`message_id`) REFERENCES `chat_message`(`id`) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '๋น„๋””์˜ค ๋ฉ”์‹œ์ง€ ์ƒ์„ธ ํ…Œ์ด๋ธ”';

3. chat_message_voice โ€” ๋ฉ”์‹œ์ง€ ํƒ€์ž…์ด ์Œ์„ฑ์ผ ๋•Œ ์ƒ์„ธ ์ •๋ณด

DROP TABLE IF EXISTS `chat_message_voice`;
CREATE TABLE `chat_message_voice` (
  `message_id` VARCHAR(32) NOT NULL COMMENT '์—ฐ๊ฒฐ๋œ ๋ฉ”์‹œ์ง€ ID',
  `voice_path` VARCHAR(128) NULL DEFAULT NULL COMMENT '์Œ์„ฑ ํŒŒ์ผ ๊ฒฝ๋กœ',
  `speak_voice_duration` INT NULL DEFAULT NULL COMMENT '์Œ์„ฑ ์žฌ์ƒ ์‹œ๊ฐ„(์ดˆ)',
  PRIMARY KEY (`message_id`),
  CONSTRAINT `fk_voice_message` FOREIGN KEY (`message_id`) REFERENCES `chat_message`(`id`) ON DELETE CASCADE
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '์Œ์„ฑ ๋ฉ”์‹œ์ง€ ์ƒ์„ธ ํ…Œ์ด๋ธ”';

์ข…์†์„ฑ ๊ฐ€์ ธ์˜ค๊ธฐ

๋จผ์ €, pom.xml ํ”„๋กœ์ ํŠธ์˜ ์ €์žฅ์†Œ ํŒŒ์ผ์— RabbitMQ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

๊ตฌ์„ฑ ์ถ”๊ฐ€

spring:  
  rabbitmq:
    host: 127.0.0.1
    port: 5682
    username: guest
    password: guest
    virtual-host: /

์ž‘๊ฐ€ ํ”„๋กœ๋“€์„œ

RabbitMQ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ๊ฒŒ์‹œ์ž ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

import com.sleekydz.model.netty.ChatMsg;
import com.sleekydz.utils.JsonUtils;

public class MessagePublisher {

    // ๊ตํ™˜๊ธฐ ์ด๋ฆ„ ์ •์˜
    public static final String EXCHANGE = "sleekydz86_exchange";

    // ํ ์ด๋ฆ„ ์ •์˜
    public static final String QUEUE = "sleekydz86_queue";

    // ๋ฉ”์‹œ์ง€๋ฅผ ํ๋กœ ์ „์†กํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์šฐํŒ… ํ‚ค
    public static final String ROUTING_KEY_SEND = "sleekydz86.kakao.send";

    // ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ
    public static void sendMsgToSave(ChatMsg msg) throws Exception {
        RabbitMQConnectUtils connectUtils = new RabbitMQConnectUtils();
        connectUtils.sendMsg(JsonUtils.objectToJson(msg),
                EXCHANGE,
                ROUTING_KEY_SEND);
    }
}

๋ฉ”์‹œ์ง€ ์ „์†ก์„ ์œ„ํ•œ ๋„๊ตฌ ํด๋ž˜์Šค ์ž‘์„ฑ

import com.rabbitmq.client.*;

import java.util.ArrayList;
import java.util.List;

public class RabbitMQConnectUtils {

    private final List<Connection> connections = new ArrayList<>();
    private final int maxConnection = 20;

    // ๊ฐœ๋ฐœํ™˜๊ฒฝ dev
    private final String host = "59.45.23.1";
    private final int port = 5682;
    private final String username = "guest";
    private final String password = "guest";
    private final String virtualHost = "/";

    public ConnectionFactory factory;

    public ConnectionFactory getRabbitMqConnection() {
        return getFactory();
    }

    public ConnectionFactory getFactory() {
        initFactory();
        return factory;
    }

    private void initFactory() {
        try {
            if (factory == null) {
                factory = new ConnectionFactory();
                factory.setHost(host);
                factory.setPort(port);
                factory.setUsername(username);
                factory.setPassword(password);
                factory.setVirtualHost(virtualHost);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void sendMsg(String message, String queue) throws Exception {
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        channel.basicPublish("",
                            queue,
                            MessageProperties.PERSISTENT_TEXT_PLAIN,
                            message.getBytes("utf-8"));
        channel.close();
        setConnection(connection);
    }

    public void sendMsg(String message, String exchange, String routingKey) throws Exception {
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        channel.basicPublish(exchange,
                            routingKey,
                            MessageProperties.PERSISTENT_TEXT_PLAIN,
                            message.getBytes("utf-8"));
        channel.close();
        setConnection(connection);
    }

    public GetResponse basicGet(String queue, boolean autoAck) throws Exception {
        GetResponse getResponse = null;
        Connection connection = getConnection();
        Channel channel = connection.createChannel();
        getResponse = channel.basicGet(queue, autoAck);
        channel.close();
        setConnection(connection);
        return getResponse;
    }

    public Connection getConnection() throws Exception {
        return getAndSetConnection(true, null);
    }

    public void setConnection(Connection connection) throws Exception {
        getAndSetConnection(false, connection);
    }

    private synchronized Connection getAndSetConnection(boolean isGet, Connection connection) throws Exception {
        getRabbitMqConnection();

        if (isGet) {
            if (connections.isEmpty()) {
                return factory.newConnection();
            }
            Connection newConnection = connections.get(0);
            connections.remove(0);
            if (newConnection.isOpen()) {
                return newConnection;
            } else {
                return factory.newConnection();
            }
        } else {
            if (connections.size() < maxConnection) {
                connections.add(connection);
            }
            return null;
        }
    }

}

์†Œ๋น„์ž ์“ฐ๊ธฐ

๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์‹œ์ง€ ์†Œ๋น„์ž ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

import com.sleekydz.model.netty.ChatMsg;
import com.sleekydz.service.ChatMessageService;
import com.sleekydz.utils.JsonUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

// ๋ฉ”์‹œ์ง€ ์†Œ๋น„์ž ํด๋ž˜์Šค
@Component
@Slf4j
public class RabbitMQConsumer {

    @Resource
    private ChatMessageService chatMessageService;

    // ์ง€์ •๋œ ํ(RabbitMQConfig.QUEUE)์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋ฉ”์„œ๋“œ
    @RabbitListener(queues = {RabbitMQConfig.QUEUE})
    public void watchQueue(String payload, Message message) {
        String routingKey = message.getMessageProperties().getReceivedRoutingKey();
        log.info("์ˆ˜์‹ ๋œ routingKey = {}", routingKey);

        // ๋ฉ”์‹œ์ง€ ๋ฐœ์‹  ๋ผ์šฐํŒ… ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ
        if (routingKey.equals(RabbitMQConfig.ROUTING_KEY_SEND)) {
            String msg = payload;
            ChatMsg chatMsg = JsonUtils.jsonToPojo(msg, ChatMsg.class);

            // ๋ฉ”์‹œ์ง€๋ฅผ DB์— ์ €์žฅ
            chatMessageService.saveMsg(chatMsg);
        }
    }
}

์ •๋ฆฌ

RabbitMQ๋ฅผ Spring Boot์™€ ํ†ตํ•ฉํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ณ , ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€์˜ ์ €์žฅ ์ž‘์—…์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ RabbitMQ๋กœ ๋ณด๋‚ด๊ณ , ์ด ๋ฉ”์‹œ์ง€๋Š” ์†Œ๋น„์ž์— ์˜ํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง์ ‘ ์šด์˜ํ•จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
๊พธ์ค€ํžˆ, ์˜๋ฏธ์žˆ๋Š” ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜๊ณผ ๋ฌธ์ œํ•ด๊ฒฐ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๊ธฐ ์œ„ํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€