Spring๐Ÿƒ

Event Programming in Spring : Kafka vs Spring Message Broker vs Spring Application Events

wannaDevelopIt 2026. 7. 22. 14:58

1. ์นดํ”„์นด (Kafka)
์„ฑ๊ฒฉ: ์™ธ๋ถ€์˜ ๋ถ„์‚ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ (Distributed Streaming Platform)์ด์ž ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค

๋ฒ”์œ„: ์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ (Inter-application) ๋˜๋Š” ์„œ๋น„์Šค ๊ฐ„ (Inter-service) ํ†ต์‹ ์— ์‚ฌ์šฉ

์ฆ‰, ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ์ ํ•ฉํ•˜๋‹ค

ํŠน์ง•:

- ์˜์†์„ฑ (Persistence): ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜์—ฌ ์˜์†์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค. ์ปจ์Šˆ๋จธ๊ฐ€ ๋‹ค์šด๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ๋†“์นœ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
- ํ™•์žฅ์„ฑ (Scalability): ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ๋‹ค. ์—ฌ๋Ÿฌ ๋ธŒ๋กœ์ปค๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ†ตํ•ด ์ˆ˜ํ‰ ํ™•์žฅ์ด ์šฉ์ดํ•˜๋‹ค.
- ๋‚ด๊ฒฐํ•จ์„ฑ (Fault Tolerance): ๋ธŒ๋กœ์ปค ์ค‘ ์ผ๋ถ€๊ฐ€ ์‹คํŒจํ•ด๋„ ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ์ค‘๋‹จ๋˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค
- ๋น„๋™๊ธฐ (Asynchronous): ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ์ชฝ๊ณผ ์†Œ๋น„ํ•˜๋Š” ์ชฝ์ด ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค
- ๋ณต์žก์„ฑ: ๋ณ„๋„์˜ ์นดํ”„์นด ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” spring-kafka ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ์—ฐ๋™ํ•œ๋‹ค

 

2. Spring Simple Broker

์„ฑ๊ฒฉ: Spring Framework(Spring Messaging) ๋‚ด๋ถ€์—์„œ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ์ธ-๋ฉ”๋ชจ๋ฆฌ(In-memory) ์›น์†Œ์ผ“ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค (Embedded Message Broker)

๋ฒ”์œ„: ์ฃผ๋กœ ํด๋ผ์ด์–ธํŠธ ↔ ์„œ๋ฒ„ ๊ฐ„ (Client-to-Server / Server-to-Client) ์‹ค์‹œ๊ฐ„ ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ Mobile App ๊ฐ™์€ ์™ธ๋ถ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ STOMP ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ(Push)ํ•  ๋•Œ ์ ํ•ฉํ•˜๋‹ค.

ํŠน์ง•:

  • ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  (WebSocket/STOMP): ์›น์†Œ์ผ“ ์„ธ์…˜์„ ๋งบ์€ ํด๋ผ์ด์–ธํŠธ๋“ค์ด ํŠน์ • ๊ฒฝ๋กœ(์˜ˆ: /topic/chat)๋ฅผ ๊ตฌ๋…(Subscribe)ํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋Š” ์ˆœ๊ฐ„ ์ฆ‰์‹œ ํด๋ผ์ด์–ธํŠธ ํ™”๋ฉด์œผ๋กœ ์ „์†ก๋œ๋‹ค.
  • ๋น„์˜์†์„ฑ (Non-persistent): ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ๋‚˜ ๋ณ„๋„ ๊ณต๊ฐ„์— ๋ณด๊ด€ํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„ RAM(๋ฉ”๋ชจ๋ฆฌ)์—์„œ ๋ฐ”๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ „๋‹ฌ๋˜๋Š” ์ˆœ๊ฐ„ ์†Œ๋ฉธํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ ์ ‘์†์ด ๋Š๊ฒจ ์žˆ๋Š” ๋™์•ˆ ๋ฐœ์ƒํ•œ ๋ฉ”์‹œ์ง€๋Š” ์œ ์‹ค๋œ๋‹ค.
  • ๋‹จ์ˆœ์„ฑ (Simplicity): ๋ณ„๋„์˜ ๋ธŒ๋กœ์ปค ์„œ๋ฒ„(RabbitMQ, ActiveMQ ๋“ฑ)๋ฅผ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด Spring Boot ํ™˜๊ฒฝ์—์„œ SimpleBrokerSpec ์„ค์ •๋งŒ์œผ๋กœ ์ฆ‰์‹œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์ œ์•ฝ (Scale-Out ํ•œ๊ณ„): ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€(Multi-instance)๋กœ ํ™•์žฅ๋  ๊ฒฝ์šฐ, 1๋ฒˆ ์„œ๋ฒ„์˜ Simple Broker์™€ 2๋ฒˆ ์„œ๋ฒ„์˜ Simple Broker๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ๊ฐ„ ๋ฉ”์‹œ์ง€๊ฐ€ ๊ต์ฐจ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค. (์ด ๊ฒฝ์šฐ RabbitMQ ๊ฐ™์€ External Broker๋กœ ๊ต์ฒดํ•ด์•ผ ํ•จ)


3. Spring Application Events
์„ฑ๊ฒฉ: Spring ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€์— ๋‚ด์žฅ๋œ ์ธ-ํ”„๋กœ์„ธ์Šค (In-process) ๋ฉ”์‹œ์ง• ๋ฉ”์ปค๋‹ˆ์ฆ˜

๋ฒ”์œ„: ์ฃผ๋กœ ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€ (Intra-application)์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹ ์— ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, ๊ฐ™์€ JVM ๋‚ด์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ์†Œ๋น„ํ•œ๋‹ค

ํŠน์ง•:
- ๋น„์˜์†์„ฑ (Non-persistent): ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ„๋„๋กœ ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœํ–‰๋  ๋•Œ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‹คํŒจํ•˜๋ฉด ๋ฉ”์‹œ์ง€๋Š” ์œ ์‹ค๋œ๋‹ค
- ๋‹จ์ˆœ์„ฑ (Simplicity): Spring ํ”„๋ ˆ์ž„์›Œํฌ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด ๋ณ„๋„์˜ ์„ค์ •์ด๋‚˜ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์—†์ด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. @EventListener์™€ ApplicationEventPublisher๋งŒ์œผ๋กœ ๊ตฌํ˜„๋œ๋‹ค
- ๋™๊ธฐ/๋น„๋™๊ธฐ: ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, @Async ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
- ํ™•์žฅ์„ฑ/๋‚ด๊ฒฐํ•จ์„ฑ: ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค์˜ ๋ฒ”์œ„ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ, ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ํ™•์žฅ์„ฑ์ด๋‚˜ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค

 

  ์นดํ”„์นด (Kafka) Spring Simple Broker Spring Application Events
๋ฒ”์œ„ ์„œ๋ฒ„ ↔ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹  (๋ถ„์‚ฐ ํ™˜๊ฒฝ) ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ฐ„ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „์†ก (WebSocket/STOMP) ๋‹จ์ผ JVM ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ํ†ต์‹ 
์˜์†์„ฑ ๋ฉ”์‹œ์ง€ ์˜์†์„ฑ ๋ณด์žฅ (๋””์Šคํฌ ์ €์žฅ) ๋ฉ”์‹œ์ง€ ๋น„์˜์†์„ฑ (์ธ๋ฉ”๋ชจ๋ฆฌ) ๋ฉ”์‹œ์ง€ ๋น„์˜์†์„ฑ (์ธ๋ฉ”๋ชจ๋ฆฌ)
ํ™•์žฅ์„ฑ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๋†’์€ ํ™•์žฅ์„ฑ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์— ํ•œ์ •

(๋‹ค์ค‘ ์„œ๋ฒ„ ์‹œ External Broker ํ•„์š”)
๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ๋‚ด์—์„œ๋งŒ ์œ ํšจ
๋‚ด๊ฒฐํ•จ์„ฑ ๋†’์Œ (ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ) ๋‚ฎ์Œ

(์„œ๋ฒ„ ๋‹ค์šด ์‹œ ์—ฐ๊ฒฐ ๋ฐ ๋ฉ”์‹œ์ง€ ์œ ์‹ค)
๋‚ฎ์Œ (๋‹จ์ผ JVM ํ”„๋กœ์„ธ์Šค์— ์˜์กด)
๋ณต์žก์„ฑ ๋†’์Œ (์™ธ๋ถ€ ํด๋Ÿฌ์Šคํ„ฐ, ์„ค์ • ํ•„์š”) ์ค‘/๋‚ฎ์Œ (Spring ๋‚ด์žฅ, WebSocket/STOMP ์„ค์ • ํ•„์š”) ๋‚ฎ์Œ (Spring ๋‚ด์žฅ ๊ธฐ๋Šฅ)
์ฃผ ์šฉ๋„ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ†ต์‹ , ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ์›น์†Œ์ผ“ ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํ”ผ๋“œ (์ฃผ์‹/์ง€๋„) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋А์Šจํ•œ ๊ฒฐํ•ฉ