CQRS Pattern

CQRS

Command Query Responsibility Segregation

  • ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒํ˜ธ์ž‘์šฉ์— ๋Œ€ํ•œ ํŒจํ„ด

  • ๋ช…๋ น๊ณผ ์กฐํšŒ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๋Š” ์›์น™์„ ๊ธฐ๋ฐ˜

  • ์ฝ๊ธฐ(Query)์™€ ์“ฐ๊ธฐ(Command) ๋ชจ๋ธ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ

๊ธฐ์กด ์‹œ์Šคํ…œ ๋ฌธ์ œ์ 

  • ์กฐํšŒ์™€ ๋ช…๋ น์„ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์—์„œ ์ฒ˜๋ฆฌ

  • ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ ๋ฐœ์ƒ

  • ๋ณต์žก๋„ ์ฆ๊ฐ€

CQRS ์ด์ 

  • ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ(๋ช…๋ น)๊ณผ ์กฐํšŒ(์ฟผ๋ฆฌ)๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ๋ถ„๋ฆฌ ๋ฐ ์ฒ˜๋ฆฌ

  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ๊ณผ ์กฐํšŒ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ฐ์†Œ

  • ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ

  • ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด๋‚˜ ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ์œ ์šฉ

  • ๋‹จ์ˆœํ•œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง

CQRS์˜ ๊ตฌ์„ฑ ์š”์†Œ

๋ช…๋ น(Command)

  • ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธ

  • ๋ช…๋ น ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ†ต์ง€ํ•œ๋‹ค.

์ฟผ๋ฆฌ(Query)

  • ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ž‘์—…์„ ์˜๋ฏธ

  • ์ฟผ๋ฆฌ ๋ชจ๋ธ์€ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒ

์ด๋ฒคํŠธ(Event)

  • ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ค‘์š”ํ•œ ์‚ฌ๊ฑด์ด๋‚˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋‚˜ํƒ€๋ƒ„

  • ๋ช…๋ น ๋ชจ๋ธ์—์„œ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ด๋ฒคํŠธ๋กœ ๊ธฐ๋ก

๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ(Command Handler)

  • ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ

  • ๋ช…๋ น์„ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ทธ์— ๋”ฐ๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด

์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(Event Handler)

  • ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ

  • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜์—ฌ ์ฟผ๋ฆฌ ๋ชจ๋ธ์„ ์—…๋ฐ์ดํŠธ

๋ช…๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉ, ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ๊ตฌ๋ถ„

๋†’์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ์œ„ํ•ด ์“ฐ๊ธฐ, ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๊ตฌ๋ถ„

Code

Last updated