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()๋ฑ๊ณผ ๊ฐ์ ๋น์ฆ๋์ค ๊ธฐ๋ฅ์ ๋ํ๋ด๋ ์์ ์์ค ์์
์ ๋
ธ์ถํด์ผ ํฉ๋๋ค . ์ด๋ฌํ ์์
์ ํ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์
๋ฐ์ดํธํ๋ฉฐ ๋๋ก๋ ๋จ์ผ ์์
์์ ๋ โโ์์
์ ๋ชจ๋ ์ํํฉ๋๋ค. ๋น์ฆ๋์ค๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ง๋ ํ ์ ํํฉ๋๋ค.
1๋จ๊ณ: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ API ๋ถ๋ฆฌ
CQRS ํจํด์ ์ ์ฉํ๋ ์ฒซ ๋ฒ์งธ์ด์ ๊ฐ์ฅ ๋์ ๋๋ ๋จ๊ณ๋ CRUD API๋ฅผ ๋ณ๋์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ API๋ก ๋ถํ ํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ค์ด์ด๊ทธ๋จ์ ์ด์ ๊ณผ ๋์ผํ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ณด์ฌ ์ฃผ์ง๋ง ๋จ์ผ CRUD API๋ ๊ฒ์ ๋ฐ ์์ API๋ก ๋ถํ ๋ฉ๋๋ค.

๋ API๋ ๊ธฐ์กด ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ณต์ ํ์ง๋ง ๋์์ ๋ถํ ํฉ๋๋ค.
์ฝ๊ธฐ : ๊ฒ์ API๋ ํด๋น ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋๋ฉ์ธ ๋ชจ๋ธ์์ ๊ฐ์ฒด์ ๊ธฐ์กด ์ํ๋ฅผ ์ฝ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. API๋ ๋๋ฉ์ธ ์ํ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
์ฐ๊ธฐ : ์์ API๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. CUD ์์ ์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝํฉ๋๋ค. ์ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ง๋ค๊ธฐ, ๊ธฐ์กด ๊ฐ์ฒด์ ์ํ ์ ๋ฐ์ดํธ, ๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด ์ญ์ . ์ด API์ ์์ ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ์ง ์๊ณ ์ฑ๊ณต(ack ๋๋ void) ๋๋ ์คํจ(nak ๋๋ ์์ธ ๋ฐ์)๋ฅผ ๋ฐํํฉ๋๋ค. ์์ฑ ์์ ์ ๋๋ฉ์ธ ๋ชจ๋ธ ๋๋ ๋ฐ์ดํฐ ์์ค์์ ์์ฑ๋ ์ ์๋ ์ํฐํฐ ํค์ ๊ธฐ๋ณธ ํค๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
์ด๋ฌํ API ๋ถ๋ฆฌ๋ CQS( Command Query Separation ) ํจํด์ ์ ์ฉํ์ฌ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฉ์๋์ ๊ทธ๋ ์ง ์์ ๋ฉ์๋๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํฉ๋๋ค. ์ด๋ฅผ ์ํด ๊ฐ์ฒด์ ๊ฐ ๋ฉ์๋๋ ๋ค์ ๋ ๋ฒ์ฃผ ์ค ํ๋์ ์ํ ์ ์์ต๋๋ค(๋ ๋ค๋ ์๋).
์ฟผ๋ฆฌ : ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ถ์์ฉ์ ์ผ์ผํค์ง ์์ต๋๋ค.
๋ช ๋ น (์ผ๋ช ์์ ์ ๋๋ ๋ฎคํ ์ดํฐ): ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ๊ฐ์ ๋ฐํํ์ง ์๊ณ ์ฑ๊ณต ๋๋ ์คํจ์ ํ์๋ง ๋ฐํํฉ๋๋ค.
2๋จ๊ณ: ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ ๋ชจ๋ธ ๋ถ๋ฆฌ
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 ํด์์ ๋ฐ๋ฅด๋ฉด ๋ช ๋ น ์์ ์๋ ๋ฐํ ์ ํ์ด ์์ต๋๋ค. ๊ฐ๋ฅํ ์์ธ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ช ๋ น์ ๋๋ค. ์ ๋ ์ฝ๋ ๋๋ ๋ฌธ์๋ฅผ ์์ฑํ๋ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ํธ๋ฆฌํ ์ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ธฐ ์ํ ํค๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๋ น ๋ฒ์ค์ ๋ช ๋ น์ ์ํด ์์ฑ ์์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ํธ์ถ๋๋ ๊ฒฝ์ฐ ์ฐ๊ธฐ ๋ชจ๋ธ์ ํค๋ฅผ ๋ฐํํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์์ ์ฝ๋ฐฑ์ ์ํํด์ผ ํฉ๋๋ค.
๋ฉ์์ง ํ ๋ฐ ์ฃผ์ : ๋ฉ์์ง์ ๋ช ๋ น ๋ฒ์ค์ ์ด๋ฒคํธ ๋ฒ์ค๋ฅผ ๋ชจ๋ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง ๋ ๋ฒ์ค๋ ๋ฉ์์ง์ ๋ค๋ฅด๊ฒ ์ฌ์ฉํฉ๋๋ค. ๋ช ๋ น ๋ฒ์ค๋ ์ ํํ ํ ๋ฒ ์ ๋ฌ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ฒคํธ ๋ฒ์ค๋ ๊ด์ฌ ์๋ ๋ชจ๋ ์ด๋ฒคํธ ํ๋ก์ธ์์ ๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ธ๋ก๋์บ์คํธํฉ๋๋ค.
์ฟผ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ง์์ฑ : ๋ ์ฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํญ์ ์๊ตฌ์ ์ ๋๋ค. ์ฟผ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๊ตฌ ์บ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ด ์บ์๊ฐ ๋ ์ ์๋ ์บ์์ ๋๋ค. ์บ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์๊ณ ์์ค๋ ๊ฒฝ์ฐ ๋ ์ฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์์ ํ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค.
๋ณด์ : ์๋ฃจ์ ์ ๋ ๋ถ๋ถ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฝ๊ธฐ ๋ฐ ์ ๋ฐ์ดํธ์ ๋ํ ์ ์ด๋ฅผ ๋ณ๋๋ก ์ ์ฉํ ์ ์์ต๋๋ค.
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?


