๋ชจ๋ ๊ฒ์ ๋ถ๋ฆฌํ์ธ์. ์๋น์ค ๊ฐ์ ๊ฐ๋ ์๊ฐ ๊ธฐ๋์น๊ฐ ์๋ ์ด๋ฒคํธ๋ฅผ ํตํด ํต์ ํ๋๋ก ํ์ธ์.

๊ท์ฌ์ ๋ชจ๋๋ฆฌ์ค(monolith)๋ ๋ฐฐํฌ ๋ณ๋ชฉ ํ์์ด ๋๊ณ ์์ต๋๋ค. ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ ๊ฐ์ ์กฐ์ ์ ํ์๋ก ํ๋ฉฐ, ์ฒญ๊ตฌ ๋ฒ๊ทธ ํ๋๊ฐ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ด์ํฌ ์ ์์ต๋๋ค. ๋๋ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ด ๋ค๋ฅธ ์๋๋ก ๋ฐ์ ํ๋ ์๋ก์ด ์์คํ ์ ๊ตฌ์ถ ์ค์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฃผ๋ฌธ ๊ด๋ฆฌ๋ ๋งค์ฃผ ๋ณ๊ฒฝ๋์ง๋ง ์ฌ๊ณ ๋ก์ง์ ๋ถ๊ธฐ๋ณ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ฐ์์ ์ธ ์ฅ์ ๋ฅผ ์ ๋ฐํ๋ ๋๊ธฐ์ API ํธ์ถ ๋์ ์ด๋ฒคํธ๋ฅผ ํตํด ํต์ ํ๋ฉฐ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ, ๋ฐฐํฌ ๋ฐ ํ์ฅ ๊ฐ๋ฅํ ์๋น์ค๊ฐ ํ์ํฉ๋๋ค.
Explore more design patterns and system architectures
MicrocosmWorks๋ Apache Kafka ๋๋ Amazon EventBridge์ ๊ฐ์ ๋ด๊ตฌ์ฑ ์๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ์ ์ค๊ณํฉ๋๋ค. ์ด ๋ธ๋ก์ปค๋ ์ปจ์๋จธ๊ฐ ์ด๋ฒคํธ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌํ ๋๊น์ง ์ด๋ฒคํธ๋ฅผ ๋ณด์กดํ์ฌ, ์ค๋จ ์ค์๋ ๋ฐ์ดํฐ ์์ค์ด ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ ํฌ๋ ์ฅ์ ๊ฐ ๋ฐ์ํ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์ ์ฒด ์ด๋ฒคํธ ํ์ดํ๋ผ์ธ์ ์ฐจ๋จํ์ง ์๋๋ก ๋ฐ๋ ๋ ํฐ ํ, ์ง์ ๋ฐฑ์คํ ์ฌ์๋ ์ ์ฑ , ๊ทธ๋ฆฌ๊ณ ์ํท ๋ธ๋ ์ด์ปค๋ฅผ ๊ตฌํํฉ๋๋ค. ๋ค์ด์คํธ๋ฆผ ์๋น์ค๊ฐ ๋ณต๊ตฌ๋๋ฉด, ์๋ ๊ฐ์ ์์ด ๋ฏธ์ฒ๋ฆฌ ์ด๋ฒคํธ๋ฅผ ์๋์ผ๋ก ๋ฐ๋ผ์ก์ต๋๋ค.
์ด๋ฒคํธ ๋๋ฆฌ๋ธ ํต์ ์ ์๋น์ค๊ฐ ์ฆ๊ฐ์ ์ธ ์๋ต์ ํ์๋ก ํ์ง ์์ ๋, ๋ฐฐํฌ ์ฃผ๊ธฐ๋ฅผ ๋ถ๋ฆฌํด์ผ ํ ๋, ๋๋ ๋จ์ผ ์์ ์ด ์ฌ๋ฌ ๋ค์ด์คํธ๋ฆผ ํ๋ก์ธ์ค๋ฅผ ํธ๋ฆฌ๊ฑฐํ ๋ ๋ ๋์ ์ ํ์ ๋๋ค. MicrocosmWorks๋ ์ผ๋ฐ์ ์ผ๋ก ์ฃผ๋ฌธ ์ฒ๋ฆฌ, ์๋ฆผ ํ์ดํ๋ผ์ธ ๋ฐ ๋ถ์ ์์ง์ ์ด๋ฒคํธ ๋๋ฆฌ๋ธ ํจํด์ ๊ถ์ฅํ๋ฉฐ, ์๋ธ์ธ์ปจ๋(sub-second) ์๋ต์ ์๊ตฌํ๋ ์ฌ์ฉ์ ๋๋ฉด ์ฟผ๋ฆฌ์๋ ๋๊ธฐ API๋ฅผ ์ ์งํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ตฌ์ถํ๋ ๋ง์ ํ๋ก๋์ ์์คํ ์ ๋๊ธฐ ์ฝ๊ธฐ(synchronous reads)์ ๋น๋๊ธฐ ์ฐ๊ธฐ(asynchronous writes)๋ฅผ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
MicrocosmWorks๋ ํน์ ์ํฐํฐ(์: ํน์ ์ฃผ๋ฌธ ๋๋ ์ฌ์ฉ์)์ ๋ํ ๋ชจ๋ ์ด๋ฒคํธ๊ฐ ๋์ผํ ์ปจ์๋จธ ์ธ์คํด์ค์ ์ํด ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋๋ก ๋ณด์ฅํ๊ธฐ ์ํด Kafka topics์์ ํํฐ์ ํค ๊ธฐ๋ฐ ์์ํ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ต์ฐจ ์ํฐํฐ ์์ํ๊ฐ ํ์ํ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ๋ ์์๊ฐ ๋ง์ง ์๋ ๋ฉ์์ง๋ฅผ ์์ ํ๊ฒ ์ฌ์ฒ๋ฆฌํ ์ ์๋ ๋ฉฑ๋ฑ์ฑ ์ด๋ฒคํธ ํธ๋ค๋ฌ(idempotent event handlers)๋ฅผ ๊ฐ์ง saga orchestrators๋ฅผ ๊ตฌํํฉ๋๋ค. ๋ํ ์ปจ์๋จธ๊ฐ ์์ ์ถฉ๋์ ๊ฐ์งํ๊ณ ์กฐ์ ํ ์ ์๋๋ก ์ด๋ฒคํธ ํ์ด๋ก๋(event payloads)์ vector clocks ๋๋ sequence numbers๋ฅผ ํฌํจ์ํต๋๋ค.
MicrocosmWorks๋ Saga pattern์ compensating transactions์ ํจ๊ป ๊ตฌํํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ฐ microservice๋ ์์ฒด local transaction์ ์๋ฃํ ํ domain events๋ฅผ ๋ฐํํ๋ฉฐ, ๋ค์ด์คํธ๋ฆผ ์๋น์ค๋ ์ด์ ๋ฐ๋ผ ๋ฐ์ํ๊ฑฐ๋ ์คํจ ์ rollback compensations๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ ํฌ๋ ์ด๋ฅผ outbox pattern๊ณผ ๊ฒฐํฉํ์ฌ, business data์ ํจ๊ป local outbox table์ ์ด๋ฒคํธ๋ฅผ ์์์ ์ผ๋ก ์์ฑํ ๋ค์, message broker๋ก ์์ ์ ์ผ๋ก ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด two-phase commits์ ์ฑ๋ฅ ๋ฐ ์์ ์ฑ ์ ํ ์์ด eventual consistency๋ฅผ ๋ฌ์ฑํฉ๋๋ค.
MicrocosmWorks๋ OpenTelemetry๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์๊ด ID(correlation IDs)์ ๋ถ์ฐ ์ถ์ ํค๋(distributed tracing headers)๋ก ๊ณ์ธกํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฐ๋ฆฌ๋ Jaeger ๋๋ Grafana Tempo์ ๊ฐ์ ๋๊ตฌ์์ ๋ชจ๋ ์ฐธ์ฌ ๋ง์ดํฌ๋ก์๋น์ค ์ ๋ฐ์ ๊ฑธ์ณ ๋น์ฆ๋์ค ํธ๋์ญ์ (business transaction)์ ์ ์ฒด ๋ผ์ดํ์ฌ์ดํด(lifecycle)์ ์๊ฐํํ ์ ์์ต๋๋ค. ๋ํ ์ฐ๋ฆฌ๋ ์๋น์ค๋ณ ์ฒ๋ฆฌ๋(throughput), ์ปจ์๋จธ ์ง์ฐ(consumer lag) ๋ฐ ์ฒ๋ฆฌ ์ง์ฐ ์๊ฐ(processing latency)์ ๋ณด์ฌ์ฃผ๋ ์ค์๊ฐ ์ด๋ฒคํธ ํ๋ฆ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ์ฌ ๋ณ๋ชฉ ํ์(bottlenecks)์ ์ฝ๊ฒ ์ฐพ์๋ผ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ์ ํ์ค ๊ด์ธก ๊ฐ๋ฅ์ฑ ์คํ(observability stack)์ ์ด๋ฒคํธ ๋ฉํ๋ฐ์ดํฐ(event metadata)์ ํจ๊ป ๊ตฌ์กฐํ๋ ๋ก๊น (structured logging)์ ํฌํจํ์ฌ, ๋ชจ๋ ๋จ์ผ ์ด๋ฒคํธ๋ฅผ ์์ฐ์(producer)๋ถํฐ ๋ชจ๋ ์ปจ์๋จธ(consumer)๊น์ง ๋ช ์ด ์์ ์ถ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ์ ์ํคํ ํธ๋ค์ ํน์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ์ด ํจํด์ ์ฌ์ฉํ์ฌ ์์คํ ์ ์ค๊ณํ๊ณ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ ๋๋ฆด ์ ์์ต๋๋ค.
์ฐ๋ฝํ๊ธฐ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ ์์คํ ์ ์ฃผ๋ก ๋น๋๊ธฐ ์ด๋ฒคํธ๋ฅผ ํตํด ํต์ ํ๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ ์๋น์ค๋ก ๋ถํดํฉ๋๋ค. ๊ฐ ์๋น์ค๋ ์์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ณ , ์ํ ๋ณ๊ฒฝ ์ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉฐ, ๋ค๋ฅธ ์๋น์ค์ ์ด๋ฒคํธ์ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์๊ฐ์ ๊ฒฐํฉ(temporal coupling)์ ์ ๊ฑฐํฉ๋๋ค. ์ฆ, ์๋น์ค A๊ฐ ์์ ์ ์ํํ๊ธฐ ์ํด ์๋น์ค B๊ฐ ์คํ๋ ํ์๊ฐ ์์ต๋๋ค. ์ด ํจํด์ ์ฐ๊ธฐ ๋ฐ ์ฝ๊ธฐ ๋ชจ๋ธ์ ๋ถ๋ฆฌํ๊ธฐ ์ํ CQRS (Command Query Responsibility Segregation), ์ํ ๋ณ๊ฒฝ์ ์ ์ฒด ์ด๋ ฅ์ ์บก์ฒํ๊ธฐ ์ํ ์ด๋ฒคํธ ์์ฑ, ๋ถ์ฐ ์ ๊ธ ์์ด ๋ค์ค ์๋น์ค ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ฌ๊ฐ ์ค์ผ์คํธ๋ ์ด์ (saga orchestration)์ ํฌํจํฉ๋๋ค.
์ด ์ํคํ ์ฒ๋ ์๋น์ค ๊ฐ์ ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ๋ผ์ฐํ ํ๋ ์ด๋ฒคํธ ๋ฐฑ๋ณธ (Kafka, EventBridge, ๋๋ NATS)์ ์ค์ฌ์ผ๋ก ํฉ๋๋ค. ๊ฐ ์๋น์ค๋ ์ธ ๊ฐ์ง ๊ฒฝ๊ณ๋ฅผ ๊ฐ์ง๋๋ค. ์ฆ, ์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ์ปค๋งจ๋ ํธ๋ค๋ฌ, ์ฝ๊ธฐ ์ต์ ํ๋ ํ๋ก์ ์ ์ ์ ๊ณตํ๋ ์ฟผ๋ฆฌ ํธ๋ค๋ฌ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์๋น์ค์ ์ด๋ฒคํธ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ํ๋ก์ธ์์ ๋๋ค. ์ฌ๊ฐ ์ค์ผ์คํธ๋ ์ดํฐ๋ ์ด๋ฒคํธ์ ๊ท ๊ธฐ์ธ์ด๊ณ ๋จ๊ณ๊ฐ ์คํจํ ๊ฒฝ์ฐ ๋ณด์ ์ปค๋งจ๋(compensating commands)๋ฅผ ๋ฐํํ์ฌ ๋ค๋จ๊ณ ๋น์ฆ๋์ค ํ๋ก์ธ์ค(์: ์ฃผ๋ฌธ ์ฒ๋ฆฌ)๋ฅผ ์กฐ์ ํฉ๋๋ค.
| ๋ ์ด์ด | ๊ธฐ์ |
|---|---|
| ์ปดํจํธ | Node.js (NestJS), Python (FastAPI), Go โ ์ํฌ๋ก๋ ํน์ฑ์ ๋ฐ๋ผ ์๋น์ค๋ณ ์ ํ |
| ๋ฉ์์ง | Apache Kafka (MSK), AWS EventBridge, NATS JetStream, RabbitMQ |
| ๋ฐ์ดํฐ | PostgreSQL (ํธ๋์ญ์ ), DynamoDB (ํค-๊ฐ), Redis (์บ์ฑ/์ ๊ธ), EventStoreDB |
| ์ค์ผ์คํธ๋ ์ด์ | Temporal (์ํฌํ๋ก์ฐ ์ค์ผ์คํธ๋ ์ด์ ), AWS Step Functions, ์ปค์คํ ์ฌ๊ฐ ์กฐ์ ์ |
| ๊ด์ธก ๊ฐ๋ฅ์ฑ | OpenTelemetry (๋ถ์ฐ ์ถ์ ), Datadog, Jaeger, ์๊ด๊ด๊ณ ID(correlation IDs)๋ฅผ ์ฌ์ฉํ ๊ตฌ์กฐํ๋ ๋ก๊น |
| ์ฌ์ฉ ์๊ธฐ | ํผํด์ผ ํ ์๊ธฐ |
|---|---|
| ์ฌ๋ฌ ํ์ด ๋ค๋ฅธ ์ฃผ๊ธฐ๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌํด์ผ ํ ๋ | ํ ๊ท๋ชจ๊ฐ ์์ง๋์ด 5๋ช ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ โ ์ ๊ตฌ์กฐํ๋ ๋ชจ๋๋ฆฌ์ค๊ฐ ์ด์ํ๊ธฐ ๋ ๊ฐ๋จํฉ๋๋ค. |
| ์์คํ ์ ์ฌ๋ฌ ๋ถ๋ถ์ด ์๋ก ๋ค๋ฅธ ์ค์ผ์ผ๋ง ํน์ฑ์ ๊ฐ์ง ๋ | MVP๋ฅผ ๊ตฌ์ถ ์ค์ด๋ฉฐ ๋น ๋ฅด๊ฒ ์ถ์ํด์ผ ํ ๋ โ ๋ถ์ฐ ์์คํ ์ ๊ตฌ์ถ ์๋๊ฐ ๋๋ฆฝ๋๋ค. |
| ๊ฐ๋ ฅํ ๊ฐ์ฌ ์ถ์ ๋ฐ ์ด๋ฒคํธ ๋ฆฌํ๋ ์ด ๊ธฐ๋ฅ์ด ํ์ํ ๋ | ๋ชจ๋ ์์ ์ด ๋๊ธฐ์ ์ด๊ณ ๊ฐ๋ ฅํ๊ฒ ์ผ๊ด๋ ์๋ต์ ์๊ตฌํ ๋ |
| ๋๋ฉ์ธ์ ์์ฐ์ค๋ฌ์ด ๊ฒฝ๊ณ ์ปจํ ์คํธ(์ฃผ๋ฌธ, ๊ฒฐ์ , ์ฌ๊ณ )๊ฐ ์์ ๋ | ๋๋ฉ์ธ์ด ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด โ ๋ถํ ํ๋ฉด ๋ถ์ฐ๋ ๋ชจ๋๋ฆฌ์ค๊ฐ ๋ ๋ |
MW๋ ๊ธฐ์ ๊ณ์ธต(API ์๋น์ค, ๋ฐ์ดํฐ ์๋น์ค, ์ธ์ฆ ์๋น์ค)๋ณ๋ก ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ DDD (Domain-Driven Design)์ ๊ฒฝ๊ณ ์ปจํ ์คํธ(bounded contexts)๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๋ผ ๋ถํดํฉ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ ์, ๋๋ฉ์ธ ์ด๋ฒคํธ, ์ปค๋งจ๋, ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ(aggregates)๋ฅผ ๋งคํํ๊ธฐ ์ํ ์ด๋ฒคํธ ์คํ ๋ฐ ์ํฌ์์ ์งํํฉ๋๋ค. ์ด๊ฒ์ด ์๋น์ค ๊ฒฝ๊ณ๋ฅผ ๊ฒฐ์ ํ๋ ์์์ด๋ฉฐ, ๊ธฐ์ ์ ์ ํธ๋๊ฐ ์๋๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ์ ๊ณ ๊ฐ์ ์ํด ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ๋ฉฐ, ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ตํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ ๊ณ ๋ ํฐ ์๋น์ค๋ก ์์ํ๊ณ ๋์ค์ ๋ถํ ํ๋ฉฐ, ๊ทธ ๋ฐ๋๊ฐ ๋์ด์๋ ์ ๋ฉ๋๋ค.
๋ชจ๋ธ์ ์ค์ค๋ก ์๋ํ์ง ์์ต๋๋ค. ๋ชจ๋ธ์ ํ๋ จํ๊ณ , ๊ฒ์ฆํ๊ณ , ๋ฐฐํฌํ๊ณ , ๋ชจ๋ํฐ๋งํ๋ ํ์ดํ๋ผ์ธ์ด ์ค์ ์ ํ์ ๋๋ค. ๋ชจ๋ธ์ ๋จ์ง ํ๋์ ์ํฐํฉํธ์ผ ๋ฟ์ ๋๋ค.