๐Ÿ› ๏ธ ์™œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต์œ ๊ฐ€ '์•…์ทจ๋‚˜๋Š” ์•„ํ‚คํ…์ฒ˜'๋กœ ์—ฌ๊ฒจ์งˆ๊นŒ?

0

MSA

๋ชฉ๋ก ๋ณด๊ธฐ
7/7

"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณต์œ  ์ž์ฒด๊ฐ€ ํ•ญ์ƒ ์•…์ทจ๋‚˜๋Š” ์•„ํ‚คํ…์ฒ˜๋Š” ์•„๋‹ˆ๋‹ค." ํŠนํžˆ 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. ํ•ต์‹ฌ ์ •๋ฆฌ

  1. ๊ณต์œ  ์ž์ฒด๊ฐ€ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ๋‹ค:

    • ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์“ฐ๊ธฐ(Write) DB๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ๊ณต์œ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐํ•ฉ๋„์™€ ํŠธ๋žœ์žญ์…˜ ๋ฌธ์ œ์ด๋‹ค.
  2. ์กฐํšŒ(Read-Only) DB ๊ณต์œ ๋Š” ํ—ˆ์šฉ๋œ๋‹ค:

    • Kafka, CDC๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•œ ํ›„, ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ๋งŒ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ดœ์ฐฎ๋‹ค.
  3. ์ฑ…์ž„ ๋ถ„๋ฆฌ:

    • ๊ฐ ์„œ๋น„์Šค๋Š” ์ž์‹ ๋งŒ์˜ Command DB๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.
    • Query DB๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. 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 ์›์น™ ์ค€์ˆ˜์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€