CQRS
CQRS
๊ฐ์ฅ ๊ฐ๋จํ CRUD ์์ฉ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๋ค์ ๋จ๊ณ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ช ํ ์ ์์ต๋๋ค.
์ปจํธ๋กค๋ฌ ๊ณ์ธต์ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ ์ ์๋น์ค์ ์์ํฉ๋๋ค.
์๋น์ค ๊ณ์ธต์ ๋๋ถ๋ถ์ ๋น์ฆ๋์ค ๋ก์ง์ด ์ํ๋๋ ์ฅ์์ ๋๋ค.
์๋น์ค ๋ ์ ์ฅ์ /DAO๋ฅผ ์ฌ์ฉํ์ฌ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝ/์ง์ํฉ๋๋ค.
์ํฐํฐ๋ setter ๋ฐ getter์ ํจ๊ป ๊ฐ์ ์ปจํ ์ด๋ ์ญํ ์ํฉ๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ค์ ๊ท๋ชจ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ๋ณต์กํ๊ฒ ๋ง๋ค ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ก๋ ์ถฉ๋ถํ์ง ์์ผ๋ฉฐ ์ฐ๋ฆฌ์ ์๊ตฌ๊ฐ ๋ ์ ๊ต ํด์ง๊ณ ์์ ๋ ๋ฐ์ดํฐ ํ๋ฆ์ด ๊ฐ๋จํ ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ ์ํฉ๋๋ค.
๋ฐ๋ผ์ ์๋์์ ์ค๋ช ํ๋ ์์์ธ ๊ฒฝ๋ CQRS ๋ชจ๋์ ์ ๊ณตํฉ๋๋ค.
Commands
์์ฉ ํ๋ก๊ทธ๋จ์ ์ดํดํ๊ธฐ ์ฝ๊ฒํ๋ ค๋ฉด ๊ฐ ๋ณ๊ฒฝ ์ฌํญ ์์ Command ๊ฐ ์์ด์ผํฉ๋๋ค. ๋ช ๋ น์ด ์ ๋ฌ๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ตํด์ผ ํฉ๋๋ค. ๋ช ๋ น์ ์๋น์ค (๋๋ ์ปจํธ๋กค๋ฌ/๊ฒ์ดํธ์จ์ด์์ ์ง์ )์์ ๋ฐ์ก๋๊ณ ํด๋นํ๋ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๋ค์์ KillDragonCommand
๋ฅผ ์ ๋ฌํ๋ ์ํ ์๋น์ค์
๋๋ค. ๋ช
๋ น์ด ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ด
์๋ค:
CommandBus
๋ ์คํธ๋ฆผ ๋ช
๋ น์
๋๋ค. ๋๋ฑํ ํธ๋ค๋ฌ์ ๋ช
๋ น์ ์์ํฉ๋๋ค. ๊ฐ ๋ช
๋ น์๋ ํด๋น ๋ช
๋ น ์ฒ๋ฆฌ๊ธฐ๊ฐ ์์ด์ผํฉ๋๋ค.
์ด์ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ํ ๋ณ๊ฒฝ์ Command ๋ฐ์์ ๊ฒฐ๊ณผ์ ๋๋ค. ๋ก์ง์ ํธ๋ค๋ฌ์ ์บก์ํ๋ฉ๋๋ค. ์ํ๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๋ก๊น ์ ์ถ๊ฐํ๊ฑฐ๋ ๊ทธ ์ด์์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ช ๋ น์ ์ ์งํ ์ ์์ต๋๋ค (์: ์ง๋จ ๋ชฉ์ ).
Events
์ฒ๋ฆฌ๊ธฐ์ ๋ช ๋ น์ ์บก์ํํ๊ธฐ ๋๋ฌธ์ ๋ช ๋ น ๊ตฌ์กฐ ๊ฐ์ ์ํธ ์์ฉ์ ๋ง์ ์ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋ ์๋ต ์ด ์๋๋ผ ์ ์ฐํ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฒคํธ๋ ๋น๋๊ธฐ์ ์
๋๋ค. models ๋๋ EventBus
๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ๋ฐ์ก๋ฉ๋๋ค. ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ๋ชจ๋ธ์ด AggregateRoot
ํด๋์ค๋ฅผ ํ์ฅํด์ผ ํฉ๋๋ค.
apply()
๋ฉ์๋๋ ๋ชจ๋ธ๊ณผ EventPublisher
ํด๋์ค ์ฌ์ด์ ๊ด๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ง ์ด๋ฒคํธ๋ฅผ ์ ๋ฌํ์ง ์์ต๋๋ค. ๋ชจ๋ธ๊ณผ ๊ฒ์์๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฌด์์
๋๊น? ์ปค๋งจ๋ ํธ๋ค๋ฌ๋ด์์ ํผ๋ธ๋ฆฌ์
mergeObjectContext()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
์ด์ ๋ชจ๋ ๊ฒ์ด ์์๋๋ก ์๋ํฉ๋๋ค. ์ด๋ฒคํธ๊ฐ ์ฆ์ ์ ๋ฌ๋์ง ์์ผ๋ฏ๋ก commit()
์ด๋ฒคํธ๊ฐ ํ์ํฉ๋๋ค. ๋ถ๋ช
ํ, ๊ฐ์ฒด๋ ์ ์ฌํ ํ์๊ฐ ์์ต๋๋ค. ํ์
์ปจํ
์คํธ๋ ์ฝ๊ฒ ๋ณํฉํ ์ ์์ต๋๋ค :
๊ทธ๊ฒ ์ ๋ถ์
๋๋ค. ๋ชจ๋ธ์ ์ด์ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๋ํ, ์ฐ๋ฆฌ๋ EventBus
๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค :
info ํํธ
์ด๋ฒคํธ ๋ฒ์ค
๋ ์ฃผ์ ๊ฐ๋ฅํ ํด๋์ค์ ๋๋ค.
๊ฐ ์ด๋ฒคํธ์๋ ์ฌ๋ฌ ๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ ์ ์์ต๋๋ค.
์ด์ write logic์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค.
Sagas
์ด ์ ํ์ ์ด๋ฒคํธ ์ค์ฌ ์ํคํ ์ฒ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์๋ต์ฑ ๋ฐ ํ์ฅ์ฑ์ ํฅ์์ํต๋๋ค. ์ด์ ์ด๋ฒคํธ๊ฐ ์์ ๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ฐ์ํ ์ ์์ต๋๋ค. Sagas๋ ์ํคํ ์ฒ ๊ด์ ์์ ๋ง์ง๋ง ๋น๋ฉ ๋ธ๋ก์ ๋๋ค.
Sagas๋ ์์ฒญ๋๊ฒ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. Single saga๋ 1..* ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์์ต๋๋ค. [... ] ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๊ฒฐํฉ, ๋ณํฉ, ํํฐ๋ง ํ ์ ์์ต๋๋ค. RxJS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ง๋ฒ์ ๊ทผ์์ ๋๋ค. ๊ฐ๋จํ ๋งํด์, ๊ฐ saga๋ ๋ช ๋ น์ด ํฌํจ๋ Observable์ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด ๋ช ๋ น์ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฌ๋ฉ๋๋ค.
info ํํธ
ofType
์ฐ์ฐ์๋@nestjs/cqrs
ํจํค์ง์์ ๊ฐ์ ธ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ท์น์ ์ ์ธํ์ต๋๋ค - ์ด๋ค ์์
์ด ์ฉ์ ์ฃฝ์ด๋ฉด ๊ณ ๋ ์์ดํ
์ด ๋จ์ด์ง๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ ํ ์ฒ๋ฆฌ๊ธฐ๊ฐ DropAncientItemCommand
๋ฅผ ์ ๋ฌํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
Queries
CqrsModule
์ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ์๋ ์ ์ฉํ ์ ์์ต๋๋ค. QueryBus
๋ CommandsBus
์ ๋์ผํ๊ฒ ์๋ํฉ๋๋ค. ๋ํ ์ฟผ๋ฆฌ ํธ๋ค๋ฌ๋ IQueryHandler
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ @QueryHandler()
๋ฐ์ฝ๋ ์ดํฐ๋ก ํ์ํด์ผ ํฉ๋๋ค.
Setup
์ฐ๋ฆฌ๊ฐ ๋ง์ง๋ง์ผ๋ก ๋๋ด์ผ ํ ๊ฒ์ ์ ์ฒด ๋ฉ์ปค๋์ฆ์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
Summary
CommandBus
, QueryBus
๋ฐ EventBus
๋ ๊ด์ฐฐ ๊ฐ๋ฅ(Observables)์
๋๋ค. ์ด๋ฒคํธ ์์ฑ์ ํตํด ์ ์ฒด ์คํธ๋ฆผ์ ์ฝ๊ฒ ๊ตฌ๋
ํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณด๊ฐํ ์ ์์ต๋๋ค.
์ค์ ์ฌ๋ก๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
Last updated
Was this helpful?