[MSA] 7. MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 3 - ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS

๋ฐ˜์‘ํ˜•

์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์ฒ˜์Œ ์ ‘ํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ 2017 SpringCamp์—์„œ์˜€์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ์—๋Š” MSA๋ผ๋Š” ๊ฐœ๋…์— ๋Œ€ํ•ด ์ž˜ ์•Œ์ง€๋„ ๋ชปํ–ˆ๊ณ , MSA๋Š” ๋Œ€๊ธฐ์—…์—์„œ๋‚˜ ์“ธ ์ˆ˜ ์žˆ๊ณ , ์ ์šฉ๊ฐ€๋Šฅํ•œ ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ์•„ํ‚คํ…์ฒ˜์˜€๋‹ค. ๋ผ๊ณ ๋งŒ ์ธ์‹ํ•˜๊ณ  ๋ฌด์ž‘์ • ๋ฐฐ์› ์„ ๋•Œ์˜€์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์ตœ๊ทผ ์ œ๊ฐ€ ๋‹ค๋‹ˆ๊ณ  ์žˆ๋Š” ํšŒ์‚ฌ์—์„œ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS๋ผ๋Š” ์ฃผ์ œ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ํ–ˆ์—ˆ๋Š”๋ฐ์š”. ๋‹ค์‹œ๊ธˆ CQRS๋ฅผ ๋ณด๋ ค๊ณ  ํ•˜๋‹ˆ, ๊ทธ ๊ฐœ๋…์ด ์ž˜ ๊ธฐ์–ต๋‚˜์ง€ ์•Š๊ณ , ์–ด๋–ค ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์„œ ์ด๋ ‡๊ฒŒ ์ •๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 3๋ฒˆ์งธ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

์ „ํ†ต์ ์ธ CRUD

๊ฐ€๋”์€ ์ด๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ CRUD๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฐฑ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜ ๋กœ์ง์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ๋œ์–ด์ฃผ๊ณ , ์ด ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์•„๋‹Œ๊ฐ€ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋‚˜ ์ตœ๊ทผ MSA๋ฅผ ํ•˜๋ฉด์„œ ๋„๋ฉ”์ธ ๋ณ„๋กœ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜ํ•œ ๋ถ„๋ฆฌํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์€ ๊ทธ์•ผ๋ง๋กœ ๋ฌด์šฉ์ง€๋ฌผ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋‹ค๋ณด๋‹ˆ ์ฐธ์กฐ๊ฐ€ ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 2ํŽธ์—์„œ Two-Phase Commit์ด๋ผ๋Š” ๊ฑธ ์ด์•ผ๊ธฐํ•˜๊ธฐ๋„ ํ–ˆ์—ˆ์ง€์š”.

 

2020.11.02 - [Architecture/MSA] - [MSA] 6. MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 2 - Two-Phase commit๊ณผ Saga

 

[MSA] 6. MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ 2 - Two-Phase commit๊ณผ Saga

์ด์ „ ๊ธ€์— ์ด์–ด์„œ MSA ๋‚ด์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์›ํ™œํžˆ ํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋”๋ถˆ์–ด ๋ชจ๋†€๋ฆฌํ‹ฑ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•œ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ DB ์„œ๋ฒ„์—์„œ ์ œ๊ณต

blog.neonkid.xyz

๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์ด MSA์—์„œ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ์š”? ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๊ด€๊ณ„๋ฅผ ๋งบ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” MSA์˜ ๋ชฉ์ ์€ ์„œ๋กœ์˜ ์˜์กด์„ฑ์„ ๊ฐ€๋Šฅํ•œ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ „ํŒŒ๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด์ง€๋งŒ ์ „ํ†ต์ ์ธ CRUD๋Š” ๋™์‹œ์„ฑ์„ ๊ฐ•ํ•˜๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋™์‹œ ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ์˜คํžˆ๋ ค ๋”์šฑ ๊ฐ€์ค‘์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

์ „ํ†ต์ ์ธ CRUD์—์„œ ๋‘ ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๋–„ A ํ…Œ์ด๋ธ”์ด B ํ…Œ์ด๋ธ”์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์ด ์ œ๊ฑฐ๋˜๊ฑฐ๋‚˜ ์ฐธ์กฐ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„๋ฝ๋˜๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒํ•˜๊ณ , ๋งŒ์•ฝ ๋‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ์—๋ผ๋„ ๋‘ ํ…Œ์ด๋ธ” ๊ฐ„์— ๋ฐ์ดํ„ฐ๊ฐ€ ๊ด€๊ณ„์„ฑ๋ฆฝ ๋˜์—ˆ์„ ๋•Œ ๊ฒฐํ•ฉ์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งค๊ฟ”์ค€๋‹ค๋ฉด ์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์—ˆ๋‹คํ•˜๋”๋ผ๋„ ์˜ค๋ฅ˜ ์ „ํŒŒ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋Š” ์ง€์†๋˜๋Š” ๊ฒƒ์ด์ฃ .

 

 

 

 

์ด๋ฒคํŠธ ์†Œ์‹ฑ

์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ–ˆ์„ ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜ ํŠน์„ฑ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๊ฒƒ์ด ์›์ž์„ฑ์ธ๋ฐ์š”.

 

  • ์›์ž์„ฑ 

    ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์€ ๋ชจ๋‘ ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์„ฑ๊ณต์ด๊ณ , ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๊ทธ ํŠธ๋žœ์žญ์…˜์€ ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋Š” ์›์น™

์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด, ์˜ํ™”๊ด€์—์„œ ์ขŒ์„์„ ์˜ˆ์•ฝํ•˜๋Š” ์‹œ์Šคํ…œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ขŒ์„ ์˜ˆ์•ฝ์„ ์œ„ํ•ด ์ขŒ์„ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•˜๊ณ , ๊ฒฐ์ œ ๋‚ด์—ญ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฒฐ์ œ ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ…Œ์ด๋ธ”์€ ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝ ๋˜์–ด ์žˆ๊ณ , ๊ณ ๊ฐ์ด ์ขŒ์„์„ ์˜ˆ์•ฝํ–ˆ๋‹ค๋ฉด ์ขŒ์„ ํ…Œ์ด๋ธ”์— ํ•ด๋‹น ๊ณ ๊ฐ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์ขŒ์„์„ ์˜ˆ์•ฝํ•œ ๊ฒฐ์ œ ๋‚ด์—ญ์€ ๊ฒฐ์ œ ํ…Œ์ด๋ธ”์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ์ขŒ์„ ์˜ˆ์•ฝ์€ ์„ฑ๊ณตํ–ˆ์ง€๋งŒ ๊ฒฐ์ œ๋Š” ์‹คํŒจํ–ˆ๋‹ค๋ฉด? ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ด ์ขŒ์„์˜ ์˜ˆ์•ฝ์€ ์„ฑ๋ฆฝ๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ์šฐ๋ฆฌ๋Š” ์›์ž์„ฑ์ด๋ผ๊ณ  ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฌํ•œ ์ผ๋ จ์˜ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ๊ฐ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ…Œ๋ฉด A ๊ณ ๊ฐ์ด ์ขŒ์„์„ ์˜ˆ์•ฝํ•จ -> A ๊ณ ๊ฐ์ด ํ•ด๋‹น ์ขŒ์„์— ๋Œ€ํ•ด ๊ฒฐ์ œ๋ฅผ ์ง„ํ–‰ํ•จ. ์ฒ˜๋Ÿผ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ ์šฐ๋ฆฌ๋Š” ์ด๋ฒคํŠธ ์†Œ์‹ฑ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์˜ํ™”๊ด€์˜ ์ขŒ์„์„ ์˜ˆ์•ฝํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ ๋‹ค๊ณ  ๋ณธ๋‹ค๋ฉด ์ „ํ†ต์ ์ธ CRUD๋ฅผ ์ƒ๊ฐํ–ˆ์„ ๋•Œ ์šฐ๋ฆฌ๋Š” ๊ฐ„๋‹จํžˆ ์ด ์‚ฌ๋žŒ์ด ์–ด๋–ค ์ขŒ์„์„ ์˜ˆ์•ฝํ–ˆ๊ณ , ์–ด๋Š ์‹œ๊ฐ„ ๋•Œ์— ์–ด๋Š ์˜ํ™”๋ฅผ ์ƒ์˜ํ•˜๋Š”์ง€ ์ •๋„๋งŒ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๊ทธ๋Ÿฐ๋ฐ, MSA์—์„œ๋Š” ์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์„ ์ด๋ฒคํŠธ๋ณ„๋กœ ์ผ๊ด„ ์ €์žฅํ•จ์œผ๋กœ์จ ์ผ๋ถ€ ํŠธ๋žœ์žญ์…˜์—์„œ Fail์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ์œผ๋กœ์จ ์›์ž์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ „ํ†ต์ ์ธ CRUD์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋ชฉํ‘œ์˜€๋‹ค๋ฉด ์ง€๊ธˆ์€ ๋กœ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ์ฐจํ›„ ์ •ํ˜•ํ™”๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๋Š” ์—„์ฒญ ํฐ ๋น„์šฉ์ด ๋“œ๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณด๋„ค์š”.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ์ด๋ฒคํŠธ๋“ค์€ ์–ด๋””์— ์ €์žฅ์„ ํ•ด์•ผํ• ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  ์ด ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ค ํ˜•ํƒœ๋กœ ์ €์žฅํ•ด์•ผ ํ• ๊นŒ์š”? ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค๋ฉด ์ด๊ฑธ ์ƒ‰์ธํ•  ๋•Œ ๋ถ€ํ•˜๊ฐ€ ์—„์ฒญ ํฌ์ง€ ์•Š์„๊นŒ์š”?

 

๋‹ค์–‘ํ•œ ์˜๋ฌธ์ ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ด€ํ•˜์—ฌ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  ํ•˜์ง€๋งŒ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค๋ฉด ์ผ๋‹จ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์ด ์ƒ๊น๋‹ˆ๋‹ค.

 

  1. ๊ฐ ์ด๋ฒคํŠธ ๋ณ„๋กœ ID๊ฐ€ ์ฃผ์–ด์งˆํ…๋ฐ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฌด์ˆ˜ํ•˜๊ฒŒ ์Œ“์ด๋ฉด ์ถฉ๋Œ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ID ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€๊ฐ€?
  2. ์ผ๋ถ€ ํŠน์ˆ˜ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ณต๊ท€ํ•˜๊ฑฐ๋‚˜ ํŠธ๋žœ์žญ์…˜์— ๋ฐ˜์˜ํ•˜๋Š” ๋“ฑ์„ ์ง„ํ–‰ํ• ํ…๋ฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋Œ€๋Ÿ‰์œผ๋กœ ์Œ“์ด๋ฉด ์ƒ‰์ธ์ด ๋Š๋ ค์งˆ ๊ฒƒ์ด๋‹ค. ์ด์— ๋Œ€ํ•œ ์ „๋žต์ด ์žˆ๋Š”๊ฐ€?
  3. 2๋ฒˆ์„ ์ด์šฉํ•˜์—ฌ ๊ณผ๊ฑฐ์˜ ์ด๋ฒคํŠธ๋ฅผ ํšŒ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์–ด๋– ํ•œ ๊ฒƒ์ด ์žˆ์„๊นŒ?

 

 

 

Event Store

๋จผ์ € ์ด๋ฒคํŠธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์ด๋ฒคํŠธ ์ €์žฅ์— ํŠนํ™”๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์‚ฌ์šฉ (e.g. eventstore.org)
  • NoSQL ์‚ฌ์šฉ (MongoDB, Redis)
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ (MySQL, PostgreSQL)

์ด๋ฒคํŠธ์˜ ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”๋˜๋Š” ๋‚ด์šฉ (payload)์™€ ํ•ด๋‹น ์ด๋ฒคํŠธ ํƒ€์ž…์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ๊ทธ ํ•˜์œ„๋Š” ์„œ๋น„์Šค์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์ž์œ ๋กญ๊ฒŒ ๊ฒฐ์ •ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” NoSQL์„ ์ถ”์ฒœํ•˜์ง€๋งŒ PostgreSQL๊ณผ ๊ฐ™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ JSONB์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์€ ์„ ํƒ์ด๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค.

 

 

 

 

Snapshot

๋งŒ์•ฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฌด์ˆ˜ํžˆ ๋งŽ์•„์ง€๋ฉด ์–ด๋–จ๊นŒ์š”? ์ด๋ฒคํŠธ๊ฐ€ ์Œ“์—ฌ์„œ ์ˆ˜ ์ฒœ๋งŒ๊ฐœ, ์–ต๊ฐœ ์ด๋ ‡๊ฒŒ ์ €์žฅ์ด ๋œ๋‹ค๋ฉด ํƒ์ƒ‰ ์‹œ๊ฐ„์ด ์—„์ฒญ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ทธ๋งŒํผ ๊ธธ์–ด์ง€๊ณ , ๋™๊ธฐํ™”๊ฐ€ ๋Š๋ ค์ง€๊ฒŒ ๋˜๋Š”๋ฐ์š”. ์ด ๋•Œ ์“ฐ๋Š” ์ „๋žต์ด ๋ฐ”๋กœ ์Šค๋ƒ…์ƒท์ž…๋‹ˆ๋‹ค.

 

์Šค๋ƒ…์ƒท์€ ์ˆ˜๋งŽ์€ ์ด๋ฒคํŠธ ์ค‘์—์„œ ํŠน์ • ์ด๋ฒคํŠธ ๊ตฌ๊ฐ„์„ ๋ณ„๋„๋กœ ์ €์žฅํ•˜๊ณ , ์กฐํšŒํ•  ๋•Œ ๊ทธ ๊ตฌ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋งŒ์„ ์กฐํšŒํ•ด์„œ ์กฐํšŒ ์‹œ๊ฐ„์„ ๋น ๋ฅด๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ Event Store ์ „์šฉ ์ €์žฅ์†Œ๋ผ๋ฉด ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์ฃผ๊ฒ ์ง€๋งŒ NoSQL, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์ด ์ด๋ฒคํŠธ ํŠนํ™”๋œ ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹Œ ๊ฑธ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

CQRS

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ ์†Œ์‹ฑ์—๋Š” CQRS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. CQRS๋Š” ๋ช…๋ น๊ณผ ์กฐํšŒ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์œผ๋กœ Command and Query Reponsibility Segregation์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. 

 

๋ช…๋ น๊ณผ ์กฐํšŒ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•œ๋‹ค? ๋ฌด์Šจ ์ด์•ผ๊ธฐ์ผ๊นŒ์š”. ๊ฐ„๋‹จํ•˜๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด CRUD์—์„œ ์กฐํšŒ๋Š” R(Read)๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ์ €์žฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์ง€์š”. ๋ณดํ†ต์˜ CRUD๋Š” ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๊ฐ™์ด ํ•˜์ง€๋งŒ, CQRS๋Š” ์ƒ์„ฑ, ์‚ญ์ œ, ์ˆ˜์ •๊ณผ ์กฐํšŒ(Read)๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ํ•˜๋„๋ก ํ•˜๋Š” ๊ฑธ ๋งํ•ฉ๋‹ˆ๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ์„ ๋ณด์‹œ๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์กฐํšŒ์™€ ์ƒ์„ฑ/์ˆ˜์ •์„ ์œ„ํ•ด ๋ณ„๊ฐœ์˜ API๋ฅผ ๋ถ€๋ฅด๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Event Store์—์„œ๋Š” ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ , ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋กํ•œ ๋’ค์—๋Š” Event Broker ๋“ฑ์„ ํ†ตํ•ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ View Store๋กœ ์ €์žฅํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, CQRS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”? Event Store์—์„œ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ํ™œ์šฉํ•˜๊ณ  ์žˆ๋Š”๋ฐ, Event Store์—์„œ ํƒ€์ž…์„ ์ •ํ•ด์ฃผ๊ณ , ๊ทธ์— ๋งž๋Š” ์ปฌ๋Ÿผ๊ณผ ํ•จ๊ป˜ Payload๋งŒ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ๋กœ ์กฑํ•˜์ง€ ์•Š์„๊นŒ์š”?

 

Event Store์—์„œ ๊ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ๋กœ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๊ณ , ์—ฌ๊ธฐ์„œ๋„ ๋ฌผ๋ก  ์กฐํšŒ๋Š” ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋“ค ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์ˆ˜ํžˆ ์Œ“์ด๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์กฐํšŒ๋Š” ๊ทธ๋งŒํผ ๋”œ๋ ˆ์ด๊ฐ€ ๊ฑธ๋ฆฌ๊ณ , ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ ํƒ์ƒ‰ํ•ด์„œ ํ•ด๋‹น API์— ๋งž๋Š” ์ด๋ฒคํŠธ ํƒ€์ž…์„ ๋˜ ๊ฒ€์ƒ‰ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์‹œ๊ฐ„์ด ์—„์ฒญ ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

 

์ด๋Ÿด ๋•Œ๋Š” ํ•ด๋‹น ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ด๋ธ”์—์„œ ๋ฐ”๋กœ ์กฐํšŒํ•˜๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋ ˆ๋ฒจ์—์„œ ๊ณ ๊ฐ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณผ ๋•Œ๋Š” ๊ทธ ๊ฒฐ๊ณผ๋งŒ์„ ๋ฐ”๋ผ๋ณด ๋˜, ์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ๊ทธ ๊ณผ์ •์„ ๋ณด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ๋ฐ, ์ด๋“ค ๋‘˜์„ ๋ชจ๋‘ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ ๋งค์šฐ ๊ธด ๊ฐœ๋…์˜ MSA ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ๋ฅผ ์ข€ ๋” ์ด์–ด๋‚˜๊ฐ€ ๋ดค์Šต๋‹ˆ๋‹ค. ์–ธ๋“ฏ๋ณด๋ฉด Saga ํŒจํ„ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—์„œ๋Š” ์œ ์‚ฌํ•˜๊ณ , ์—ฌ๊ธฐ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด ์ด๋ฒคํŠธ ์†Œ์‹ฑ, ์ด๊ฑธ ๋”ํ•ด์„œ ์ฝ๊ธฐ์— ์ข€ ๋” ์ตœ์ ํ™” ๋œ ๊ฐœ๋…์„ ๋ถ™์ธ ๊ฒƒ์ด CQRS๋”” ๋ผ๊ณ  ๋ณด์‹ ๋‹ค๋ฉด ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋„ค์š”.

 

๋ง๋ถ™์—ฌ์„œ ์Šค๋ƒ…์ƒท์„ ํ†ตํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ข€ ๋” ๋ณด์ถฉํ•ด์„œ ์„ค๋ช…๋“œ๋ฆฌ์ž๋ฉด, 1๋งŒ ๊ฐœ์˜ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ณณ์—์„œ๋” 1000๋ฒˆ ID์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์กฐํšŒํ•˜๊ณ ์ž ํ•  ๋•Œ, 900๋ฒˆ์งธ ๋ฐ์ดํ„ฐ ๊ฐ’๋ถ€ํ„ฐ ์Šค๋ƒ…์ƒท์œผ๋กœ ์ €์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด 900๋ฒˆ๋ถ€ํ„ฐ ์Œ“์ธ ๋ฐ์ดํ„ฐ๋งŒ์„ ์กฐํšŒํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋์œผ๋กœ CQRS์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค๋งŒ Event Sourcing ํŒจํ„ด์€ Write์— ์ง‘์ค‘๋œ ์ „๋žต์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆ˜๋งŽ์€ ์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์€ REST API ์„œ๋น„์Šค์— ์žˆ์–ด ์‹œ๊ฐ„์ ์ธ ์†Œ๋ชจ๊ฐ€ ๋งค์šฐ ํฌ๋ฆฌํ‹ฐ์ปฌํ•˜๊ฒŒ ์ž‘์šฉ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์€ ๊ณณ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๋ฐฉ๋Œ€ํ•˜๊ณ  ํฐ ์„œ๋น„์Šค๋ผ๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Event Sourcing์„ ์œ„ํ•ด CQRS๋Š” ํ•„์ˆ˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋ฐ˜๋Œ€๋กœ CQRS๋ฅผ ์œ„ํ•ด ์ด๋ฒคํŠธ ์†Œ์‹ฑ์„ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ฃผ์ฒด๋ฅผ ์“ฐ๊ธฐ์™€ ์ฝ๊ธฐ๋กœ ๊ตฌ๋ถ„์ง€์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ทธ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ์ด๋ฒคํŠธ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ. ์ด๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ฅผ ํ•˜๊ณ  ๊ณ„์‹  ์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์žฌ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ ํฌ์ŠคํŠธ๋Š” ์ด๋ฅผ ์ด์–ด์„œ ๋ณธ๊ฒฉ์ ์ธ Spring + Axon Framework๋ฅผ ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

(์ด์ „๋ถ€ํ„ฐ ์œ„ ์ฃผ์ œ์— ๋Œ€ํ•ด ๊ธ€์„ ์จ๋ณด๊ธฐ๋กœ ํ–ˆ๋Š”๋ฐ, ๋งŽ์ด ๋Šฆ์–ด์ง„ ์  ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.)

 

 

 

 

์ฐธ๊ณ : https://edykim.com/ko/post/eventsourcing-pattern-cleanup/

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments