๊ฐ์
ํธ๋์ญ์
๋ฒ์๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์๋น์ค ํ์ฅ ์ ๊ณ ๋ คํด์ผ ํ ์๋น์ค ๋ถ๋ฆฌ ์ ๋ต ๋ฐ ํธ๋์ญ์
๊ด๋ฆฌ ์ ๋ต์ ๋ถ์ํฉ๋๋ค.
์ด๋ฅผ ํตํด ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค๋ ํด๊ฒฐ ๋ฐฉ์์ ์กฐ์ฌํฉ๋๋ค.
์ฃผ์ ๋ด์ฉ
- ์๋น์ค ๊ฐ ๊ฒฐํฉ๋ ์ํ: ์๋น์ค์ ๋
๋ฆฝ์ฑ์ ๋์ฌ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๊ฐ์ ํฉ๋๋ค.
- ํธ๋์ญ์
๊ด๋ฆฌ ์ ๋ต: ๋ถ์ฐ ์์คํ
์์ ๋ฐ์ํ ์ ์๋ ํธ๋์ญ์
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์กฐ์ฌํฉ๋๋ค.
๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์
์ ๋ฒ์
๋ฌด๋ถ๋ณํ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์
์ ๊ท๋ชจ ๋ํ ์ฐ๋ฆฌ๊ฐ ์์ธกํ์ง ๋ชปํ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
๋ฌธ์ ์
- ํธ๋์ญ์
๋ฒ์๊ฐ ๊ณผ๋ํ๊ฒ ๋์ ๊ฒฝ์ฐ
- ๋จ์ผ ํธ๋์ญ์
์์ ๋๋ฌด ๋ง์ ์์
์ ์ฒ๋ฆฌํ๋ฉด ๋ฐ๋๋ฝ ๋ฐ ์ฑ๋ฅ ์ ํ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค.
- ๋กค๋ฐฑ ์, ๋ถํ์ํ๊ฒ ๋ง์ ๋ฆฌ์์ค๊ฐ ์ํฅ์ ๋ฐ์ต๋๋ค.
- ํธ๋์ญ์
๋ด DB์ ๋ฌด๊ดํ ์์
์ํ
- ํ์ผ ์
์ถ๋ ฅ, ์ธ๋ถ API ํธ์ถ ๋ฑ ํธ๋์ญ์
์ธ๋ถ์์ ์ฒ๋ฆฌํด์ผ ํ ์์
์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ์ ๋กค๋ฐฑ ๋ถ๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ์
- ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์
๋ฒ์ ๋ถ๋ฆฌ: ํธ๋์ญ์
๋ด์์ ์ต์ํ์ ์์
๋ง ์ฒ๋ฆฌํ๊ณ , ๋๋จธ์ง ์์
์ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ๋ก ๋ถ๋ฆฌํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ด๋ฒคํธ๋ฅผ ํตํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
ApplicationEventPublisher์ EventListener
ApplicationEventPublisher
: ์ ํ๋ฆฌ์ผ์ด์
๋ด ์ด๋ฒคํธ๋ฅผ ๋ฐํํ์ฌ ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถฅ๋๋ค.
EventListener
/ TransactionalEventListener
: ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋น๋๊ธฐ ๋ฐฉ์ ๋๋ ํธ๋์ญ์
๊ฒฝ๊ณ ๋ด์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
@TransactionalEventListener
์ @Async
๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํธ๋์ญ์
์ข
๋ฃ ํ ๋น๋๊ธฐ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ด ์ฑ๋ฅ๊ณผ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ค๊ณ ๋ฐฉํฅ
- ์ด๋ฒคํธ ๋ฐํ:
ApplicationEventPublisher
๋ฅผ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ค์ : ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ์ฌ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์์ฑํฉ๋๋ค.
- ์ค๋ฅ ๋ฐ ์ฌ์๋ ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์์
์์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ก๊น
ํ๊ฑฐ๋, ์ฌ์๋ ๋ก์ง์ ์ถ๊ฐํด์ผํฉ๋๋ค.
๋ถ์ฐ ํธ๋์ญ์
๊ด๋ฆฌ ํจํด์ ํตํ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ
Saga ํจํด

- ๋ถ์ฐ ํธ๋์ญ์
ํ๊ฒฝ์์ ํธ๋์ญ์
์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํ ํจํด.
- ๊ฐ ์๋น์ค๊ฐ ๋ก์ปฌ ํธ๋์ญ์
์ ์ฒ๋ฆฌํ ํ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ์ฌ ๋ค์ ์์
์ ์ด์ด๋๊ฐ๋๋ค.
Choreography(ํฌ๋ ์ค๊ทธ๋ํผ) ํจํด

- ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ํธ๋์ญ์
ํ๋ฆ์ ์กฐ์จ. ๊ฐ ์๋น์ค๊ฐ ์์ฒด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ์ฌ ํธ๋์ญ์
์คํ.
- ๊ฐ ์๋น์ค๋ ์์ ์ ๋ก์ปฌ ํธ๋์ญ์
์ ์คํํ๊ณ , ์์
์๋ฃ ํ ์ด๋ฒคํธ๋ฅผ ๋ฐํ.
- ๋ค๋ฅธ ์๋น์ค๋ ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
ํ์ฌ ์์ ์ ์์
์ ์คํ.
์ค๊ณ ๋ฐฉํฅ
- ์๋น์ค ๋ถ๋ฆฌ ๋ฐ ์ด๋ฒคํธ ๋ฐํ
- ์ด๋ฒคํธ ํ๋ฆ ์ ์
PaymentService
๋ PaymentStartedEvent
๋ฅผ ๋ฐํํฉ๋๋ค.
PointService
๋ PaymentProcessedEvent
๋ฅผ ๊ตฌ๋
ํ์ฌ ํฌ์ธํธ ์ฐจ๊ฐ ํ PointsSubtractedEvent
๋ฅผ ๋ฐํํฉ๋๋ค.
SeatService
๋ PointsSubtractedEvent
๋ฅผ ๊ตฌ๋
ํ์ฌ ์ข์ ์์ฝ ํ SeatsReservedEvent
๋ฅผ ๋ฐํํฉ๋๋ค.
PaymentHistoryService
๋ SeatsReservedEvent
๋ฅผ ๊ตฌ๋
ํ์ฌ ๊ฒฐ์ ์ด๋ ฅ์ ์์ฑํฉ๋๋ค.
- ๋ณด์ ํธ๋์ญ์
: ์คํจํ ๋จ๊ณ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ํด๋น ๋จ๊ณ์์ ๋ณด์ ํธ๋์ญ์
์ ๋ฐํํฉ๋๋ค. ํฌ์ธํธ ์ฐจ๊ฐ์ ์คํจํ๋ฉด ์ด์ ๋จ๊ณ์ ์์
์ ๋ณด์ํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค.
์ฅ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
- ์ฅ์ : Orchestrator๊ฐ ์์ด ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๊ณ , ๊ฐ ์๋น์ค๋ ์์ ์ ์ฑ
์๋ง ์ฒ๋ฆฌํฉ๋๋ค.
- ๊ณ ๋ ค์ฌํญ: ์ด๋ฒคํธ ์์ ๋ฐ ๋ณต๊ตฌ ๋ก์ง์ด ์ ์ค๊ณ๋์ด์ผ ํฉ๋๋ค.
Orchestration(์ค์ผ์คํธ๋ ์ด์
) ํจํด

- ์ค์ ์กฐ์ ์๊ฐ ํธ๋์ญ์
ํ๋ฆ์ ์ ์ดํ์ฌ ์คํ ์์๋ฅผ ๊ฒฐ์ .
- Saga ์ค์ผ์คํธ๋ ์ดํฐ๋ ๋จ๊ณ๋ฅผ ์ธ์ํ๊ณ ํ์ํ ์์๋๋ก ์คํํฉ๋๋ค. T3 ๋จ๊ณ๊ฐ ์คํจํ๋ฉด(๊ฒฐ์ ์คํจ) ์ค์ผ์คํธ๋ ์ดํฐ๋ ๋ณด์ ํธ๋์ญ์
C1๊ณผ C2๋ฅผ ์คํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐ ์ํ๋ก ๋ณต์ํฉ๋๋ค.
์ค๊ณ ๋ฐฉํฅ
- Saga Orchestrator ์ค๊ณ: ๊ฐ ๋จ๊ณ์ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ์ ์ ํ ์๋น์ค ํธ์ถ์ ํ์ฌ ์์
์ ๊ด๋ฆฌํ๋ Orchestrator์ ์์ฑํฉ๋๋ค.
- ๊ฐ ์๋น์ค ๋ถ๋ฆฌ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ง: ๋ก์ปฌ ํธ๋์ญ์
์ ๊ฐ๋ณ ์๋น์ค์์ ์ฒ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ์์
์ด ๋๋ ํ ์ฑ๊ณต/์คํจ ์ด๋ฒคํธ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ด๋ฒคํธ ์ ์: ์ด๋ฒคํธ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ณด์ ํธ๋์ญ์
์ ์: ์คํจ ์ ๋ณด์ ์์
์ ์ํํฉ๋๋ค. ํฌ์ธํธ ์ฐจ๊ฐ์ ์คํจํ๋ฉด ์ด๋ฏธ ์ฐจ๊ฐ๋ ํฌ์ธํธ๋ฅผ ๋ณต๊ตฌํด์ผ ํฉ๋๋ค.
- ๋ฉ์์ง ๋ธ๋ก์ปค ๋๋ ์ด๋ฒคํธ ๋ฐํ: ๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Spring์ ApplicationEventPublisher๋ฅผ ํ์ฉํฉ๋๋ค.
์ฅ์ ๋ฐ ๊ณ ๋ ค์ฌํญ
- ์ฅ์
- Orchestrator๊ฐ ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๋ฏ๋ก ํ๋ฆ์ด ๋ช
ํํฉ๋๋ค.
- ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๊ฐ๋
์ฑ์ ํฅ์์ํต๋๋ค.
- ๊ณ ๋ ค์ฌํญ
- Orchestrator๊ฐ ๋จ์ผ ์ฅ์ ์ ์ด ๋ ์ ์์ผ๋ฏ๋ก ์ฅ์ ๋๋น ๋ฐ ๋ณต๊ตฌ ์ ๋ต์ด ํ์ํฉ๋๋ค.
- ๋ฉ์์ง ์ง์ฐ์ด๋ ์คํจ์ ๋๋นํ ์ฌ์๋ ๋ฐ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ์ ์ค๊ณํด์ผํฉ๋๋ค.
๋์์ธ ํจํด ๋น๊ต
๋ถ๋ฅ | ์ฅ์ | ๋จ์ |
---|
Orchestration | - ์ค์์์ ๋ชจ๋ ํธ๋์ญ์
์ ์ด ๊ฐ๋ฅ | - ์ค์ ์กฐ์ ์๊ฐ ์์คํ
๋ณ๋ชฉ์ด ๋ ์ ์์ |
Choreography | - ํธ๋์ญ์
์ด๋ฒคํธ ๊ธฐ๋ฐ. ์๋น์ค ๊ฐ ๋
๋ฆฝ์ฑ ๋์ | - ์คํจ ์ ์ด๋ฒคํธ ๋ณต๊ตฌ๊ฐ ๋ณต์กํจ |
์ฐธ๊ณ