์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ํญํดํ๋ฌ์ค
- ํ๋กํ ํ์ ๋น
- ํญํ ๋ฐฑ์๋
- ํญํด+
- ํญํ ํ๊ธฐ
- ํญํดํ๋ฌ์คํ๊ธฐ
- ํญํด
- ํญํ
- ํญํด ํ๊ธฐ
- OOP
- ํญํด ํ๋ฌ์ค ํ๊ธฐ
- ๋์์ธ ํจํด
- ํญํดํ๋ฌ์ค ๋ฐฑ์๋
- TDD
- ์์ฐจ์งํฅ
- ํญํดํ๋ฌ์ค๋ฐฑ์๋
- ๊ธฐ๋ฅ ํ ์คํธ
- fanout on write
- ํญํด ๋ฐฑ์๋
- API Aggregation
- ํญํดํ๋ฌ์ค ํ๊ณ
- ํผ๋ ๊ตฌํ
- ๋ฐ์ดํฐ ์ฟผ๋ฆฌ
- ๋น ์ค์ฝํ
- fanout on read
- pull model
- push model
- ์์ฑ ํจํด
- ์ฑ๊ธํค ๋น
- ํญํดํ๋ฌ์ค ํ๊ธฐ
- Today
- Total
deVlog
[MSA] MSA ์ ํ์์ ํ๊ณ - ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ํจํด (CQRS, API Aggregation) ๋ณธ๋ฌธ
[MSA] MSA ์ ํ์์ ํ๊ณ - ๋ฐ์ดํฐ ์ฟผ๋ฆฌ ํจํด (CQRS, API Aggregation)
์๋ฃจ๋ฐ 2024. 4. 20. 21:40๋ชฉ์ฐจ
๐งจ MSA ์ ํ์์ ํ๊ณ
- ๋ชจ๋ ์๋น์ค๋ ๊ฐ ํ๋ก๋ํธ๋ก์, ๋๋ฉ์ธ์ ์ฑ ์์ง๋ค. -> ์๋น์ค/๋๋ฉ์ธ ๊ฐ ํ์ ๊ณผ ์์กด์ฑ์ด ์ง์๋๋ ๊ตฌ์กฐ์.
- ๊ฐ ์๋น์ค์ DB ๋ ๊ฐ ์๋น์ค๋ฅผ ํตํด์ ์ ๊ทผํด์ผ๋ง ํ๋ค. (data Ownership)
- ์ฌ๊ธฐ์ ์๊ธฐ๋ ๋ฌธ์ -> ์ฌ๋ฌ ์๋น์ค์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํด์ ๋ณด๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? (๋ชจ๋๋ฆฌ์ค ์์ผ๋ฉด join ์ผ๋ก ํด๊ฒฐ)
๐ฑ ์ฌ๋ฌ ์๋น์ค์ ๋ฐ์ดํฐ์ ์กฐํฉ์ด ํ์ํ ์ - API Aggregation ํจํด
์๋ฅผ ๋ค์ด "ํน์ ๊ธฐ๊ฐ" ๋์, "์ถฉ์ " ์ด ๋๋ฐ๋ ์ผ์ ๊ธ์ก ์ด์์ "์ก๊ธ" ๋ด์ญ์ ํฉ์ ์๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด๋ Money service ์ ๋จธ๋ ์ถฉ์ ๋ด์ญ DB์ ์ก๊ธ ์๋ ๊ฑด์ ๋ํ ID๊ฐ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
API Aggregation ํจํด์ ์ด์ฉํด์ ํด๊ฒฐํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.
API Aggregation ํจํด์ ๋ง ๊ทธ๋๋ก ์ฌ๋ฌ API ์์ฒญ์ ํตํด ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ค์ ๊ฐ๊ณตํ๊ณ ์กฐํฉํ์ฌ ์ ๋ณด๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
1. ํน์ ๊ธฐ๊ฐ ๋์์ ์ฑ๊ณตํ ์ก๊ธ ๋ด์ญ Get
2.ํน์ ๊ธฐ๊ฐ ๋์์ ์ฑ๊ณตํ ๋จธ๋ ์ถฉ์ ๋ด์ญ Get
3. ๋จธ๋ ์ถฉ์ ๋ด์ญ ๋ด, ์ ์ ์ก๊ธ ID ๊ฐ ํฌํจ๋ ๋ด์ญ์ ๊ฒ์
4. ๊ฒ์๋ ๋ด์ญ ์ค ์ผ์ ๊ธ์ก ์ด์ ์ถฉ์ ๋ด์ญ๋ค์ ์ถฉ์ ๊ธ์ก ์ดํฉ์ Sum
5. RETURN!
์ ๊ทธ๋ฆผ์ฒ๋ผ ๋จธ๋ ์๋น์ค, ์ก๊ธ ์๋น์ค์ ์์ฒญ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ค์ ์กฐํฉํ๊ณ ๊ฐ๊ณตํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ ํ์ ์ด์ง ์์ ์ํฉ์ ์ ํฉํ ์๋ ์๋ค. ์ฌ๊ธฐ์ ์ ํ์ ์ด์ง ์์ ์ํฉ์ ๋์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์๋๊ณ , ์ค์๊ฐ ๋ถํ๋ ํฌ์ง ์๊ณ , ๋ฐ์ดํฐ๋ ๋ง์ง ์์ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค.
โ ๏ธ API Aggregation ํจํด ์ฌ์ฉ์ ์ฃผ์ ์ฌํญ
1) ๋น์ฆ๋์ค ๋ก์ง์ด ํฌํจ๋ API ์ ํธ์ถ ๋น๋๋ฅผ ํ์ ํด์ผ ํ๋ค.
- ๋๋ฌด ์์ฃผ ํธ์ถ๋๋ ๊ฒฝ์ฐ๋ผ๋ฉด, Aggregation์ ์ํ ๊ฐ ์๋น์ค์ API ๊ฐ ๋ถํ๋ฅผ ๋ฐ์์ฃผ๊ธฐ ์ด๋ ค์ธ ์๋ ์๋ค.
- ๋์ฉ๋ DB์ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ผ๋ก ํธ์ถ๋๋ API ๋ก ์ธํด DB์ ๋ถํ ๋๋ ๋ถํ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์๋น์ค๋ค์ ์ฅ์ ๋ฅผ ์ ํ์ํฌ ์๋ ์๋ค.
2) Aggregation API์ ์ค์๋
- ์ฌ๋ฌ ๋ฒ์ API ํธ์ถ ์ค, ํ ๋ฒ์ด๋ผ๋ ์คํจ ์ ๊ทธ ํธ์ถ์ ์คํจ๊ฐ ๋์ด์ผ ํ๋ค. ์ด๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ฌ๋ฌ๋ฒ์ ํธ์ถ๋ก ์ธํด, ๋ค๋ฅธ ์๋น์ค API ๋ณด๋ค ํจ์ฌ ๊ธด Latency ๋ฅผ ๊ฐ์ง๊ฒ ๋ ๊ฒ์ด๋ค.
- N๋ฒ ํธ์ถ + ๋ด๋ถ ๋ก์ง ์คํ ์๊ฐ
์ ๋ฆฌํด๋ณด์๋ฉด API Aggregation ํจํด์ "์ฝ๊ณ , ์ง๊ด์ ์ด๋ค" ๋ผ๋ ์์ฃผ ํฐ ์ฅ์ ์ด ์๋ค.
์ฌ์ค ์ด ์ฅ์ ์ ๋๊ท๋ชจ ํ๊ฒฝ์์ ์กฐ์ง๊ณผ ํ์ผ๋ก ์ผํด์ผ ํ๋ ๊ธฐ์ ์์๋ ๋น ๋ฅธ ๋น์ฆ๋์ค๋ฅผ ํด์ผํ๋ ์ํฉ์์๋ ์ฌ๋งํ ์ฑ๋ฅ์ ์ธ ๋ถ๋ถ๋ณด๋ค ๋ ํฐ ์ฅ์ ์ด ๋ ์๋ ์๋ค.
๋ค๋ง, ๊ทธ๋งํผ ์ฃผ์ํด์ผ ํ๊ณ ์ ์ฒด ์์คํ ์ ์ํฅ๋๋ฅผ ๊ผญ ํ์ ํด์ผ๋ง ํ๋ ๊น๋ค๋ก์ด ํจํด ์ค ํ๋์ด๋ค.
๋, ์๋ ์ผ์ด์ค์ ๊ฐ์ด ์์ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๊ตฌ์ฌํญ์ด ์๊ธธ ์๋ ์๋ค.
"์ค์๊ฐ์ผ๋ก '๊ฐ๋จ๊ตฌ' ์ ๊ฑฐ์ฃผ ์ค์ธ ํ์๋ค์ ๋จธ๋ ์ด ์์ก์ด ์ด๋ป๊ฒ ๋ณ๋๋๋์ง ์๊ณ ์ถ๋ค."
โผ๏ธ ๋ณต์กํ ์๊ตฌ์ฌํญ์ด ์๋ค๋ฉด..?
์๋์์ ์๊ตฌ์ฌํญ์ ์์ง๋์ด๋ง์ ์ผ๋ก ๋ถ์ํด๋ณด์.
- ์ค์๊ฐ์ผ๋ก ์ฑ์ ํ ํ๋ฉด์ โก๏ธ ํ ํ๋ฉด -> ๋์ ๋ถํ
- ๊ณ ๊ฐ์ด ๊ฑฐ์ฃผํ๋ ๊ณณ์ "๊ตฌ"์ (์. ๊ฐ๋จ๊ตฌ) โก๏ธ ํํ๋ฉด์ ๋ก๊ทธ์ธ ํ "๊ณ ๊ฐ ์ ๋ณด"๋ฅผ ๊ธฐ์ค์ผ๋ก
- ๊ฑฐ์ฃผ์ค์ธ ํ์๋ค ์ ์ฒด์ โก๏ธ ๋ก๊ทธ์ธ ํ ๊ณ ๊ฐ์ ์ฃผ์ ์ ๋ณด์ ๋์ผํ ์ฃผ์๋ฅผ ๊ฐ์ง "์ ์ฒด ๊ณ ๊ฐ ์ ๋ณด"๋ฅผ ํ์ธํ์ฌ
- ๋จธ๋ ์ด ์์ก์ด โก๏ธ ํ์ํ ์ ๋ณด์ ์ค์ฌ ์๋น์ค ๋๋ฉ์ธ์ "๋จธ๋" ์๋น์ค
- ์ด๋ป๊ฒ ๋ณ๋๋๋์ง ์๋ ค์ฃผ๊ณ ์ถ์ด์. (๋น์ฆ๋์ค์ ์ผ๋ก ๊ฒฝ์์ฌ ์ ๋ฐํ๊ธฐ ์ํจ) โก๏ธ ๋น๊ต์ ๋ ์ค์ํ ๋น์ฆ๋์ค์ผ ์๋ ์์
๋๊ท๋ชจ ์๋น์ค๋ผ๋ ๊ฐ์ ํ์ ์ด๋ฌํ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ๋ก ์ง์ํ๋ค๋ ๊ฒ์ ์๊ฐ์ด ๊ต์ฅํ ์ค๋ ๊ฑธ๋ฆฌ๊ณ DB ์ธ๋ฑ์ฑ์ ํ๋ค๊ณ ํด๋ ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ์ด๋ง์ด๋ง ํด์ ๋นํจ์จ์ ์ผ ๊ฒ์ด๋ค. -> RDB ๋ฅผ ์ฌ์ฉํด์ ํด๋น ์ ๋ณด๋ฅผ ํ์ฉํ๊ธฐ ์ด๋ ค์ด ์ํฉ์ด๋ค.
โก๏ธ ๋ณต์กํ ์๊ตฌ์ฌํญ ๊ตฌํ - API Aggregation ํจํด
1. ๊ณ ๊ฐ์ด ์์๋ "๊ตฌ" ์ ๋ณด ํ์ธ
2. "๊ฐ๋จ๊ตฌ" ์ฃผ์๋ฅผ ๊ฐ์ง ๊ณ ๊ฐ๋ค ์ ๋ณด๋ฅผ ํ์ธ (30๋ง๋ช ์ด๋ผ ๊ฐ์ )
3. ์ฃผ์ ๋ณ๊ฒฝ ๋ฑ์ผ๋ก ์ค์๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์กด์ฌ
4. ํฌํจ๋ ๋ชจ๋ ๊ณ ๊ฐ๋ค์ "๋จธ๋" ์ ๋ณด๋ฅผ ํ์ธ
5. 100๊ฐ์ฉ ๋ฌถ์ด์ ํธ์ถํ๋ค ํด๋ 3,000 ๋ฒ call ์ ํด์ผ ํ๋ค.
6. ๋ชจ๋ ๋จธ๋ ์์ก์ ํ์ธ sum
7. RETURN
-> ๋๊ท๋ชจ ์์คํ ์ ํํ๋ฉด์์ ํธ์ถ๋์ด์ผ ํ ํ๋์ API ๊ฐ ๋ค๋ฅธ ์๋น์ค์ 3,000 ๋ฒ ์ฝ์ ํด์ผํ๋ ๋ง๋ ์๋๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
์ ๋ฆฌํด๋ณด์๋ฉด ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ค.
- ์ต์
์ ๊ฒฝ์ฐ, ๊ณ ๊ฐ ์ ์ฒด ์๋งํผ Money ์ ๋ณด๋ฅผ GET ํด์ค์ผ ํ ์๋ ์๋ค.
- ๊ทธ๋งํผ Money ์๋น์ค์ ์์ฒญ๋ ๋ถํ๊ฐ ๊ฐํด์ง๋ค. ์ด๋ก ์ธํด Money ์๋น์ค๋ฅผ ์ด์ฉํ๋ ๋ค๋ฅธ ์๋น์ค์๊ฒ๋ ์ฅ์ ๊ฐ ์ ํ๋ ์ ์๋ค.
- Latency ๋ ์ง๋์น๊ฒ ๊ธธ์ด์ง๊ณ ์ค์๊ฐ ๋ถํ๋ฅผ ๊ฐ๋นํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
โ๏ธ ๋ณต์กํ ์๊ตฌ์ฌํญ ๊ตฌํ - CQRS ํจํด
๊ทธ๋ ๋ค๋ฉด ์๊ตฌ์ฌํญ์ ๋ค์ ์ง๊ด์ ์ผ๋ก ์๊ฐํด๋ณด์.
๊ฐ๋จ๊ตฌ ๊ณ ๊ฐ์ ๋จธ๋ ์์ก ๋ณ๋์ด ์๊ธธ ๋์๋ง
๊ฐ๋จ๊ตฌ ์ ์ฒด ๋จธ๋ ์ด ์์ก ๊ฐ์ ๋ณ๋ ์์ผ์ฃผ๊ณ
์์ฒญ ์, ์ด๋ ๊ฒ ๋ณ๋ ์ค์ธ ์ต์ข ๊ฐ์ Get ํด์ฃผ๋ฉด ๋๋ ๊ฒ ์๋๊น?
์์ ๊ฐ์ด ์ค๊ณ๋ฅผ ํด๋ณด์๋ฉด ์๋์ ๊ฐ์ ๊ทธ๋ฆผ์ผ๋ก ํ๋ฌ๊ฐ ๊ฒ์ด๋ค.
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํน์ ํ ์ ์ฅ์์ ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ค๋ค๋ฉด GET ์์ฒญ ์ ๋ค๋ฅธ ์๋น์ค์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ํน์ ์ ์ฅ์์์ ๊ฐ์ ์ฝ์ด์ค๊ธฐ๋ง ํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์๋ฌธ์ธ ์ ์ด ์์ ์ ์๋ค.
'๋ชจ๋ ๋ฐ์ดํฐ๋ ๋ฐ์ดํฐ ์ค๋์ญ์ ๊ฐ์ง ์๋น์ค์์๋ง ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋ค.' ๋ผ๋ ์์น์ ์ด๊ธ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ํ ์ ์ "???" ๋ Money ๋ฐ์ดํฐ์ ์ ๊ทผ(Query) ์ ํ์ง๋ง, ๋ณ๋ ์ํค์ง๋ ์๋๋ค.
-> ์ฌ์ค์ ๋ค๋ฅธ ๋๋ฉ์ธ์ด๋ฉฐ, ๋ค๋ฅธ ์๋น์ค๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
๋น์ฐํ ๋ชจ๋ Money ์ ์ ๋ณด๋ฅผ ๋ณ๋(Command) ์ํค๋ ์ฃผ์ฒด๋ Money ์๋น์ค์ฌ์ผ๋ง ํ๋ค.
์ด๋ฌํ ํจํด์ CQRS(Command and Query Responsibility Segregation) ํจํด์ด๋ผ๊ณ ํ๋ค.
์๋์ ๊ฐ์ ํน์ง์ ๊ฐ์ง๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ํค๋ Command ์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ Query ๋ฅผ ๋ถ๋ฆฌํ๋ค.
- ์ฅ์ ์ ํ์ ๋น๊ต์ ์์ ๋ก์ด ํธ์ด๋ค.
- Query ๋ฅผ ์ํ ๋ณ๋์ ์๋น์ค๋ฅผ ์๋ณํ๊ณ Query ์๋น์ค์์๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ค.
์ด์ ๋ ์๊น ๋น์ด์๋ "???" ์ ๋ญ๊ฐ ๋ค์ด๊ฐ์ผ ํ ์ง ์ ์ ์์ ๊ฒ์ด๋ค. ๋ฐ๋ก "MoneyQueryService" ์ด๋ค.
๊ทธ๋ฆผ์ ์์ฑ์์ผ๋ณด์!
MoneyQueryService ๋ CQRS ํจํด์ ๊ตฌํํ๋ ๋ก์ง๊ณผ Query ์๋น์ ๋ด๋นํ๋ค.
๐ ๊ฒฐ๋ก
๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค ํ๊ฒฝ์์๋ ๋น์ฆ๋์ค ๋ก์ง์ด ํฌํจ๋ API ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด SQL Join ์ ํ์ฉํ์ผ๋,
MSA ํ๊ฒฝ์ด ๋๋ฉด์ ๋ค๋ฅธ DB๋ฅผ ํ์ฉํ๊ฒ ๋์ด join ์ด ๋ถ๊ฐ๋ฅํด์ก๋ค.
์ด๋ฌํ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๊ฐ์ฅ ๊ฐ๋จํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก API Aggregation, CQRS Pattern ์ด ๋ฌด์์ธ์ง ์์๋ณด์๋ค.
- API Aggregation Pattern์ ์ง๊ด์ ์ด๊ณ ๊ฐ๋จํ์ง๋ง, ์ ๊ฒฝ์จ์ผ ํ ๋ถ๋ถ์ด ๋ง๋ค.
- CQRS ํจํด์ Query ์ Command ๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ผ๋ก ๊ตฌํ์ ์กฐ๊ธ ์ด๋ ต์ง๋ง, ๋ง์ ๋ถ๋ถ์ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.