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 ๋ด์ฅ ๊ธฐ๋ฅ) |
| ์ฃผ ์ฉ๋ | ์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ, ๋ง์ดํฌ๋ก์๋น์ค ํต์ , ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ | ์ค์๊ฐ ์๋ฆผ, ์น์์ผ ์ฑํ , ์ค์๊ฐ ๋ฐ์ดํฐ ํผ๋ (์ฃผ์/์ง๋) | ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ ์ปดํฌ๋ํธ ๊ฐ ๋์จํ ๊ฒฐํฉ |
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Spring์์ ๋ธ๋ผ์ฐ์ ์ ์ ์ ์์์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ์บ์ ์ต์ ํ ์ ๋ต (1) | 2025.06.13 |
|---|---|
| Spring messging, Stomp๋ฅผ ํ์ฉํ ๋ฉ์ธ์ง ๊ด๋ฆฌ + ๋ค์ค ์ธ์ ๊ด๋ฆฌ ๊ตฌํ (0) | 2025.04.20 |
| Spring Data JPA : Auditing & HATEOAS (0) | 2023.02.13 |
| T ์์นด๋ฐ๋ฏธ : JPA ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด (3) (0) | 2023.02.10 |
| SpringData ์ฟผ๋ฆฌ์ QueryDSL (0) | 2023.02.08 |