๐Ÿ”ฌ ๊ฐœ๋ฐœ์ด๋ก 

์ด๋ฒคํŠธ ์†Œ์‹ฑ (Event Sourcing) ์€ ๋ฌด์—‡์ผ๊นŒ?

Dogfoot_JW 2024. 12. 16. 16:23

 

์ด๋ฒคํŠธ ์†Œ์‹ฑ(Event Sourcing)์€ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ €์žฅํ•˜๋Š” ๋Œ€์‹ , ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋กํ•˜๊ณ  ์ด ์ด๋ฒคํŠธ๋“ค์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒํƒœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ์„ค๊ณ„ ํŒจํ„ด์ด๋‹ค. ์ „ํ†ต์ ์ธ CRUD ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๊ณ  ์ด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.


์ด๋ฒคํŠธ ์†Œ์‹ฑ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

  1. ์ด๋ฒคํŠธ(Event)
    ์ด๋ฒคํŠธ๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•œ ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ๊ธฐ๋ก์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์€ํ–‰ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ„์ขŒ ๊ฐœ์„ค, ์ž…๊ธˆ, ์ถœ๊ธˆ ๊ฐ™์€ ๊ฒƒ์ด ์ด๋ฒคํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ์ด๋ฒคํŠธ์—๋Š” ๋ฐœ์ƒ ์‹œ๊ฐ„, ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ๋‹ค.
  2. ์ด๋ฒคํŠธ ๋กœ๊ทธ(Event Log)
    ์ด๋ฒคํŠธ๋“ค์€ ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋ก๋˜๋ฉฐ ๋ถˆ๋ณ€(Immutable)์ด๋‹ค. ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์ˆ˜์ •๋˜์ง€ ์•Š๊ณ , ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๋ณด๊ด€ํ•œ๋‹ค.
  3. ๋ฆฌํ”Œ๋ ˆ์ด(Replaying)
    ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์žฌ์ƒํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  4. ์ปค๋งจ๋“œ(Command)์™€ ์ด๋ฒคํŠธ(Event)
    • ์ปค๋งจ๋“œ๋Š” ์‹œ์Šคํ…œ์— ์ˆ˜ํ–‰ํ•˜๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ์ž‘์—…์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "์†ก๊ธˆํ•˜๊ธฐ"๊ฐ€ ์ปค๋งจ๋“œ๋‹ค.
    • ์ปค๋งจ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฉด ์ด๋ฒคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, "์†ก๊ธˆ ์™„๋ฃŒ๋จ"์ด๋ผ๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ๋‹ค.

 


์˜ˆ์‹œ๋กœ ์‚ดํŽด๋ณด๋Š” ์ด๋ฒคํŠธ ์†Œ์‹ฑ

์€ํ–‰ ๊ณ„์ขŒ ์‹œ์Šคํ…œ

  1. ์ด๋ฒคํŠธ ๋กœ๊ทธ:
1. ๊ณ„์ขŒ ๊ฐœ์„ค (์ดˆ๊ธฐ ์ž”์•ก: 0)
2. ์ž…๊ธˆ (๊ธˆ์•ก: 1000์›)
3. ์ถœ๊ธˆ (๊ธˆ์•ก: 500์›

 

  1. ์ƒํƒœ ์žฌ๊ตฌ์„ฑ:
    ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์žฌ์ƒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒํƒœ๋ฅผ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ณ„์ขŒ ๊ฐœ์„ค → ์ž”์•ก: 0
    • ์ž…๊ธˆ (1000์›) → ์ž”์•ก: 1000
    • ์ถœ๊ธˆ (500์›) → ์ž”์•ก: 500

์ด๋ ‡๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ์ž”์•ก์ด 500์›์ด ๋œ ์ด์œ ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 


CRUD ๋ฐฉ์‹๊ณผ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์˜ ๋น„๊ต

 

1. CRUD ๋ฐฉ์‹

 

CRUD ๋ฐฉ์‹์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ˜„์žฌ ์ƒํƒœ๋งŒ ์ €์žฅํ•œ๋‹ค.

๊ณ„์ขŒ ID์ž”์•ก

12345 500
  • ์ž”์•ก์ด ์™œ 500์›์ด ๋˜์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด๋ ฅ์ด ๋‚จ์•„ ์žˆ์ง€ ์•Š๋‹ค.
  • ๊ณผ๊ฑฐ ์ƒํƒœ๋‚˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

2. ์ด๋ฒคํŠธ ์†Œ์‹ฑ ๋ฐฉ์‹

์ด๋ฒคํŠธ ์†Œ์‹ฑ์—์„œ๋Š” ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋กํ•œ๋‹ค.

์‹œ๊ฐ„์ด๋ฒคํŠธ ํƒ€์ž…๋ฐ์ดํ„ฐ

2024-01-01 ๊ณ„์ขŒ ๊ฐœ์„ค ์ดˆ๊ธฐ ์ž”์•ก: 0
2024-01-05 ์ž…๊ธˆ ๊ธˆ์•ก: 1000์›
2024-01-10 ์ถœ๊ธˆ ๊ธˆ์•ก: 500์›

์ด๋ฒคํŠธ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜๋ฉด ํ˜„์žฌ ์ƒํƒœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ณ€๊ฒฝ ์ด๋ ฅ๊ณผ ์›์ธ๊นŒ์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 


์žฅ์ 

  1. ์ด๋ ฅ ๊ด€๋ฆฌ์™€ ๊ฐ์‚ฌ(Audit)
    ๋ชจ๋“  ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ๊ธฐ๋ก๋˜๋ฏ€๋กœ ๋ณ€๊ฒฝ ์›์ธ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ƒํƒœ ๋ณต์› ๋ฐ ์žฌ๊ตฌ์„ฑ
    ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ๋ฆฌํ”Œ๋ ˆ์ดํ•˜์—ฌ ์‹œ์Šคํ…œ ์ƒํƒœ๋ฅผ ์›ํ•˜๋Š” ์‹œ์ ์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ฑฐ๋‚˜ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋””๋ฒ„๊น…๊ณผ ์‹œ๊ฐ„ ์—ฌํ–‰
    ๊ณผ๊ฑฐ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€์„œ ๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. CQRS์™€์˜ ์‹œ๋„ˆ์ง€
    ์“ฐ๊ธฐ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ๋ชจ๋ธ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ๋™์‹œ์„ฑ ๋ฌธ์ œ ํ•ด๊ฒฐ
    ๋™์‹œ์„ฑ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ธ ๊ฐ€๋ณ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์— ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ˆ˜์ •์ด ์ด๋ค„์ง€์ง€ ์•Š๋Š”๋‹ค.

 


๋‹จ์ 

  1. ์„ค๊ณ„์™€ ๊ตฌํ˜„์˜ ๋ณต์žก์„ฑ
    ์ „ํ†ต์ ์ธ CRUD๋ณด๋‹ค ๋ณต์žกํ•˜๋ฉฐ, ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค.
  2. ์„ฑ๋Šฅ ๋ฌธ์ œ
    ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ƒํƒœ ์žฌ๊ตฌ์„ฑ์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ƒ…์ƒท์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  3. ์ด๋ฒคํŠธ ์ˆ˜์ •์˜ ์–ด๋ ค์›€
    ๊ธฐ๋ก๋œ ์ด๋ฒคํŠธ๋Š” ๋ถˆ๋ณ€์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋Œ€์‹  ๋ณด์ • ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

ํ™œ์šฉ ์‚ฌ๋ก€

  1. ๊ธˆ์œต ์‹œ์Šคํ…œ: ๊ฑฐ๋ž˜ ์ด๋ ฅ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์€ํ–‰์ด๋‚˜ ๊ฒฐ์ œ ์‹œ์Šคํ…œ
  2. ์ด์ปค๋จธ์Šค: ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ๋ฐ ๋ฐฐ์†ก ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ
  3. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ: ํ”Œ๋ ˆ์ด์–ด์˜ ํ–‰๋™ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๊ณ  ์žฌ์ƒ
  4. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ: ์„œ๋น„์Šค ๊ฐ„ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ
  5. ํ˜•์ƒ๊ด€๋ฆฌ ์‹œ์Šคํ…œ: ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค์ฝ”๋“œ์™€ ๋ณ€ํ™”์— ๋Œ€ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ๊ธฐ๋กํ•˜๋Š” ์‹œ์Šคํ…œ. (Git, SVN ๋“ฑ)

์ด๋ฒคํŠธ ์†Œ์‹ฑ์€ ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ํˆฌ๋ช…์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ์ด๋ ฅ์„ ์ถ”์ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์‹œ์Šคํ…œ์— ์œ ์šฉํ•˜๋‹ค.