๐ ์ฌ์ฉ ๊ณ๊ธฐ
์ฐ๋ฆฌ ํ๋ก์ ํธ์์ DB์ ์ ๊ทผํ์ฌ ์กฐํ ๋ฐ ๋ช ๋ น(์์ ,์ญ์ ) ๋ฅผ ํ๋ ๋ถ๋ถ๋ค์ด ์๋น์ค ๋ก์ง์ ๋ง์ด ์์ฌ ์์กดํ๋ ๊ด๊ณ๋ฅผ ํ์ฑํ๊ณ ์์๋ค. ์ด๋ฅผ ์ ๋ฆฌํ๊ณ ์ถ์ด CQRS ํจํด์ ๊ณต๋ถํ๊ณ ์ ์ฉํด๋ณด๊ณ ์ ์ ๋ฆฌํ๊ฒ ๋์๋ค.
๐CQRS ํจํด์ด๋?
Command and Query Responsibility Segregation ์ ์ฝ์๋ก ๋ช ๋ น ์์ญ๊ณผ ์กฐํ ์์ญ์ผ๋ก ๋๋๋ ์ํคํ ์ฒ ํจํด์ ๋งํ๋ค.
์๋ก์ ์ฑ ์์ ๋๋์ด ๋ถ๋ฆฌํ๋ ๊ฒ์ด CQRS์ธ๋ฐ ๊ทธ๋ผ ์ฌ๊ธฐ์ ๋งํ๋ ๋ช ๋ น๊ณผ ์กฐํ๋ ๋ฌด์์ผ๊น?
๐๋ช ๋ น๊ณผ ์กฐํ
์ฐ๋ฆฌ๋ DB๋ฅผ ๋ค๋ฃฐ๋ CRUD ( Create / Read / Update / Delete ) ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค. ๊ทผ๋ฐ CQRS๋ ์ฌ๊ธฐ์ ๊ตณ์ด Read๋ง ๋นผ์ ์กฐํ๋ผ๊ณ ํ๊ณ ๋๋จธ์ง๋ฅผ ๋ช ๋ น์ผ๋ก ๋๋์ด ๊ด๋ฆฌํ๊ฒ ๋๋ค. ์?
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ณ ๋์ ์๊ฐ์ด ์ง๋๊ฒ ๋๋ฉด ๋ค์ํ ์๊ตฌ ๋ฑ์ผ๋ก ์ฒ์ ๋ชจ์ต๊ณผ ๋ฌ๋ผ์ง๊ฒ ๋๋ค. ์ด๊ฒ์ ๋ฌผ๋ก DB๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ๋ด๊ฐ ์งํํ ํ๋ก์ ํธ์์ ์ฒ์ ํ์ ํ ์ด๋ธ์ ์ ๋ง ๋จ์ํ๊ฒ ์ด๋ฉ์ผ, ํจ์ค์๋, ๋๋ค์ ๊ฐ์ ๊ธฐ๋ณธ ์ ๋ณด๋ง์ ๊ฐ์ง๊ณ ์์๋๋ฐ ํ๋ก์ ํธ๊ฐ ์ ์ ๊ธฐ๋ฅ์ด ๋ถ๊ณ ์ปค์ง๊ฒ ๋จ์ผ๋ก์จ ๊ฒ์์์ ์ด๊ธด ํ์, ํ๋ ์ด ํ์ ๋ฑ์ ์์ฑ์ด ์ถ๊ฐ๋์ด DB๋ ๊ธฐ๋ณธ ๋ชจ๋ธ๊ณผ๋ ๋ชจ์ต์ด ๋ง์ด ๋ฌ๋ผ์ง๊ฒ ๋์๋ค.
์ด ๋ฌ๋ผ์ง ๋ชจ๋ธ์์ ๊ธฐ์กด ํํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ค๋ฉด ์ฌ๊ฐ๊ณต์ด ํ์ํด์ง๊ฒ ๋์๋ค. ์ด๊ธฐ์๋ ๋ณ๋ ๊ฐ๊ณต ์์ด ๋ชจ๋ ์กฐํํด ๋ด๋ณด๋ผ ์ ์๋ ๋ฐ์ดํฐ์๋ค๋ฉด, ์ด์ ๋ ๊ฐ๋ฆด๊ฑด ๊ฐ๋ฆฌ๊ณ ๋ณด์ผ๊ฑด ๋ณด์ฌ์ผ ํ๋ ๊ฒ์ด๋ค. ํ์์ ์ธ์ ์ฌํญ์ ๋ํด์๋ง ๋ณด์ฌ์ผ ํ ํ์ด์ง์ ๊ฒ์ ํ๋ ์ด ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด์ง ์๊ฒ ์กฐ์ ํ๊ณ , ๋ฐ๋๋ก ๊ฒ์ ํ๋ ์ด ๊ด๋ จ ํ์ด์ง์์ ๊ฐ์๊ธฐ ํจ์ค์๋ ์ ๋ณด๊ฐ ๋์ค๋ฉด ์๋๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
๋ฐ๋ผ์ ๋ชจ๋ธ์ด ๋ณํจ์ ๋ฐ๋ผ ์ ์ฅ, ์์ , ์ญ์ ์ ์ฌ์ฉํ๋ ๋ชจ๋ธ๊ณผ ์กฐํํ ๋ ์ฌ์ฉํ๋ ๋ชจ๋ธ ๊ฐ์ ์ฐจ๊ฐ ์๊ธฐ๊ฒ ๋์๊ณ ๊ทธ๋์ ์ด๋ฅผ ๋๋์ด ๊ด๋ฆฌํ๊ฒ ๋๋ฉด์ ๋ฑ์ฅํ๊ฒ CQRS๋ค.
๐ํ๋ฉด ๋ญ๊ฐ ์ข์๋ฐ ?
์ด๋ ๊ฒ ๋๋๋ฉด ๋ญ๊ฐ ์ข์๊น?
- ์ฒซ์งธ, ๋๋ฉ์ธ ๋ก์ง์๋ง ์ง์คํ ์ ์๊ฒ ๋๋ค
๋๋ฉ์ธ ๋ก์ง์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝ์ํค๊ณ ์กฐํํ๋ ๋ก์ง์ ๋ถ๋ฆฌํด๋ด ๊ฒฐ๊ตญ ์๋น์ค์ ๊ด๋ จํ ํต์ฌ ๋ก์ง๋ค๋ง ๊น๋ํ๊ฒ ๋จ๊ฒจ ๋ก์ง์ ์ง์ค์ํฌ ์ ์๋ค.
- ๋์งธ, Command ์ชฝ๊ณผ Query ์ชฝ์ ๊ฐ์์ ๋ง๋ ๋ค๋ฅธ ์ธํ๋ผ๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
๋ง์ฝ Command DB์ Query DB๋ฅผ ๋๋๋ ๋ฐฉ์์ ์ฑํํ์ฌ ์ฌ์ฉํ๋ฉด ๊ฐ๊ฐ์ ๋ง๋ ์ธํ๋ผ๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ ์ ์์ด, ์ฑ๋ฅ์ ์ผ๋ก ํฅ์์ ๊ธฐ๋ํด ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ Read์ Write์ ๋น์จ์ด 1000 : 1 ์ด๋ผ๊ณ ํ๋ ๋ง์ ์์ฒญ ์ ๋์ ๋ฐ๋ผ์๋ ํ๊ฒฝ์ ๋ํด ์๊ฐํด๋ณผ ์ ์๊ฒ ๋๋ค.
๐๊ทธ๋์ ์ ์ฉ์?
CQRS๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
1) Simple CQRS Architecture
๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ ๋ถ๋ฆฌํ์ง ์๊ณ ๋ชจ๋ธ ๊ณ์ธต๋ง ๋ถ๋ฆฌํ๋ค. ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ ๋ถ๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋ณํ๋ ์๋ค.
2) CQRS with separated persistence mechanisms
๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ Command(๋ช ๋ น)์ฉ, Query(์กฐํ)์ฉ DB๋ก ๋ถ๋ฆฌํ์ฌ ๊ทธ ์ฌ์ด์ ๋ณ๋ ๋ธ๋ก์ปค๋ฅผ ๋์ด ๋ DB๊ฐ์ ๋๊ธฐํ์ํค๋ ๋ฐฉ์. ์ฌ์ง์ด ์กฐํ์ฉ DB๋ฅผ ๋ณ๋์ ๋ค๋ฅธ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ๊ณ ์ ํ๋ ๋ชจ๋ธ์ ๋ง๊ฒ ์กฐ์ ํ์ฌ ์ฌ์ฉํ ์ ์์ด ์ฑ๋ฅ์ด ํฅ์๋ ์ ์๋ค. ํ์ง๋ง ์ค๊ฐ์์ ๋๊ธฐํ์ ๊ด์ฌํ๋ ๋ธ๋ก์ปค์ ์ฑ๋ฅ๊ณผ ์ ๋ขฐ์ฑ์ด ๋งค์ฐ ๋์์ผ ํ๋ค๋ ์กฐ๊ฑด์ด ๋ถ๊ฒ๋๋ค.
3) CQRS ์ Event Sourcing
์ด๋ฒคํธ ์์ฑ๋ CQRS์ฒ๋ผ ํจํด์ ์ข ๋ฅ์ธ๋ฐ ์ด๋ ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ด ์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ ๋ฐฉ์์ ๋งํ๋ค. ๋ฐ์ดํฐ์ ํ์ฌ ์ํ๋ง ๊ธฐ๋กํ๋ ๋ฐฉ์๊ณผ๋ ๋ฌ๋ฆฌ ๋ฐ์ดํฐ์ ๊ด๋ จํ์ฌ ์ด๋ฃจ์ด์ง ์ด๋ฒคํธ์ ๋ํ ํ์คํ ๋ฆฌ๋ ๋ณ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ์์ธ๋ฐ ์ด๋ฅผ CQRS์ ํฉ์ณ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๐ํด๋ณผ ๋ฐฉ๋ฒ์?
์์ง์ CQRS์ ๋ํ ์ดํด๊ฐ ์ ๊ณ , ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ํ๋๋ง ๋๊ณ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ์์ ๋ง ํด๋ณผ ๊ฑฐ๊ธฐ ๋๋ฌธ์ 1๋ฒ Simple CQRS Architecture๋ฅผ ์งํํด๋ณด๋ ค๊ณ ํ๋ค.
โ ๊ณต๋ถ์๋ฃ
CQRS ํจํด ์์๋ณด๊ธฐ
๋ค์ด๊ฐ๋ฉฐ Event Driven Architecture์ ๋ํ ๊ฒฝํ์ด ์์ผ์๊ฑฐ๋, ํน์ ๊ทธ๊ฒ์ ๊ด์ฌ์ด ์์ผ์ ๋ถ์ด๋ผ๋ฉด ์ข ์ข CQRS๋ผ๋ ๋จ์ด๋ฅผ ๋ฃ๊ฒ ๋ฉ๋๋ค. ์ ๋ํ ์ข ์ข ๋ค์์ต๋๋ค. ํ์ง๋ง ์ ํํ๊ฒ CQRS๊ฐ ์ด๋ค ๊ฒ์ธ์ง
always-kimkim.tistory.com
[CQRS] CQRS๋ ์ด๋ป๊ฒ ์ ์ฉํ ๊น?
์ด๋ป๊ฒ ์ ์ฉํ ๊น? ์ ํต์ ์ธ CRUD ์์คํ ์ ์๋์ ๊ฐ์ด ๊ณ์ธต ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ์์คํ ๊ตฌ์กฐ์ CQRS๋ฅผ ์ ์ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 3๊ฐ์ง๊ฐ ์์ต๋๋ค. (1) Simple CQRS Architecture ๋ฐ์ดํฐ
kellis.tistory.com
'Computer Science > Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด(Factory Method Pattern) (1) | 2022.12.24 |
|---|
