๋ชฉ์ฐจ
- ๋์
- Query ์ Command ๋?
- CQRS ๋
- CQRS ์ ์ฅ๋จ์
๋์
ํ์ฌ ์์คํ ์ด ์ ํต์ ์ธ CRUD ์ ํ๋ฆฌ์ผ์ด์ ์์ Event ๊ธฐ๋ฐ์ ์์คํ ์ผ๋ก ๋ฐ๋์ด ๊ฐ๋ ๊ณผ์ ์ ํ์ ํฉ๋ฅ๋ฅผ ํ๊ฒ ๋์ด ๋์ ์ต๊ทผ ๊ฐ์ฅ ํฐ ๊ด์ฌ์ฌ๊ฐ ๋ฐ๋ก ์ด CQRS ์ด๋ค.
ํ๋ถ ์์ ์๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ณต๋ถํ๋ฉฐ ์ ๊น ์ ๊น ๋ดค๋ CQRS ๋ ์ด๋ฆ ๋ถํฐ ์์ํ๊ธฐ์ ๊ฒ์ ๋จน์๋ ๊ธฐ์ต์ด ๋๋ค.
ํ์ง๋ง CQRS ์ ์๋ฆฌ ์์ฒด๋ ์ฌ์ค ๋๊ฒ ๊ฐ๋จํ๋ค
Command ์ Query ๋ฅผ ๋ถ๋ฆฌํ์!
Command ์ Query ๋ฅผ ๋จผ์ ์ ์ํ๊ณ ์ด์ผ๊ธฐ๋ฅผ ๊ณ์ ํด๋ณด์
Query ์ Command ๋?
Query ์ Command ์ ๋ํด์ ์ด์ผ๊ธฐ ํ๊ธฐ ์ํด์๋ CQS ์ ๋ํด์ ๋จผ์ ์์๋ณผ ํ์๊ฐ ์๋ค.
CQS ๋ Design By Contract ๋ผ๋ ์ฉ์ด๋ฅผ ๋ง๋ ๋ฒํธ๋๋ ๋ฉ์ด์ด, Betrand Meyer ๊ฐ ์๊ฐํ ๊ฐ๋ ์ด๋ค.
ํจ์๋ ํน์ ๋์์ ์ํํ๋ ์ฝ๋ ๋ธ๋ก์ ์๋ฏธํ๋๋ฐ, ํจ์์ ๋ชฉ์ ์ ๋ฐ๋ผ์ ๋๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก Command ์ Query ์ด๋ค.
Command
Command ๋ ์์คํ ์ ์ด๋ ํ side effect, ์ฆ ๋ณ๊ฒฝ์ ๊ฐํ๋ ํ์๋ฅผ ํ๋ ๊ฒ์ ๋งํ๋ค.
๊ทธ๋์ Command ์ฑ ํจ์ ๋ผ๊ณ ํ๋ค๋ฉด ๋ณ๊ฒฝ์ ๊ฐํ๋ ํจ์๋ฅผ ๋งํ ์ ์๋ค.
Command ์ฑ ํจ์๋ ์์คํ ์ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ ๋์ ๊ฐ์ ๋ฐํํ์ง ์์์ผ ํ๋ค.
// O, ์ํ๋ง ๋ณ๊ฒฝ์ํด
void updateUser(User user) {
user.updateAge(12);
}
// X, ๊ฐ์ ๋ฐํ
User updateUser(User user) {
return user.updateAge(12);
}
Query
์ด์ ๋ฐํด์ Query ๋ ์์คํ ์ ์ํ๋ฅผ ๊ด์ฐฐํ ์ ์๋ ํ์๋ฅผ ํ๋ ๊ฒ์ ๋งํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก Query ์ฑ ํจ์๋ผ๊ณ ํ๋ค๋ฉด ๋จ์ง ์์คํ ์ ์ํ๋ง ํ์ธํ๋ ํจ์๋ผ๊ณ ํ ์ ์๋ค.
Query ์ฑ ํจ์๋ ์์คํ ์ ์ํ๋ฅผ ๋จ์ง ๋ฐํํ๊ธฐ๋ง ํ๊ณ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์์์ผ ํ๋ค.
// O, ๊ฐ๋ง ๋ฐํ
User getUser(Long userId) {
return users.get(userId);
}
// X, ์ํ๋ฅผ ๋ณ๊ฒฝ
void getUser(Long userId) {
User user = users.get(userId);
user.updateLastQueriedAt();
return user;
}
CQS ๋ Command Query Separation ์ด๋ค
๋ฒํธ๋๋ ๋ง์ด์ด๋ ์์ Command ์ Query ๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ฉฐ ํ๋์ ํจ์๋ ์ด ์ฑ๊ฒฉ์ ๋์ด์ผ ํ๋ค๊ณ ํ๋ค.
์ฆ, ์ด๋ ํ ํจ์๊ฐ ์๋ค๋ฉด ๊ทธ ํจ์๋ Command ๋๋ Query ์ค ํ๋์ ์ญํ ๋ง ์ํํด์ผ ํ๋ค.
๋ง์ฝ ํ๋์ ํจ์์์ Command ์ Query ๊ฐ ๋ชจ๋ ๋์์ ์ผ์ด๋๊ฒ ๋๋ค๋ฉด, ์ด๋ ์ํํธ์จ์ด์ 3๊ฐ์ง ์์น ์ค ๋ณต์กํ์ง ์์์ผ ํ๋ค๋ KISS ๊ฐ ์ง์ผ์ง์ง ์์ ๊ฒ์ด๋ค.
์ด๋ฐ ๊ด์ ์์ ์ฐ์ฅ์ ์์ ์๋ ๊ฒ์ด ๋ฐ๋ก Command Query Responsibility Segregation ์ด๋ค.
CQRS ๋?
CQRS ๋ Greg Young ์ด ์๊ฐํ ๋ง์ด๊ณ , CQS์ ๋นํด ์กฐ๊ธ ๋ ํฐ ๋ ๋ฒจ์์์ Command ๋ชจ๋๊ณผ Query ๋ชจ๋์ ์ฑ ์์ ๋ถ๋ฆฌํ์๋ ๋ง์ด๋ค.
CQS ๋ ์ฝ๋ ๋ ๋ฒจ์์์ ๋ถ๋ฆฌ๋ฅผ ๋งํ๋ค๋ฉด CQRS ๋ ์กฐ๊ธ ๋ ๊ฑฐ์์ ์ธ ๊ด์ ์์์ ๋ถ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
์์ ๋ฒํธ๋๋ ๋ฉ์ด์ด๊ฐ ๋งํ๊ฒ ์ฒ๋ผ command ํ์ด๊ฑฐ๋ query ํ์ ํจ์๋ฅผ ๋ถ๋ฆฌ์ํค๋ฉด ์ํํธ์จ์ด๊ฐ ๋์ฑ ๋จ์ํด์ง๊ณ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค๊ณ ํ๋ค.
CQRS ๋ ์ด ์์น์ ์ฐจ์ฉํ๋ค.
์๋์ ๊ทธ๋ฆผ์ CQRS Journey Guide ํ๊ธ ๋ฒ์ญ ์์ ๊ฐ์ ธ์จ ๊ทธ๋ฆผ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก CQRS ํจํด์ ์ ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๊ฒ ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ๋์ service interface ๋ฅผ ๋๊ณ ๋๊ฐ์ ์๋ก ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์กด์ฌํ๋ค.
- read side
- write side
ํ๊ฐ์ง ์๋ฅผ ๋ค๋ฉฐ ์ด์ผ๊ธฐํด๋ณด์.
์๋์ ๊ทธ๋ฆผ์ ๊ฒ์ ๋ณด๋ ๋ผ๋ ๊ฐ์์ ๋๋ฉ์ธ์ ๋ชจ๋ธ๋งํ ๊ทธ๋ฆผ์ด๋ค.
- ์ฌ์ฉ์๋ ์ ๋ต์ ์ ๋ ฅํ๋ค.
- ์ ๋ต์ด๋ผ๋ฉด ์ ์๋ฅผ ์ฌ๋ฆฌ๊ณ ์ค๋ต์ด๋ฉด ์ ์๋ฅผ ๋ด๋ฆฐ๋ค.
- ์ฌ์ฉ์์ ๋ญํน ํ์ธํ ์ ์๋ค.
์์ ๊ตฌ์กฐ๋ ๋์ผํ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ค. ์ฆ, ์กฐํ์ ์ฑ ์๊ณผ ๋ช ๋ น์ ์ฑ ์์ด ํ๋์ ๋๋ฉ์ธ์ ํฌํจ๋์ด์๋ค๋ ์ด์ผ๊ธฐ๋ค.
๊ทธ๋ผ ๋ฌด์จ ๋ฌธ์ ๊ฐ ์๊ธธ๊น?
์ ์ํคํ ์ฒ์์๋ 3๊ฐ์ง์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ์กด์ฌํ ๊ฒ์ด๋ค.
- ๋ณต์ก์ฑ
- ์ฑ๋ฅ
- ํ์ฅ์ฑ
๋ฌธ์ 1. ๋ณต์ก์ฑ, ๋๋ฉ์ธ์ด ๋น๋ํด์ง๋ค.
์ฐ๋ฆฌ์ ์์คํ ์์ ๋๋ฉ์ธ์ด ๊ฐ๋ ์๋ฏธ์ ๋ํด์ ์๊ฐํด๋ณด์.
๋๋ฉ์ธ์ด๋ ๊ณง ๋น์ฆ๋์ค์ด๋ค.
๋น์ฆ๋์ค๋ ๋ณดํต ํน์ ํ ๋ฐ์ดํฐ์ ์ํ๋ฅผ ๋ณ๊ฒฝ (create, update, delete) ์ ํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋น์ฆ๋์ค๋ ์๊ฐ์ด ์ฆ๊ฐํ๋ฉด์ ์ ์ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๊ฒ ๋๊ณ , ๋ง์ ์๊ตฌ์ฌํญ๋ค์ ํฌํจํ ์ ์์ด์ผ ํ๋ค.
ํ์ง๋ง query ๋ ์ด๋ ํ ๊น?
query ๋ ๋จ์ ๋ฐ์ดํฐ ์กฐํ์ด๊ธฐ ๋๋ฌธ์ ๋น์ฆ๋์ค์ ๋ฌด๊ดํ์ง๋ง ๊ฐ๋ query ๋ฅผ ์ํ ์ฒ๋ฆฌ๊ฐ ๋๋ฉ์ธ์ ์นจํฌํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋๋ UI ์ ๋ฐ์ดํฐ ๋๋ถ๋ถ์ ๋น์ ํ ๋ฐ์ดํฐ๋ค์ผ ๊ฒ์ด๋ค. ์ฆ, ์ผํ๋ชฐ์์ user ์ ๋ณด์ ๋ฐ๋ฅธ ๊ด์ฌ ๋ฌผํ, ์ต๊ทผ ๊ตฌ๋งค ๋ด์ญ, AI ์ถ์ฒ ์ํ ๋ชฉ๋ก ๋ฑ ์ด๋ฌํ ๋ฐ์ดํฐ๋ ํ๋ ์ด์์ ๋ฐ์ด๋๋ ์ปจํ ์คํธ์ ๊ด๋ จ์ด ์๊ฒ ๋๋ค.
๊ทธ๋ผ ์ด๋ฐ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ด ์๊ธธ๋๋ง๋ค ๋๋ฉ์ธ์ ์์ ํด์ผ ํ ๊น? ์ฟผ๋ฆฌ๋ฅผ ๋ ์ ํ ์ ์๋๋ก ๋๋ฉ์ธ์ ๊ด๋ จ ํ์๋ฅผ ์ถ๊ฐํด์ผ ํ๋๊ฐ?
์ ๊ทธ๋๋ ๋๋ฉ์ธ ์์ฒด๋ ๋น๋ํด์ ธ ๊ฐ๋๋ฐ, ๋น์ฆ๋์ค ์์ฒด๋ฅผ ํํํด์ผ ํ๋ ๋๋ฉ์ธ์ query ๊ฐ ์นจํฌํ๋ค? ์ฆ ๋ณต์ก์ฑ์ด ์ฌ๋ผ๊ฐ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ฌธ์ 2. ์ฑ๋ฅ
๋๋ถ๋ถ์ write ์ฐ์ฐ์์ ์ฐ๋ฆฌ๋ ์ผ๊ด์ฑ (consistency) ์ ๋ํด์ ๋ง์ ์ ๊ฒฝ์ ์จ์ผํ๋ค.
๋๋ถ๋ถ์ ์ ์๋ ค์ง consistency ๋ฅผ ์งํค๊ธฐ ์ํ ํด๋ฒ ์ผ๋ก DB Locking ๊ธฐ๋ฒ์ ์ฌ์ฉํ ๊ฒ์ด๋ค.
write ์ฐ์ฐ์์ ํ๋ฒ lock ์ ์ก๊ฒ ๋๋ฉด ๊ทธ ๋ค์ read ์ฐ์ฐ์ด ๋ชจ๋ ๋๊ธฐ๋ฅผ ํ๊ฒ ๋๋ฉฐ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ด ๋ฎ์์ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๋ค. (๋ฌผ๋ก lock ์ ๊ธฐ๋ฒ์ ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ ๋ค๋ฅผ ์ ์์ง๋ง)
๋ฌธ์ 3. ํ์ฅ์ฑ
๋ง์ ์์คํ ์์ ์ฝ๊ธฐ์ ์ฐ๊ธฐ์ ๋ํ ๋ถ๊ท ํ์ด ์กด์ฌํ๋ค๋ ์ฌ์ค์ ๊ฝค๋ ์์ฃผ ๋ค๋ฆฌ๋ ์ด์ผ๊ธฐ๋ค.
์ฐ๊ธฐ ์์ ๊ณผ ์ฝ๊ธฐ ์์ ์ ๋น์จ์ด 1(write):1000(read) ๋ผ๊ณ ํ๋ค.
๊ทธ๋ ๋ค๋ ์ด์ผ๊ธฐ๋ read side ์ write side ์ ์๋ฒ๋ ์๋ก ๋ค๋ฅธ ๊ธฐ์ค์ผ๋ก ์ค๊ณ๊ฐ ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅ์ด ๊ฐ๋ฅํด์ผ ํ๊ณ ๊ฐ๊ฐ ๋ชฉ์ ์ ๋ง๋ ๋ค๋ฅธ ์๋ฃจ์ ์ด ํ์ํ๋ค๋ ์ด์ผ๊ธฐ๋ค.
๋ง์ฝ ์ด ๋์ด ๋ถ๋ฆฌ๋์ด ์์ง ์๊ณ ํ๋์ ์ปดํจํ ์์ง๋ง์ ์ฌ์ฉํ๋ค๋ฉด ํน์ ํ๋์ ๋ฐ์ดํฐ์์ค๋ง์ ์ฌ์ฉํ๋ค๋ฉด ๋ ๋ฆฝ์ ์ธ ํ์ฅ์ด ํ๋ค ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ CQRS ๋ฅผ ์ ์ฉํด์ ์ฑ ์์ ๋ฐ๋ฅธ Command ์ Query ์ ์ฐ์ฐ์ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๋ถ๋ฆฌ์ํค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๊ฒ ๋๋ค.
์์ ๋ณด์๋ ์ผ๋ฐ์ ์ธ CQRS ์ ํํ์ ๋น์ทํ๊ฒ ๋์๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ๋ต๊ณผ ๊ด๋ จ๋ ๋น์ฆ๋์ค๋ฅผ ์ฑ ์์ง๋ ์์ชฝ ๋๋ฉ์ธ์๊ฒ๋ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค๋ Command ์ ์ฑ ์๋ง ์กด์ฌํ๊ธฐ์ ๋น์ฆ๋์ค๋ฅผ ๊ทธ๋๋ก ํํํ ์ ์๋ค.
์ญ์ ์๋์ ๋๋ฉ์ธ์๊ฒ๋ ์ํ๋ฅผ ํ์ธํ๋ Query ์ ์ฑ ์ ๋ง ์กด์ฌํ๊ฒ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ด๋ค ์ฅ์ ์ด ์์ ์ ์์๊น?
๋จ์ํ ๊ฐ์ฅ ๋จผ์ ๋๋ ์๊ฐ์ Command ์ Query ์ ๊ฐ๊ธฐ ๋ค๋ฅธ Persistence Module ์ ์ฌ์ฉํ ์ ์์๊ฒ์ด๋ค.
- Command Side ์๋ ๊ฐ์ฒด ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ JPA ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- Query Side ์๋ ์ต์ ํ๋ ์ฟผ๋ฆฌ๋ฅผ ์ํด์ MyBatis ๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
CQRS ๋ ๊ณ ๋ํ ์์ผ๋ณผ ์ ์๋ค
Command ์ Query ์ ์ฑ ์์ด ๋ถ๋ฆฌ๋์๊ธฐ ๋๋ฌธ์ Command ์ Query ๋ ์๋ก ๋ค๋ฅธ ์ธํ๋ผ๊ฐ ๊ตฌ์ฑ๋ ์ ์๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ด Polygrat ํ Persistance Infra ๊ฐ ๊ตฌ์ฑ๋ ์ ์๋ค.
๊ทธ๋ผ ๋ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํ ์ ์๋ค.
- Command infra ์๋ write ์ ์ต์ ํ๋ DB๋ฅผ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
- Query Side ์๋ ๋์ฑ ๋น ๋ฅธ ์ฟผ๋ฆฌ์ ์ํด์ elasticsearch๋ opensearch ์ ๊ฐ์ ๊ฒ์ ์์ง์ ๋์ ํ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ณดํต Query Side ์ Materialized View ๋ฅผ ์ด์ฉํ์ฌ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๋ฐฉ์งํ๊ณ ๊ด์ ์ ๋ฐ๋ฅธ ์ ๋ณด ๋ทฐ๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๊ณค ํ๋ค
๊ทธ๋ฆฌ๊ณ Write Side ์์ ๋ฐ์ํ๋ ๋ณ๊ฒฝ ์ฌํญ๋ค์ ๋ํด์๋ ์ค๊ฐ์ ๋ฉ์์ง ์ธํ๋ผ๋ฅผ ์ด์ฉํด์ ๊ณ์ํด์ ๋๊ธฐํ๋ฅผ ์์ผ์ฃผ๋ ํํ๋ก ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
์กฐ๊ธ ๋ ๊ณ ๋ํ๋ CQRS ํจํด ๊ตฌํ๋ฒ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๋ CQRS Journey guide ํ๊ธ ๋ฒ์ญ ์์ ํ์ธํ ์ ์๋ค.
CQRS ์ ์ฅ์ ๊ณผ ๋จ์
์์์ ์ฐ๋ฆฌ๋ CQRS ์ ๋ํด์ ๋๋ต์ ์ผ๋ก ์์๋ณด์๊ณ , level ๋ณ๋ก CQRS ๋ฅผ ๊ตฌ๋ถํด๋ณด์๋ค.
CQRS ๋ผ๋ ๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ ๋ณต์ก์ฑ์ด ์ฒ์ฐจ๋ง๋ณ์ด๋ค. ๊ผญ read side ์ write side ๋ฅผ ๋ฉ์์ง ์ธํ๋ผ๋ก ์ฐ๊ฒฐํ์ง ์๋๋ผ๋ ๊ตฌํํ ์ ์๋ฏ ์ฌ์ฉํ๋ ๋ชฉ์ ๊ณผ ์ฉ๋ก๊ฐ ๋ค๋ฅด๋ค.
์ด์ CQRS ์ ๋ํ ์ฅ๋จ์ ์ ํ๋ฒ ์๊ฐํด๋ณด์
์ฅ์
- ๋๋ฉ์ธ ๋ก์ง์๋ง ์ง์คํ ์ ์๊ฒ ๋๋ค
- Command ์ Query ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ OCP ๋ฅผ ์ค์ํ๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋ค.
- ์ด๋ฅผ ํตํด ๊ฒฐ๊ตญ ๋๋ฉ์ธ ๋ก์ง์ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์ค์ํฌ ์ ์๋ค
- ๋ฐ์ดํฐ์์ค์ ๋
๋ฆฝ์ ์ธ ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ๋ค
- ๋ณดํต read ์ write ์ ๋น์จ์ 1000 : 1 ์ด๋ค.
- ๊ทธ๋ฌ๋ฏ๋ก write db ๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋์ด์ ธ ์๋ค๋ฉด ํด๋น db ์ธ์คํด์ค๋ ์๊ฒ ์ ์งํ๊ณ read db ์ธ์คํด์ค์ ๋ ๋์ ํฌ์๋ฅผ ํ ์ ์๋ค.
- ๋จ์ํ ์ฟผ๋ฆฌ
- Query side ์์๋ Materialized View ๋ฅผ ์ด์ฉํ ์ ์๋๋ฐ, ์ด๋ฅผ ํตํด์ ๋ณต์กํ ์กฐ์ธ ์ฟผ๋ฆฌ ์์ด ๋จ์ํ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ ์ํ๋ ์ ๋ณด๋ฅผ ์ป์ด์ฌ ์ ์๋ค
๋จ์
- ๋ณต์ก์ฑ์ด ์ฌ๋ผ๊ฐ๋ค
- command side ์ query side ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ณต์ก์ฑ์ด ์ฌ๋ผ๊ฐ๋ค.
- ์ฆ์์ ์ธ ์ผ๊ด์ฑ์ด ๋ณด์ฅ๋์ง ์๋๋ค
- command ์ ๋ฐ๋ฅธ data ์ ๋ฌด๊ฒฐ์ฑ์ด ์ ์๋์ ๊นจ์ง ์ ์๋ค.
- ์ด ๋ง์ ๋ฐ์ดํฐ์ consistency ๊ฐ ํญ์ ๋์ผํ์ง ์๋ค
- ํ์ง๋ง ์ต์ข ์ ์ผ๋ก๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ถฐ์ง ๊ฒ์ด๋ Eventual Consistency๋ผ๊ณ ํ ์ ์๋ค.
CQRS ํจํด์ ์ฅ๋จ์ ์ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๋ CQRS Journey guide ํ๊ธ ๋ฒ์ญ ์์ ํ์ธํ ์ ์๋ค.
์ด๋ฐ ์ฅ๋จ์ ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ๋๋ ๋น์ฆ๋์ค ๊ท์น์ด ๋จ์ํ ๊ณณ์์๋ CQRS ๋ฅผ ํ๊ธฐ ํ๋ค๋ค.
ํ์ง๋ง ๋ง์ ์ฌ์ฉ์๊ฐ ๋์์ ๋์ผํ ๋ฐ์ดํฐ์ ๋ณ๋ ฌ๋ก ์ ๊ทผํ๋ ๊ฒฝ์ฐ๋ read ์ฐ์ฐ์ด write ์ฐ์ฐ๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ๋ CQRS ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
๋ง์น๋ฉฐ
์์์ ๋ณด์๋ฏ CQRS ์์ฒด๋ ๋๊ฒ ๊ฐ๋จํ์ง๋ง ๋ง์ดํฌ๋ก์ํํธ ๋ฌธ์๋ฅผ ํฌํจํ์ฌ ์ฌ๋ฌ ๊ณณ์์ CQRS ๋ฅผ ์ค๋ช ํ ๋, ์คํด์ ์ฌ์ง๊ฐ ์๊ฒ ์ค๋ช ์ ํ๊ณ ์์๋ค.
CQRS ๋ ์ฌ์ค ๋ฐ์ดํฐ์์ค์ ํฌ๊ฒ ์ฐ๊ด์ด ์์ง ์๋ค.
๋ง ๊ทธ๋๋ก CQRS ๋ Command ์ Query ๋ฅผ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ฌ๋ฌ ๊ณณ์์ CQRS ์ Datasource ๋ฅผ ์ฎ์ด์ ํน์ Event sourcing ๊ณผ ์ฎ์ด์ ์ค๋ช ์ ํ๊ณ ์์๊ธฐ์ ์ด๋ฐ์ ๋ง์ ์คํด๋ฅผ ํ์๋ค..
๊ทธ๋์ ์ด ๊ธ๋ก ์ต๋ํ CQRS ๋ฅผ Datasource ์ ์ฎ์ฌ์๋ค๋ ์คํด๋ฅผ ํ๊ณ ์ถ์๊ณ , ๋์ ๊ฐ์ด ์คํด๋ฅผ ํ๋ ์ฌ๋๋ค์๊ฒ ์ด ๊ธ์ ๋ฐ์น๊ณ ์ถ๋ค
๋๊ธ