์ƒˆ์†Œ์‹

๐Ÿ“šStudy/MSA

[MSA] CQRS ์ด๋Ÿฐ๊ฑฐ์˜€์–ด?

  • -

 

 

 

 

-
 

CQRS (Command Query Responsibility Segregation) 

* CQRS ๋ž€?

๐Ÿ“์ง์—ญํ•˜์ž๋ฉด ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ์˜ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Create-Insert, Update, Delete ์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๊ณผ

Select-Read ์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ฒƒ ๋‘ ๊ฐ€์ง€์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

* ์™œ ์‚ฌ์šฉํ• ๊นŒ?

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

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ ๊ฐœ๋ฐœ์ž๋“ค์€ ๊ณ ๋ฏผํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

๋ฌด์—‡์ด ๋ฌธ์ œ์ผ๊นŒ? ์™œ ๋ฌธ์ œ๊ฐ€ ๋ ๊นŒ?

 

๊ทธ ์‹œ์ž‘์ ์€ ๋ชจ๋ธ์— ์žˆ์—ˆ๋‹ค.

์‚ฌ์šฉ์ž ์กฐํšŒ, Admin, ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ Controller ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ Model์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

 

์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ๋ช…์„ ํ•˜๊ฒŒ๋˜์–ด ์ด๋ฆ„๋งŒ์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋ฟ์ธ๋ฐ Model ์ž์ฒด๋ฅผ ๋˜์ ธ๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๊ณ , SumCount ์™€ ๊ฐ™์€ ๊ด€๋ฆฌ์šฉ ๋ฐ์ดํ„ฐ ๋“ฑ์ด ์‹ค์ œ ์กฐํšŒ์—์„œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋‚˜ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. (์ด๋Ÿฐ ๋‚ด์—ญ์„ ๋‹ค ์•Œ์ง€ ๋ชปํ•˜๋Š” ํ›„๋Œ€ ๊ฐœ๋ฐœ์ž๋“ค์€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ Legacy ๋ชจ๋“œ๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์ฐจ์„ธ๋Œ€ ํ”„๋กœ์ ํŠธ๋กœ ์žฌ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ๋‹ค.)

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ น ๋„๋ฉ”์ธ๊ณผ ์กฐํšŒ ๋„๋ฉ”์ธ์„ ๋ถ„๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. 

*DDD(Domain-driven design) ์˜ ์‹œ์ž‘์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์œผ๋‚˜, Bounded Context ์—์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

 

* ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ?

๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” CQRS๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ ์•„ํ‚คํ…์ณ ํŒจํ„ด๊ณผ ๋ฐฉ๋ฒ•๋ก ์„ ํŒŒ์ƒํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค.

  • Event Sourcing
  • EagerReadDerivation
  • Domain Driven Design
  • Eventual Consistency

 

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ธฐ์กด ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜์—์„œ CQRS ํŒจํ„ด์ด ์ ์šฉ๋˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

CQRS ์ ์šฉ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ RDBMS์™€ NoSQL ๊ด€๊ณ„์—์„œ๋Š” Kafka์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ํ๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์— Redis, Elasticsearch ๋ฅผ ๊ณ๋“ค์ธ๋‹ค๋ฉด ์„ฑ๋Šฅ๋ฉด์—์„œ๋„ ํ›Œ๋ฅญํ•œ ๊ฐœ์„ ์ด ๋  ๋“ฏ ํ•˜๋‹ค.

 

์ถœ์ฒ˜: https://www.ibm.com/cloud/architecture/architectures/event-driven-cqrs-pattern/

๋งˆ์น˜๋ฉฐ

CQRS ํŒจํ„ด์„ ์•Œ๊ฒŒ๋œ ํ›„, Toy Project ์—์„œ ๊ตฌํ˜„ํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ๊ทœ๋ชจ๊ฐ€ ์ž‘๊ณ  ํ†ตํ•ฉํ…Œ์ŠคํŠธ์˜ Cost ๊ฐ€ Production ๋‹จ๊ณ„์—์„œ์˜ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ณด๋‹ค ์ž‘๊ธฐ์— ์ผ€์ด์Šค๊ฐ€ ์ ์€ ๊ด€๊ณ„๋กœ ์•„์‰ฝ๊ฒŒ๋„ ๋‹น์žฅ ํ™œ์šฉ์€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์•˜๋‹ค.

Legacy ์™€ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋กœ ๊ฐ€๋“ํ•œ Production ํ”„๋กœ์ ํŠธ๋“ค์„ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—… ์ง„ํ–‰์ค‘์— ๋ฐœ๊ฒฌํ•˜์—ฌ ์Šคํ„ฐ๋””ํ•œ CQRS ํŒจํ„ด์ด ํ›— ๋‚  ํฐ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ์ฒœ์ฒœํžˆ ์ฐจ๊ทผ์ฐจ๊ทผ ์ง„ํ–‰ํ•ด๋ณด์•„์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.