CQRS(Command and Query Responsibility Segregation) Pattern

์™œ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์„๊นŒ์š”?

  • ์กฐํšŒ ํ™”๋ฉด ํŠน์„ฑ์ƒ ์กฐํšŒ ์†๋„๊ฐ€ ๋น ๋ฅผ ์ˆ˜๋ก ์ข‹์€๋ฐ ์—ฌ๋Ÿฌ Aggregate์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ฌ๊นŒ?๋ผ๋Š” ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • Aggregate๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ID ์‚ฌ์šฉํ•ด์„œ ์ด์šฉํ•œ๋‹ค๋ฉด ์ฆ‰์‹œ ๋กœ๋”ฉ(eager Loading) ๋ฐฉ์‹๊ณผ ๊ฐ™์€ JPA์˜ ์ฟผ๋ฆฌ ๊ด€๋ จ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • Aggregate๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ฐธ์กฐ ๋ฐฉ์‹์œผ๋กœ ํ•œ๋‹คํ•ด๋„ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ง€์—ฐ ๋กœ๋”ฉ(lazy Loading) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  Native Query๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ์˜ ๊ตฌ์กฐ

  • ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ์™€ ์กฐํšŒํ•  ๋•Œ ๋‹จ์ผ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ORM(Object-relational mapping)์€ ๋„๋ฉ”์ธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜์ง€๋งŒ,
    • ์—ฌ๋Ÿฌ Aggregate์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด ๋„๋ฉ”์ธ ๋ณต์žก๋„๊ฐ€ ์ ์  ๋†’์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

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

CQRS๋ž€?

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

  • ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ด€์ ์—์„œ ์ƒํƒœ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ํ•œ Aggregate์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

    • ์ฃผ๋ฌธ ์ทจ์†Œ ๊ธฐ๋Šฅ๊ณผ ๋ฐฐ์†ก์ง€ ์ •๋ณด ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ์€ ํ•œ ๊ฐœ์˜ Order Aggregate์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐํšŒ ๊ธฐ๋Šฅ์€ ํ•˜๋‚˜์˜ Aggregate๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘ ๊ฐœ ์ด์ƒ์˜ Aggregate์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋‹จ์ผ ๋ชจ๋ธ๋กœ ๋‘ ์ข…๋ฅ˜์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋ธ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๊ตฌ์กฐ

๋‹จ์ผ Database ๊ตฌ์กฐ

  • Database๋ฅผ ๊ณต์œ ํ•˜๊ณ  Model์„ Command์™€ Query Model๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์‰ฝ๊ณ  ๋‹จ์ˆœํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฐ™์€ Database๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์€ ํ•ด๊ฒฐํ•˜๊ธฐ ํž˜๋“  ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

Ployglot ๊ตฌ์กฐ

  • Command Database์™€ Query Database๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  Message Broker(RabbitMQ, Kafka)๋ฅผ ํ†ตํ•ด Data ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ๊ฐ๊ฐ์˜ Model์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. : Ployglot ๊ตฌ์กฐ(RDBMS, NoSql, Cache)
  • ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Message Broker์˜ HA์™€ Message ์ „๋‹ฌ์˜ ์‹ ๋ขฐ๋„์— ๋Œ€ํ•ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Event Sourcing ๊ตฌ์กฐ

  • Event Sourcing : Application๋‚ด์˜ ๋ชจ๋“  Action์„ ์ด๋ฒคํŠธ๋กœ ์ „ํ™˜ํ•ด์„œ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ(Event Stream)์„ ๋ณ„๋„์˜ Database์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

Example Event Store

idroot_idevent
11์นดํŠธ ์ƒ์„ฑํ•จ
21์ƒํ’ˆ1 ์ถ”๊ฐ€ํ•จ
31์ƒํ’ˆ2 ์ถ”๊ฐ€ํ•จ
41์ƒํ’ˆ2 ์ œ๊ฑฐํ•จ
51๋ฐฐ์†ก์ •๋ณด ์ž…๋ ฅํ•จ
  • ์‹คํ–‰๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ์‚ฐ์€ ์‚ฝ์ž…(insert) ๋ฟ์ž…๋‹ˆ๋‹ค.
  • ์ˆ˜๋Ÿ‰์ด ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋„, ์‚ญ์ œ๋˜๋Š” ๋ถ€๋ถ„๋„ ์ด๋ฒคํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐฑ์‹ (update)์ด๋‚˜ ์‚ญ์ œ(delete) ์—ฐ์‚ฐ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ์ฒด ๊ด€๊ณ„ํ˜• ์ž„ํ”ผ๋˜์Šค ๋ถˆ์ผ์น˜

์žฅ์ .

  • ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์ค‘ ๊ฒฝํ•ฉ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋ก๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›ํ•˜๋Š” ์‹œ์ ์œผ๋กœ Rollback์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์‹œ์ง€ ์ค‘์‹ฌ(Message-Driven) ์•„ํ‚คํ…์ฒ˜์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • Event Monitoring์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ .

  • ์ƒํƒœ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—…๋ฐ์ดํŠธ ์ถฉ๋Œ ๋ฐœ์ƒ์ด ๋งค์šฐ ์ ์€ ์‹œ์Šคํ…œ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ทฐ ์ผ๊ด€์„ฑ ๋ฐ ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•œ ์‹œ์Šคํ…œ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋ฉฐ

CQRS ์žฅ์ 

  • ๊ฐ๊ฐ์˜ ๋„๋ฉ”์ธ ๋ชฉ์ ์— ๋งž๊ฒŒ ์ง‘์ค‘ํ•˜์—ฌ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์›ํ•˜๋Š”๋Œ€๋กœ ์ตœ์ ํ™”ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ์š”์†Œ๊ฐ€ ๊นจ์งˆ ์œ„ํ—˜์€ ๊ฑฐ์˜ ์—†๋‹ค๋Š” ๊ฒƒ

CQRS ๋‹จ์ 

  • ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ๋” ๋งŽ๋‹ค๋Š” ๊ฒƒ.
  • ๋” ๋งŽ์€ ๊ตฌํ˜„ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ.
  • ์œ ์ง€ ๋น„์šฉ ์ฆ๊ฐ€.

์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•  ๊ฒฝ์šฐ

  • ๋„๋ฉ”์ธ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ.
  • ๋Œ€๊ทœ๋ชจ์˜ ๊ณ ์ฐจ์›์ ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ๊ฒฝ์šฐ.

Reference