CQRS
CQRS๋ Command Query Responsibility Segregation ์ ์ฝ์์ด๋ฉฐ,
Command(๋ช ๋ น)๊ณผ Query(์ฟผ๋ฆฌ)์ ์ฑ ์ ๋ถ๋ฆฌ๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
Query๋ SQL Query๋ฅผ ์๋ฏธํ๋ ๊ฒ ์๋๋ค. ๊ทธ๋ผ, Command์ Query๋ ๊ฐ๊ฐ ๋ฌด์์ ์๋ฏธํ ๊น?
- Command (๋ช
๋ น)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ ( ์์ฝ, ์์ฝ์ทจ์)
- Query (์ฟผ๋ฆฌ)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ (์์ฝ๋ด์ญ ์กฐํ)
๋ฐ๋ผ์, CQRS๋ฅผ ๋ค์ ์ค๋ช ํ์๋ฉด
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ช ๋ น ์ญํ ์ ์ํํ๋ ๊ตฌ์ฑ ์์
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ ์ญํ ์ ์ํํ๋ ๊ตฌ์ฑ ์์
์ด ๋ ๊ฐ์ง๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ค๋ฃจ๋ ์ฝ๋ ์์ญ์ ์ฐจ์ด
Command์ Query๋ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ์์ญ์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค.
์๋ ๊ทธ๋ฆผ์ Command์ Query๊ฐ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ์ ์์ญ์ ์์๋ก ๋ํ๋ธ ๊ฒ์ด๋ค.
์์ฝ ์ทจ์๋ผ๋ Command์ ๊ฒฝ์ฐ Reservation, ReservationItem, Item ์ ๋์ ํ ์์ญ์ ๋ฐ์ดํฐ๋ง ๋ค๋ฃจ์ง๋ง,
์์ฝ๋ด์ญ ์กฐํ๋ผ๋ Query์ ๊ฒฝ์ฐ Reservation, ReservationItem, Item, Member ๋ฑ ์ฌ๋ฌ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ฒ ๋๋ค.
๋ณ๊ฒฝํ๋ ์์ ์ ์ฐจ์ด
๐ค Command์ Query๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ์์ ๋ ๋ค๋ฅด๋ค.
๋ง์ฝ, 1๏ธโฃ๋ฐฑ์คํผ์ค ๊ฐ๋ฐํ์์ ์์ฝ ๋ด์ญ ์กฐํ ๊ธฐ๋ฅ์ ์์ ํด์ผ ํ๊ณ , 2๏ธโฃ์์ฝ ํ์์ ์์ฝ ๊ธฐ๋ฅ์ ์์ ํด์ผ ํ๋ค๊ณ ํ์ ๋,
Command์ Query ๋ชจ๋ธ์ด ๋ถ๋ฆฌ๋์ด ์์ง ์๋ค๋ฉด ์๋ก ๋ค๋ฅธ ์ด์ ๋ก ์ฝ๋๊ฐ ๋ฐ๋๊ฒ ๋๊ณ ์ฑ ์์ ํฌ๊ธฐ๊ฐ ์ ์ ํ์ง ์๋ค๋ ๊ฒฐ๋ก ์ด ๋์ค๊ฒ ๋๋ค.
์๊ตฌํ๋ ์ฑ๋ฅ์ ์ฐจ์ด
์๋น์ค์์ ์ ๊ณตํ๋ Feature๋ง๋ค ์๊ตฌํ๋ TPS๋ ์ฑ๋ฅ์ด ๋ค๋ฅด๋ค.
๋ง์ฝ, ์ฌ์ฉ์๊ฐ ์์ฝ ์ํ์ ์กฐํํ๋ ๋ฉ์ธํ์ด์ง์ ์กฐํ ์๋๊ฐ ๋๋ฆฌ๋ค๋ฉด ์ ์ฒด์ ์ธ ์๋น์ค์ ๊ฐ์น๊ฐ ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ TPS๊ฐ ๋์์ผํ๋ค.
๋ฐ๋ฉด์, ๋ฐฑ์คํผ์คํ์์ ์ผ์ผ ์์ฝ ๋ด์ญ ์์น ์กฐํ๋ TPS๊ฐ ์กฐ๊ธ ๋จ์ด์ง๋๋ผ๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ ๊ฒ์ด๋ค.
CQRS์ ๋ฒ์
CQRS๋ ๊ตฌํ ๋ฐฉ์์ด๋ ๊ท๋ชจ์ ๋ฐ๋ผ์, ๋ช ๋ น ์ฝ๋์ ์กฐํ ์ฝ๋๋ฅผ ๋ฐ๋ก ๊ตฌํํ๋ ๊ฒ๋ CQRS๋ผ๊ณ ๋งํ ์ ์๋ค.
๋ํ, DB ์์ฒด๋ฅผ ๋๋๋ ๊ฒ๋ CQRS๋ผ๊ณ ํ ์ ์๋ค.
์ฌ๋ฌ ์ผ์ด์ค๋ก CQRS๋ฅผ ๋๋์ด๋ณด์.
Command์ Query๊ฐ ๋์ผํ ํ๋ก์ธ์ค์ธ์ง? ๊ทธ๋ฆฌ๊ณ ๋์ผํ DB๋ฅผ ์ฌ์ฉํ๋์ง? ์ ๋ฐ๋ผ์ ์ฌ๋ฌ ์ผ์ด์ค๋ก ๋๋๊ฒ ๋๋ค.
- 1๏ธโฃ ๋์ผํ ํ๋ก์ธ์ค์ด๊ณ , ๋์ผํ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ๊ฐ์ฅ ๋จ์ํ๊ฒ ์ฝ๋ ์์ค์์ ๋ถ๋ฆฌ๊ฐ ๋๋ค.
- Command์ Query ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ค.
- 2๏ธโฃ ๋์ผํ ํ๋ก์ธ์ค, ๋์ผํ DB, ์๋ก ๋ค๋ฅธ ํ
์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ฝ๋์ ๋ฐ์ดํฐ ์์ค์ผ๋ก ๋ถ๋ฆฌ๋๋ค.
- Query๋ฅผ ์ํ ์ ์ฉ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
- Command ์์ ์ด Query ์ ์ฉ ํ ์ด๋ธ์ ํจ๊ป ๋ณ๊ฒฝํ๊ฒ ๋๋ค.
- ex) ์์ฝ ์ Top 10 ์๋ฐ ์ ์ ๋ฆฌ์คํธ
- 3๏ธโฃ ๋์ผํ ํ๋ก์ธ์ค, ๋ค๋ฅธ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- DB ์์ฒด๊ฐ ๋ถ๋ฆฌ๋๋ค.
- Command ์์ ์ดํ Query์ฉ DB์ ๋ณ๊ฒฝ์ ์ ํํ๋ค.
- ex) Query์ฉ Redis DB๋ฅผ ์ฌ์ฉํ๊ณ , Command ์์ ์ดํ Cache ๋ฐ์ดํฐ ์์
- 4๏ธโฃ ๋ค๋ฅธ ํ๋ก์ธ์ค, ๋ค๋ฅธ DB๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- Command์ Query๊ฐ ์์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ธ ์ํ๋ก, 3๋ฒ ๋ฐฉ์๊ณผ ๋์ผํ๊ฒ ๋ณ๊ฒฝ ์ ํ๋ฅผ ํด์ผ ํ๋ค.
DB ๋ณ๊ฒฝ ์ ํ ๋ฐฉ๋ฒ
Command ์์ ์ดํ ๋ถ๋ฆฌ๋์ด ์๋ Query์ฉ DB์ ๋ณ๊ฒฝ์ ์ ํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค.๐ค
- 1๏ธโฃ Command๊ฐ ์ง์ Query์ฉ DB ์์
- ๊ฐ์ฅ ๋จ์.
- 2๏ธโฃ Command ์์
์ดํ MQ๋ฅผ ์ด์ฉํ์ฌ Query์ฉ DB ์์
- ๋ฐ์ดํฐ ์ ์ค ๊ฐ๋ฅ์ฑ์ด ์์.
- 3๏ธโฃ Command ์์
์ดํ ๋ณ๊ฒฝ ๋ด์ญ์ ๋ณ๋ ํ
์ด๋ธ์ ๊ธฐ๋กํ๊ณ ๋ณ๋์ ์ ํ๊ธฐ๋ฅผ ํตํด Query์ฉ DB ์์
- ๋ณ๊ฒฝ ๋ด์ญ์ด ์ ์ค๋์ง ์์ง๋ง, ์ ํ๊ธฐ๋ฅผ ๊ตฌํํด์ผ ํ๋ค๋ ๋จ์ ์ด ์๋ค.
- MQ๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
- 4๏ธโฃ Command ์์
์ดํ, DB๊ฐ ์ ๊ณตํ๋ CDC๋ฅผ ์ด์ฉํ์ฌ Query์ฉ DB ์์
- DB์ Binary Log๋ฅผ ์ฝ์ด์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ณ , Query์ฉ DB ์์
- Command DB์์ ๋ณ๊ฒฝ ๋ด์ญ์ ๋ฐ๋ก ์ ์ฅํ์ง ์์๋ ๋์ด ๋ช ๋ น ์ฝ๋๊ฐ ๋จ์ํด์ง๋ค.
- MQ๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
+) ์ถ๊ฐ๋ก
์ด๋ ๊ฒ, ์๋ก ๋ค๋ฅธ DB์ ๋ณ๊ฒฝ ์ ํ๋ฅผ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฃผ์ํด์ผ ํ ์ ์ด ์๋ค.
๋ฐ์ดํฐ ์ ์ค์ ๋ํด์ ์ผ๋ง๋ ํ์ฉํ ๊ฒ์ธ์ง์ ๋ฐ๋ผ DB ํธ๋์ญ์
๋ฒ์๊ฐ ๋ฌ๋ผ์ง ๊ฒ์ด๋ฉฐ,
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ํ์ ํ์ฉ ๊ฐ๋ฅํ Delay ์๊ฐ์ ๋ฐ๋ผ ๊ตฌํ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง ๊ฒ์ด๋ค.
๋ํ, ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ค๋ณต์ผ๋ก ์ ๋ฌํ๋ ์ํฉ์ด ๋ฐ์ํ๋๋ผ๋ Query์ฉ DB ๋ฐ์ดํฐ๊ฐ ์ด์ํด ์ง์ง ์๋๋ก ๋ฐฉ์ด ์ฝ๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
์ด ๊ธ์์๋ CQRS์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ , DB๋ฅผ ๋ถ๋ฆฌํ๋ค๋ ๊ฒ์ ์๋นํ ๋ง์ Side Effect๊ฐ ๋ฐ์ํ ์ ์์์ ์์์ผ ํ๋ค๋ ์ ์ ์ธ๊ธํ๋ฉฐ ๋ง๋ฌด๋ฆฌํ๋ค.