"๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต์ ์์ฒด๊ฐ ํญ์ ์
์ทจ๋๋ ์ํคํ
์ฒ๋ ์๋๋ค." ํนํ CQRS ํจํด์์ ์ฝ๊ธฐ(Read-Only) DB๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ํจํด์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ "DB ๊ณต์ ๋ ๋์๋ค"๋ผ๋ ์ด์ผ๊ธฐ๊ฐ ์์ฃผ ๋์ฌ๊น? ์ฌ๊ธฐ์๋ ๋ช ๊ฐ์ง ํต์ฌ ์์ธ์ด ์๋ค.
๐ 1. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต์ ๊ฐ ์
์ทจ๋ก ์ฌ๊ฒจ์ง๋ ์ด์
โ
1.1 ์๋น์ค ๊ฐ ๋์ ๊ฒฐํฉ๋ (Tight Coupling)
- ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ๊ณต์ ํ ๋, ํ ์๋น์ค์ ๋ณ๊ฒฝ์ด ๋ค๋ฅธ ์๋น์ค์ ์์์น ๋ชปํ ์ํฅ์ ๋ฏธ์น ์ ์์.
- ์๋ฅผ ๋ค์ด, A ์๋น์ค๊ฐ ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด, B ์๋น์ค๊ฐ ์ด๋ฅผ ์ธ์งํ์ง ๋ชปํ๊ณ ์ฅ์ ๊ฐ ๋ฐ์ํ ์ ์์.
์์:
- ์๋น์ค A: ํ
์ด๋ธ์ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐ
- ์๋น์ค B: ๊ธฐ์กด ์คํค๋ง๋ฅผ ๊ฐ์ ํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์คํ โ ์ค๋ฅ ๋ฐ์
โ
1.2 ์คํค๋ง ์งํ (Schema Evolution)์ ์ด๋ ค์
- ์ฌ๋ฌ ์๋น์ค๊ฐ ๊ฐ์ DB๋ฅผ ๊ณต์ ํ๋ฉด ์คํค๋ง ์งํ(๋ณ๊ฒฝ)๊ฐ ์ด๋ ค์์ง.
- ์๋น์ค๋ง๋ค ํ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅผ ์ ์๋๋ฐ, ์ด๋ฅผ ๊ณตํต ์คํค๋ง๋ก ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ฉด ๋ณต์ก๋๊ฐ ๊ธ์ฆ.
์์:
- ์๋น์ค A๋
users
ํ
์ด๋ธ์ ์๋ก์ด ํ๋(is_active
)๋ฅผ ์ถ๊ฐ.
- ์๋น์ค B๋ ์ด ํ๋๋ฅผ ์ง์ํ์ง ์๊ณ ๊ณ์ ์ค๋ฅ ๋ฐ์.
โ
1.3 ๋จ์ผ ์ฅ์ ์ง์ (Single Point of Failure)
- ๋ชจ๋ ์๋น์ค๊ฐ ๊ฐ์ DB์ ์์กดํ๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์ ์ฒด ์์คํ
์ด ๋ค์ด๋ ์ํ์ด ์์.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ณผ๋ํ ๋ถํ๊ฐ ๋ฐ์ํ๋ฉด, ๋ชจ๋ ์๋น์ค์ ์ฑ๋ฅ์ด ์ ํ๋จ.
์์:
- ์๋น์ค A๊ฐ ๊ณผ๋ํ ํธ๋ํฝ์ ๋ฐ์์์ผ DB ์ฐ๊ฒฐ์ ๋ชจ๋ ์ ์ .
- ์๋น์ค B๋ ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์์.
โ
1.4 ํธ๋์ญ์
๊ฒฝํฉ (Transaction Contention)
- ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผํ ํ
์ด๋ธ์ ๋์์ ์ฐ๊ธฐ(Write) ์ฐ์ฐ์ ์ํํ๋ ค๊ณ ํ ๋, ํธ๋์ญ์
๊ฒฝํฉ(Deadlock)์ด ๋ฐ์ํ ์ ์์.
- ์ด๋ ์ฑ๋ฅ ์ ํ๋ก ์ด์ด์ง.
์์:
- ์๋น์ค A์ ์๋น์ค B๊ฐ ๊ฐ์ ํ
์ด๋ธ์ ๋์์ Update๋ฅผ ์๋.
- ๋ฐ์ดํฐ ์ ๊ธ(Locking)์ด ๋ฐ์ํ์ฌ ๋ณ๋ชฉ ํ์ ๋ฐ์.
โ
1.5 ์ฑ
์ ๋ถ๋ฆฌ ์์น ์๋ฐ (Separation of Concerns)
- MSA(Microservices Architecture)์์๋ ๊ฐ ์๋น์ค๊ฐ ์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํด์ผ ํ๋ค๋ ์์น์ด ์กด์ฌ.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต์ ํ๋ฉด ๊ฐ ์๋น์ค์ ์ฑ
์ ์์ญ์ด ๋ชจํธํด์ง๊ณ ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง.
์์:
- ์๋น์ค A๋ ์ฃผ๋ฌธ(Order) ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ.
- ์๋น์ค B๋ ๊ฒฐ์ (Payment) ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌ.
- ํ๋์
orders
ํ
์ด๋ธ์ ๊ณต์ ํ๋ฉด์ ์๋ก ๋ณ๊ฒฝ์ ๊ฐํ ๊ฒฝ์ฐ, ์ฑ
์ ๋ถ๋ฆฌ๊ฐ ๋ชจํธํด์ง.
๐ 2. CQRS์์ ์กฐํ(Read-Only) DB ๊ณต์ ๊ฐ ํ์ฉ๋๋ ์ด์
โ
2.1 Read-Only ์ ๊ทผ ๋ณด์ฅ
- Query ์๋น์ค๋ ์กฐํ ์ ์ฉ(Read-Only)์ผ๋ก๋ง ๋์ํ๊ธฐ ๋๋ฌธ์ ์คํค๋ง ๋ณ๊ฒฝ์ด๋ ํธ๋์ญ์
๊ฒฝํฉ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์.
โ
2.2 ๋ฐ์ดํฐ ๋ณต์
- Kafka๋ Change Data Capture(CDC) ํจํด์ ์ฌ์ฉํด Command DB โ Query DB๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํจ.
- ์ด๋ก ์ธํด Command DB์ Query DB๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์ด์๋ ์ ์์.
โ
2.3 ์ผ๊ด๋ ๋ฐ์ดํฐ ์กฐํ
- ์ฌ๋ฌ Query ์๋น์ค๊ฐ ๋์ผํ ์กฐํ์ฉ DB๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ผ๊ด์ฑ(Consistency)์ด ์ ์ง๋จ.
ํต์ฌ ํฌ์ธํธ:
- ์กฐํ ์ ์ฉ(Read-Only) DB๋ ์ฌ๋ฌ ์๋น์ค๊ฐ ๊ณต์ ํ ์ ์๋ค.
- ํ์ง๋ง ์ฐ๊ธฐ(Write) ์์
์ ์ ๋ ํ์ฉ๋์ง ์์์ผ ํ๋ค.
๐ก๏ธ 3. ์ฌ๋ฐ๋ฅธ DB ๊ณต์ ํจํด
โ
3.1 ๊ณต์ ๋ฅผ ํผํด์ผ ํ ๊ฒฝ์ฐ
- Command DB (์ฐ๊ธฐ/ํธ๋์ญ์
DB)๋ ๊ณต์ ํ์ง ์์์ผ ํ๋ค.
- ์๋น์ค ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๊ฐ ์๋ก ๋ค๋ฅธ ์๊ตฌ์ฌํญ์ ๊ฐ์ง๋ ๊ฒฝ์ฐ.
โ
3.2 ๊ณต์ ํด๋ ๋๋ ๊ฒฝ์ฐ
- Query DB (์ฝ๊ธฐ ์ ์ฉ DB)๋ ์ฌ๋ฌ ์๋น์ค๊ฐ ๊ณต์ ํ ์ ์๋ค.
- Kafka๋ CDC๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ๋๋ ๊ตฌ์กฐ์ผ ๊ฒฝ์ฐ.
๐ 4. ์ ๋ฆฌ: ์
์ทจ๊ฐ ๋๋ ์ํคํ
์ฒ์ ํ์ฉ๋๋ ์ํคํ
์ฒ
์ ํ | ์ค๋ช
| ํ์ฉ ์ฌ๋ถ |
---|
Command DB ๊ณต์ | ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผํ Command DB๋ฅผ ์ฌ์ฉ | โ ๊ธ์ง |
Query DB ๊ณต์ (Read-Only) | ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผํ ์กฐํ ์ ์ฉ DB๋ฅผ ์ฌ์ฉ | โ
ํ์ฉ |
๋จ์ผ ํ
์ด๋ธ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ํผํฉ ์ฌ์ฉ | ์ฌ๋ฌ ์๋น์ค๊ฐ ๋์ผ ํ
์ด๋ธ์ ์ฝ๊ธฐ/์ฐ๊ธฐ | โ ๊ธ์ง |
๐ง 5. ํต์ฌ ์ ๋ฆฌ
-
๊ณต์ ์์ฒด๊ฐ ๋ฌธ์ ๋ ์๋๋ค:
- ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ์ฐ๊ธฐ(Write) DB๋ฅผ ์ฌ๋ฌ ์๋น์ค๊ฐ ๊ณต์ ํ ๋ ๋ฐ์ํ๋ ๊ฒฐํฉ๋์ ํธ๋์ญ์
๋ฌธ์ ์ด๋ค.
-
์กฐํ(Read-Only) DB ๊ณต์ ๋ ํ์ฉ๋๋ค:
- Kafka, CDC๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ ํ, ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก๋ง ์ ๊ทผํ๋ ๊ฒฝ์ฐ๋ ๊ด์ฐฎ๋ค.
-
์ฑ
์ ๋ถ๋ฆฌ:
- ๊ฐ ์๋น์ค๋ ์์ ๋ง์ Command DB๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
- Query DB๋ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ ์๋น์ค๊ฐ ๊ณต์ ํ ์ ์๋ค.
-
Kafka์ ์ญํ :
- Command DB์ ๋ณ๊ฒฝ์ฌํญ์ Kafka๋ฅผ ํตํด Query DB๋ก ์ ๋ฌ.
- ๋น๋๊ธฐ์ ๋ฐ์ดํฐ ๋ณต์ ๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์ง.
๐ 6. ๊ถ์ฅ ์ํคํ
์ฒ
[Command Service (Spring Boot)] โ [Command DB]
โ
โผ
[Kafka (Event Stream)]
โ โ
โผ โผ
[Query Service A] [Query Service B]
โ โ
โผ โผ
[Query DB (๊ณต์ )]
- Command Service๋ Command DB์ ์ฐ๊ธฐ ์ ์ฉ.
- Query Service๋ Query DB์์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ๋ฐ์ดํฐ ์กฐํ.
- Kafka๊ฐ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ํตํด Command DB์ ๋ณ๊ฒฝ์ฌํญ์ Query DB๋ก ์ ๋ฌ.
๐ฆ 7. ๊ฒฐ๋ก
- DB ๊ณต์ ๊ฐ ์
์ทจ๋ก ์ฌ๊ฒจ์ง๋ ์ด์ : ์ฃผ๋ก Command DB์ ๊ณต์ ๋ก ์ธํ ๋์ ๊ฒฐํฉ๋, ์คํค๋ง ๊ด๋ฆฌ ๋ฌธ์ , ํธ๋์ญ์
๊ฒฝํฉ ๋๋ฌธ์ด๋ค.
- CQRS์์๋ Query DB๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ฉฐ ์คํ๋ ค ํจ์จ์ ์ผ ์ ์๋ค.
- ์ค์ํ ๊ฒ์ ๋ช
ํํ ์ฑ
์ ๋ถ๋ฆฌ์ Read-Only ์์น ์ค์์ด๋ค.