CQRS Pattern

Command-Query Responsibility Segregation

CQRS๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ฝ๊ธฐ ๋ฐ ์—…๋ฐ์ดํŠธ ์ž‘์—…์„ ๊ตฌ๋ถ„ํ•˜๋Š” ํŒจํ„ด์ธ Command and Query Responsibility Segregation์˜ ์•ฝ์ž์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— CQRS๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์„ฑ๋Šฅ, ํ™•์žฅ์„ฑ ๋ฐ ๋ณด์•ˆ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CQRS๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ƒ์„ฑ๋œ ์œ ์—ฐ์„ฑ์„ ํ†ตํ•ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ์ด ๋” ์ž˜ ๋ฐœ์ „ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ๋ช…๋ น์ด ๋„๋ฉ”์ธ ์ˆ˜์ค€์—์„œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Context and problem

๊ธฐ์กด ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฟผ๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ณ  ๊ธฐ๋ณธ CRUD ์ž‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋ณต์žกํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ด ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค๋ฃจ๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ๊ธฐ ์ธก๋ฉด์—์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์–‘ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ์–‘์ด ๋‹ค๋ฅธ DTO(๋ฐ์ดํ„ฐ ์ „์†ก ๊ฐœ์ฒด)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ฒด ๋งคํ•‘์ด ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์ธก๋ฉด์—์„œ ๋ชจ๋ธ์€ ๋ณต์žกํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋…ผ๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๋Š” ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ๋ชจ๋ธ๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์›Œํฌ๋กœ๋“œ๋Š” ์„ฑ๋Šฅ ๋ฐ ํ™•์žฅ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋งค์šฐ ๋‹ค๋ฅธ ๋น„๋Œ€์นญ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ์ž‘์—…์˜ ์ผ๋ถ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์ถ”๊ฐ€ ์—ด ๋˜๋Š” ์†์„ฑ๊ณผ ๊ฐ™์ด ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ํ‘œํ˜„ ๊ฐ„์— ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์—์„œ ์ž‘์—…์ด ๋ณ‘๋ ฌ๋กœ ์ˆ˜ํ–‰๋  ๋•Œ ๋ฐ์ดํ„ฐ ๊ฒฝํ•ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ์กด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ฐ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ณ„์ธต์˜ ๋กœ๋“œ์™€ ์ •๋ณด ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ์ฟผ๋ฆฌ์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์„ฑ๋Šฅ์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์—”ํ„ฐํ‹ฐ๊ฐ€ ์ž˜๋ชป๋œ ์ปจํ…์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…์˜ ์˜ํ–ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ

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

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

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

Solution

CQRS๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ช…๋ น๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋ธ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๋ช…๋ น์€ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์ด ์•„๋‹ˆ๋ผ ์ž‘์—… ๊ธฐ๋ฐ˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ("Book hotel room", not "set ReservationStatus to Reserved")

  • ๋ช…๋ น์€ ๋™๊ธฐ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋Š” ๋„๋ฉ”์ธ ์ง€์‹์„ ์บก์Аํ™”ํ•˜์ง€ ์•Š๋Š” DTO๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ ˆ๋Œ€์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์— ํ‘œ์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋ธ์„ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ์ฟผ๋ฆฌ ๋ฐ ์—…๋ฐ์ดํŠธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„์ด ๊ฐ„์†Œํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ O/RM ๋„๊ตฌ์™€ ๊ฐ™์€ scaffolding ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์—์„œ CQRS ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ์ƒ์„ฑ๋œ ์ฝ”๋“œ ์œ„์— ์‚ฌ์šฉ์ž customizationํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๊ฒฉ๋ฆฌ ์ˆ˜์ค€์„ ๋†’์ด๋ ค๋ฉด ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ์—์„œ ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฟผ๋ฆฌ์— ์ตœ์ ํ™”๋œ ์ž์ฒด ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณต์žกํ•œ ์กฐ์ธ์ด๋‚˜ ๋ณต์žกํ•œ O/RM ๋งคํ•‘์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ์˜ Materialized View๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ด€๊ณ„ํ˜•์ด๊ณ  ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฌธ์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋™๊ธฐํ™” ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์“ฐ๊ธฐ ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ publishํ•˜๋„๋ก ํ•จ์œผ๋กœ์จ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Event-driven architecture style์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹จ์ผ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์— ์ฐธ์—ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ publishํ•  ๋•Œ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Idempotent message processing์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ €์žฅ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๊ฐ ์ €์žฅ์†Œ๋ฅผ ๋กœ๋“œ์— ๋งž๊ฒŒ ์ ์ ˆํ•˜๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ๊ธฐ ์ €์žฅ์†Œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๊ธฐ ์ €์žฅ์†Œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋ถ€ํ•˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

CQRS์˜ ์ผ๋ถ€ ๊ตฌํ˜„์—์„œ๋Š” Event Sourcing pattern์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ ์ผ๋ จ์˜ ์ด๋ฒคํŠธ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์ด๋ฒคํŠธ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ƒํƒœ๋Š” ์ด๋ฒคํŠธ๋ฅผ ์žฌ์ƒํ•˜์—ฌ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. CQRS ์ปจํ…์ŠคํŠธ์—์„œ Event Sourcing์˜ ํ•œ ๊ฐ€์ง€ benefit์€ ๋™์ผํ•œ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ, ํŠนํžˆ ์ฝ๊ธฐ ๋ชจ๋ธ์— ์•Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฝ๊ธฐ ๋ชจ๋ธ์€ ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ์— ๋” ํšจ์œจ์ ์ธ ํ˜„์žฌ ์ƒํƒœ์˜ ์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Event Sourcing์€ ์„ค๊ณ„์— ๋ณต์žก์„ฑ์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.

์ ์šฉ ๋ฐฉ๋ฒ•

๊ธฐ์กด ์ฝ”๋“œ์—์„œ ์ ์ง„์ ์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ์šฉ

๋„๋ฉ”์ธ ๋ชจ๋ธ์—๋Š” ์ตœ์†Œํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋ธ ๋‚ด์˜ ๋„๋ฉ”์ธ ๊ฐœ์ฒด์— ๋Œ€ํ•ด CRUD ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ API๋Š” ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ CRUDํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋„๋ฉ”์ธ์— ํŠนํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. findCustomer()๋Œ€์‹  , placeOrder(), transferFunds()๋“ฑ๊ณผ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์œ„ ์ˆ˜์ค€ ์ž‘์—…์„ ๋…ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ํ•„์š”์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋ฉฐ ๋•Œ๋กœ๋Š” ๋‹จ์ผ ์ž‘์—…์—์„œ ๋‘ โ€‹โ€‹์ž‘์—…์„ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋งž๋Š” ํ•œ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

CQRS ํŒจํ„ด์„ ์ ์šฉํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ์ด์ž ๊ฐ€์žฅ ๋ˆˆ์— ๋„๋Š” ๋‹จ๊ณ„๋Š” CRUD API๋ฅผ ๋ณ„๋„์˜ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ API๋กœ ๋ถ„ํ• ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์ด์ „๊ณผ ๋™์ผํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๋ณด์—ฌ ์ฃผ์ง€๋งŒ ๋‹จ์ผ CRUD API๋Š” ๊ฒ€์ƒ‰ ๋ฐ ์ˆ˜์ • API๋กœ ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

๋‘ API๋Š” ๊ธฐ์กด ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ๊ณต์œ ํ•˜์ง€๋งŒ ๋™์ž‘์„ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝ๊ธฐ : ๊ฒ€์ƒ‰ API๋Š” ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋„๋ฉ”์ธ ๋ชจ๋ธ์—์„œ ๊ฐœ์ฒด์˜ ๊ธฐ์กด ์ƒํƒœ๋ฅผ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. API๋Š” ๋„๋ฉ”์ธ ์ƒํƒœ๋ฅผ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์“ฐ๊ธฐ : ์ˆ˜์ • API๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. CUD ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋„๋ฉ”์ธ ๊ฐœ์ฒด ๋งŒ๋“ค๊ธฐ, ๊ธฐ์กด ๊ฐœ์ฒด์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ, ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐœ์ฒด ์‚ญ์ œ. ์ด API์˜ ์ž‘์—…์€ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์„ฑ๊ณต(ack ๋˜๋Š” void) ๋˜๋Š” ์‹คํŒจ(nak ๋˜๋Š” ์˜ˆ์™ธ ๋ฐœ์ƒ)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ ์ž‘์—…์€ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋Š” ์—”ํ„ฐํ‹ฐ ํ‚ค์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ API ๋ถ„๋ฆฌ๋Š” CQS( Command Query Separation ) ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฉ”์„œ๋“œ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐœ์ฒด์˜ ๊ฐ ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ ๋‘ ๋ฒ”์ฃผ ์ค‘ ํ•˜๋‚˜์— ์†ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋‘˜ ๋‹ค๋Š” ์•„๋‹˜).

  • ์ฟผ๋ฆฌ : ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€์ž‘์šฉ์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋ช…๋ น (์ผ๋ช… ์ˆ˜์ •์ž ๋˜๋Š” ๋ฎคํ…Œ์ดํ„ฐ): ์‹œ์Šคํ…œ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ์˜ ํ‘œ์‹œ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

์“ฐ๊ธฐ ๋ชจ๋ธ

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

์ฝ๊ธฐ ๋ชจ๋ธ

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

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

์ด ๋‹จ๊ณ„์˜ ์„ค๊ณ„๋Š” ์ด์ „ ๋‹จ๊ณ„์˜ ์„ค๊ณ„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ณต์‚ฌ๋ณธ์ด ์žˆ๋Š” ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง ๋ฐ ๋ฐ์ดํ„ฐ ์‚ฌ์šฉ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋™๊ธฐํ™”ํ•˜๊ณ  ๋ณต์‚ฌ๋ณธ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

CQRS๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋™๊ธฐํ™” ์œ ์ง€๋ฅผ ์ง€์›ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋””์ž์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

  • ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ ๊ฒŒ์‹œ๋ฅผ ์œ„ํ•œ ์ด๋ฒคํŠธ ๋ฒ„์Šค (ํ•„์ˆ˜): ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝ ์•Œ๋ฆผ์ด ์ด๋ฒคํŠธ ๋ฒ„์Šค์— ์ด๋ฒคํŠธ๋กœ ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ๋Š” ๋‹น์‚ฌ์ž๋Š” ์ด๋ฒคํŠธ ๋ฒ„์Šค์— ๊ฐ€์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋‹น์‚ฌ์ž ์ค‘ ํ•˜๋‚˜๋Š” ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์šฉ ์ด๋ฒคํŠธ ํ”„๋กœ์„ธ์„œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ•ด๋‹น ์—…๋ฐ์ดํŠธ๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Benefits of CQRS include:

  • Independent scaling

    • CQRS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž ๊ธˆ ๊ฒฝํ•ฉ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

    • ์ฟผ๋ฆฌ ๋ถ€ํ•˜๊ฐ€ ์“ฐ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ด๋™๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ™•์žฅ์„ฑ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด๊ณ  ๋งŽ์€ ๋ถ€ํ•˜๊ฐ€ ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ ์ฑ…์ž„์„ ์–ธ๋กœ๋“œํ•˜๋ฉด ๊ฒฐํ•ฉ๋œ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค์˜ ํ™•์žฅ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Optimized data schemas

    • ์ฝ๊ธฐ ์ธก์€ ์ฟผ๋ฆฌ์— ์ตœ์ ํ™”๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์“ฐ๊ธฐ ์ธก์€ ์—…๋ฐ์ดํŠธ์— ์ตœ์ ํ™”๋œ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • Security

    • ์˜ฌ๋ฐ”๋ฅธ ๋„๋ฉ”์ธ ์—”ํ„ฐํ‹ฐ๋งŒ ๋ฐ์ดํ„ฐ์— ์“ฐ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • Separation of concerns

    • ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ธก๋ฉด์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๋” ์‰ฝ๊ณ  ์œ ์—ฐํ•œ ๋ชจ๋ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์“ฐ๊ธฐ ๋ชจ๋ธ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ฝ๊ธฐ ๋ชจ๋ธ์€ ๋น„๊ต์  ๋‹จ์ˆœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Simpler queries

    • ์ฝ๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ตฌ์ฒดํ™”๋œ ๋ทฐ๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ฟผ๋ฆฌํ•  ๋•Œ ๋ณต์žกํ•œ ์กฐ์ธ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Implementation issues and considerations

  • Complexity

    • CQRS์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋Š” simple์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋””์ž์ธ์ด ๋” ๋ณต์žก(ํŠนํžˆ Event Sourcing pattern์„ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ)ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Messaging

    • CQRS์—๋Š” ๋ฉ”์‹œ์ง•์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฉ”์‹œ์ง•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ์ด๋ฒคํŠธ๋ฅผ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฉ”์‹œ์ง€ ์‹คํŒจ ๋˜๋Š” ์ค‘๋ณต ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‹ค๋ฅธ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด Priority Queues์—ด์— ๋Œ€ํ•œ ์ง€์นจ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • Eventual consistency

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

When to use CQRS pattern

Consider CQRS for the following scenarios:

  • ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋ณ‘๋ ฌ๋กœ ์•ก์„ธ์Šคํ•˜๋Š” Collaborative domains

    • CQRS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„๋ฉ”์ธ ์ˆ˜์ค€์—์„œ ๋ณ‘ํ•ฉ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ถฉ๋ถ„ํ•œ ์„ธ๋ถ„ํ™” ๋ช…๋ น์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฐœ์ƒํ•˜๋Š” ์ถฉ๋Œ์€ ๋ช…๋ น์œผ๋กœ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ผ๋ จ์˜ ๋‹จ๊ณ„๋กœ ๋ณต์žกํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋ฅผ ์•ˆ๋‚ดํ•˜๋Š” ์ž‘์—… ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค

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

  • ํŠนํžˆ ์ฝ๊ธฐ ์ˆ˜๊ฐ€ ์“ฐ๊ธฐ ์ˆ˜๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ ์„ฑ๋Šฅ๊ณผ ๋ณ„๋„๋กœ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค

    • ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ฝ๊ธฐ ๋ชจ๋ธ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช‡ ๊ฐ€์ง€ ์ธ์Šคํ„ด์Šค์—์„œ๋งŒ ์“ฐ๊ธฐ ๋ชจ๋ธ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์€ ์ˆ˜์˜ ์“ฐ๊ธฐ ๋ชจ๋ธ ์ธ์Šคํ„ด์Šค๋„ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๋ฐœ์ƒ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

  • ํ•œ ํŒ€์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ์“ฐ๊ธฐ ๋ชจ๋ธ์˜ ์ผ๋ถ€์ธ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ์ง‘์ค‘ํ•˜๊ณ  ๋‹ค๋ฅธ ํŒ€์€ ์ฝ๊ธฐ ๋ชจ๋ธ๊ณผ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค.

  • ์‹œ์Šคํ…œ์ด ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ฐœ์ „ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๊ณ  ๋ชจ๋ธ์˜ ์—ฌ๋Ÿฌ ๋ฒ„์ „์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ์ •๊ธฐ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค.

  • ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ, ํŠนํžˆ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ํ•œ ํ•˜์œ„ ์‹œ์Šคํ…œ์˜ ์ผ์‹œ์  ์˜ค๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์˜ ๊ฐ€์šฉ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์ด ํŒจํ„ด์„ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๋„๋ฉ”์ธ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฐ„๋‹จํ•œ CRUD ์Šคํƒ€์ผ์˜ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ์ž‘์—…์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

CQRS๊ฐ€ ๊ฐ€์žฅ ๊ฐ€์น˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์˜ ์ œํ•œ๋œ ์„น์…˜์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๊ณ ๋ ค ์‚ฌํ•ญ

  • ํด๋ผ์ด์–ธํŠธ ์˜ํ–ฅ : CQRS๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์•ก์„ธ์Šค ๋ฐฉ์‹์ด ๋ณ€๊ฒฝ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” API๋„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ฐ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค์‹œ ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

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

  • ๋ช…๋ น ํ์ž‰ : ์“ฐ๊ธฐ ์†”๋ฃจ์…˜์˜ ์ผ๋ถ€๋กœ ๋ช…๋ น ๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ช…๋ น์„ ํ์— ๋„ฃ๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๊ธฐ์—ด์˜ ์ด์  ์™ธ์—๋„ ๋ช…๋ น ๊ฐœ์ฒด๋ฅผ ๋ณ€๊ฒฝ ๋กœ๊ทธ์— ์‰ฝ๊ฒŒ ์ €์žฅํ•˜๊ณ  ์•Œ๋ฆผ ์ด๋ฒคํŠธ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณ€๊ฒฝ ๋กœ๊ทธ : ๋ ˆ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋Š” ๋ช…๋ น ๋ฒ„์Šค์˜ ๋ช…๋ น ๋ชฉ๋ก์ด๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ๋ฒ„์Šค์— ๊ฒŒ์‹œ๋œ ์ด๋ฒคํŠธ ์•Œ๋ฆผ ๋ชฉ๋ก์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์†Œ์‹ฑ ํŒจํ„ด์€ ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ผ๊ณ  ๊ฐ€์ •ํ•˜์ง€๋งŒ ํ•ด๋‹น ํŒจํ„ด์—๋Š” ๋ช…๋ น ๋ฒ„์Šค๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ชฉ๋ก์€ ๊ธฐ๋ก์œผ๋กœ ์Šค์บ”ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…๋ น ๋ชฉ๋ก์€ ์žฌ์ƒํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • ํ‚ค ์ƒ์„ฑ : CQS(Command Query Separation) ํŒจํ„ด์˜ Strick ํ•ด์„์— ๋”ฐ๋ฅด๋ฉด ๋ช…๋ น ์ž‘์—…์—๋Š” ๋ฐ˜ํ™˜ ์œ ํ˜•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค. ์ƒˆ ๋ ˆ์ฝ”๋“œ ๋˜๋Š” ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํŽธ๋ฆฌํ•œ ์ƒˆ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ช…๋ น ๋ฒ„์Šค์˜ ๋ช…๋ น์— ์˜ํ•ด ์ƒ์„ฑ ์ž‘์—…์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ์“ฐ๊ธฐ ๋ชจ๋ธ์€ ํ‚ค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง• ํ ๋ฐ ์ฃผ์ œ : ๋ฉ”์‹œ์ง•์€ ๋ช…๋ น ๋ฒ„์Šค์™€ ์ด๋ฒคํŠธ ๋ฒ„์Šค๋ฅผ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์ง€๋งŒ ๋‘ ๋ฒ„์Šค๋Š” ๋ฉ”์‹œ์ง•์„ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ๋ฒ„์Šค๋Š” ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ ์ „๋‹ฌ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฒ„์Šค๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ ํ”„๋กœ์„ธ์„œ์— ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์†์„ฑ : ๋ ˆ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ•ญ์ƒ ์˜๊ตฌ์ ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์˜๊ตฌ ์บ์‹œ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์บ์‹œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ์บ์‹œ์ž…๋‹ˆ๋‹ค. ์บ์‹œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๊ณ  ์†์‹ค๋œ ๊ฒฝ์šฐ ๋ ˆ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์™„์ „ํžˆ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ณด์•ˆ : ์†”๋ฃจ์…˜์˜ ๋‘ ๋ถ€๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ๋ฐ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ๋ณ„๋„๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Event Sourcing and CQRS pattern

Reference

https://learn.microsoft.com/en-us/azure/architecture/patterns/cqrs

https://ibm-cloud-architecture.github.io/refarch-eda/patterns/cqrs/

Last updated

Was this helpful?