์๋
ํ์ธ์,
CQRS์์ด ๊ธฐ์ฌ๋ฅผ ์์ฑํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๊ตฌํ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ์ดํดํ๋ ค๊ณ ๋
ธ๋ ฅ ์ค์ด๋ฉฐ ์์ ๋ฅผ ์ดํด ๋ณด์์ต๋๋ค. ์์ ์ ์ ๊ณต๋ ์ํ ๋ฆฌํฌ์งํ ๋ฆฌ ์ฝ๋๋ ์ด๋ฆ ์ง์ ๊ท์น์ ์ ์ธํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์ ๊ณต๋ ์ ์ฅ์๊ฐ ProductsCommandHandler
์ ๋์ผํ๋ค๊ณ ์๊ฐํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ถ๊ฐ ํ GetProduct
๊ฐ ์ฌ๊ธฐ์ ์๋ค๋ ๊ฒ์ด ํ ๊ฐ์ง ์ฐจ์ด์ ์ผ ๊ฒ์
๋๋ค. ๋ด๊ฐ ์ฌ๊ธฐ์์๋ ๊ฒ์ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น?
public class ProductRepository {
void AddNewProduct(Product newProduct) {
...
}
void RateProduct(int productId, int userId, int rating) {
var product = repository.Find(productId);
if (product != null)
{
product.RateProduct(userId, rating);
repository.Save(product);
}
}
}
โ ์ด ์น์ ์ ํธ์งํ์ง ๋ง์ญ์์ค.
@martinmthomas ๊ทํ์ ์ง๋ฌธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ์ ์ ํ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒํ ํ๊ณ ์ ๊ณต ํ ๊ฒ์ ๋๋ค.
@MikeWasson ์ฌ๊ธฐ์ ์ด๋ค ์๊ฐ?
AB # 160217- ์ ๊ณ ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.์ด ๋ฌธ์ ๋ ๊ฒํ ์ค์ ๋๋ค.
@martinmthomas ์ฌ์ค ๋ช ๋ น ํธ๋ค๋ฌ๋ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ช
๋ น ์ฒ๋ฆฌ๊ธฐ๋ "์ ํฉํ ๊ฒฝ์ฐ ์ค์ ๋ช
๋ น์ ์ฒ๋ฆฌ"ํ๊ธฐ์ํ ๊ฒ์
๋๋ค. ์ด ์์์ ProductsCommandHandler
ํด๋์ค๋ ์์ฑ์์์ IRepository<Product>
๋ฅผ๋ฐ์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ ํ 5555๋ฅผ ๋ณ 4 ๊ฐ๋ก ํ๊ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
{"product":"5555","stars":4}
๋ฐ์ดํฐ์ ํจ๊ป route / rate๋ก๊ฐ๋ AJAX POST๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.RateProduct
๋ช
๋ น์ ๋น๋ํ๊ณ ์ ํ 5555, ๋ณํ 4๋ฅผ ์ฑ ์๋๋ค. ์์ ์์๋ ๋๊ฐ ๋ฑ๊ธ์ ๋งค๊ธฐ๋์ง๋ ์ฑ ์๋๋ค.CommandHandler
๋ฅผ ๊ฐ์ ธ์ค๊ณ (์๋ง๋ ์ข
์์ฑ ์ฃผ์
์ ์ํด) ๋ช
๋ น์ ์ฌ๊ธฐ์ ๋ฐฐ์นํฉ๋๋ค. h.Handle (c); ์ฌ๊ธฐ์ c๋ RateProduct ๋ช
๋ น์
๋๋ค.๋ฐ๋ผ์ 3 ๊ฐ์ง ์ต์ : a) ํธ๋ค๋ฌ ๊ฐ์ ธ ์ค๊ธฐ, b) ํ ๊ฐ์ ธ ์ค๊ธฐ, c) ๋ฒ์ค๋ฅผ ๊ฐ์ ธ ์์ ํธ๋ค๋ฌ ๋๋ ํ์ ๋ช ๋ น์ ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋๋กํฉ๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฐ์ ... "ํด๋์ ์ ์ฅ์"์ ์ฃผ์ ์ฐจ์ด์ ์ ์ปจํธ๋กค๋ฌ์์ ์ ์ฅ์ ์์ฒด๋ฅผ ํธ์ถํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ปจํธ๋กค๋ฌ๋ "์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ"(ํด๋์ ์ ์ฅ์)์ ์์ง ๋ชปํ์ง๋ง "์ํฐํฐ์ ๋ํ INTENTS OF DOING THINGS๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ"(๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ)์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ธ ํ ํธ๋ก ์ ์ก ๋ ์ด๋๊ฐ (html ์น ์ปจํธ๋กค๋ฌ, API ์ปจํธ๋กค๋ฌ, ๋ช ๋ น ์ค ๋ฑ)์์ "๋ช ๋ น์ ์ฒ๋ฆฌ"ํ๋ ๊ฒ์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ์ด๋ฉฐ CommandHandler์ ๋๋ค. (์ฐ๊ธฐ ์ธก์ ์ํ๋) ํด๋น ๋ช ๋ น์ผ๋ก ์ํ ํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, CommandHandler๋ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ๊ฐ์ ธ์ค๊ณ , ์ํ๋ฅผ ์ค์ ํ๊ณ , ์ ์ฅ (์์ ์์์ ๊ฐ์ด) ํ ์ ์์ง๋ง ์ด๋ฒคํธ ๋ก๊ทธ์ ๊ธฐ๋กํ๊ณ ์์๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ฝ๊ธฐ ์ธก์ ์ ๋ฐ์ดํธํ๊ณ ์ธ๋ถ ์ปค๋ฅํฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฑ์ ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
์ ํ ๋ฐ ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณํ ํ์ / ํ๊ฐ ์์คํ ์ด ๋ฐฐ์น๋๊ฑฐ๋ ์ ์ฅ๋๋ "์์น"์ ๋ํ AGNOSTIC์ผ๋ก ํ๊ฐํ๋ ์ฌ์ฉ์์ ์์ ๊ธฐ๋ฐ UI์ ๋๋ค. ์์คํ ์ ์ฒ์๋ถํฐ ๋์์ธํ๊ณ Product ํด๋์ค์ ์์ ์ ๊ฐ์ด RateProduct () ๋ฉ์๋๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์ญ์์ค. ์ข์.
ํ์ง๋ง ... ์ ํ์ "์ค๋๋"์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ ๊ฑฐ์ ์์คํ ์ด ์๋ค๋ฉด ์ด๋จ๊น์? "๋ชจ๋ธ"(์ : Business Mind)์๋ ์ ํ์ ๋ํ "๋ฑ๊ธ"์ด ์์ต๋๋ค. ๋์ ๋ง์ผํ ๋ด๋น์๋ ๊ธฐ์กด ์ ํ์ ๋ฑ๊ธ์ "์ถ๊ฐ"ํ๊ณ ์ถ์ง๋ง ๋ชจ๋ ํ์ฌ๋ ์ด๊ฒ์ด "์ธ๋ถ์ ์ธ ๊ฒ"์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ ํ ์ ์ฅ์๋ฅผ ์ฌ์ฉ ํ์๊ฒ ์ต๋๊น? ์๋๋ฉด ์ด๋ฏธ ์๋ํ๊ณ ์์ ํ ํ ์คํธ ๋ ์ ํ ๋ฐ ProductRepository๋ฅผ "๋ง์ง์ง"์๋๋ก ๋ค๋ฅธ ๋์ฐ๋ฏธ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์ฐ๊ธฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์น, API ๋ฐ CLI๋ ๋ชจ๋ "๋ช ๋ น"์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ์ (์ง์ , ๋๊ธฐ์ด์ ํตํด ๋๋ ์ฐจ๋ก๋ก ์ฒ๋ฆฌ๊ธฐ ๋๋ ๋๊ธฐ์ด๋ก ๋ผ์ฐํ ํ๋ ๋ช ๋ น ๋ฒ์ค๋ฅผ ํตํด) ์ ์กํ๊ณ ์์ด ๋ฒ๋ฆฝ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ๋ ์์ค ์ฝ๋์ ์ค์ ์ง์ค์ ๋ฐ ์์ ์ง์ ์์ "RateProductCommand"๋ก ์ํ ํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ด ๋ถ๋ฆฌ๋์ด ์กฐ์์ฑ์ด ํฅ์๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ํธ๋ค๋ฌ๋ ProductRepository ๋๋ "์ ํ ๋ฑ๊ธ"์ ์ ์ฅํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
๊ทธ๋์ ๋๋ตํ๋ ค๋ฉด :
CommandHandler => ์ํฐํฐ ํธ์ ๊ด๋ จ์ด ์์ต๋๋ค. "์ฌ์ฉ์์ ์๋"๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค (๊ฒฐ๊ตญ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๋ช
๋ น ์ฒ๋ฆฌ๊ธฐ๋ ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค).
์ ์ฅ์ => ํน์ ์ํฐํฐ์ ๋ํ ์ค์ ์ ์ฅ์.
๋์์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋น.
@xmontero๊ฐ ์ธ๊ธํ๋ฏ์ด ProductsCommandHandler ๋ฐ ProductRepository์๋ "has"๊ด๊ณ ๋ง ์์ต๋๋ค. ProductsCommandHandler๋ ProductApi / Controller์ ProductRepository ๊ฐ์ ์ธํฐํ์ด์ค ์ญํ ์ํฉ๋๋ค. ์ด ๊ตฌํ์ ์ฟผ๋ฆฌ์ ๋ณ๋๋ก ๋ช ๋ น์ ํจ๊ป ์ ์งํ๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ์ ํต์ ์ธ ์ ๊ทผ ๋ฐฉ์์์๋ ์ปจํธ๋กค๋ฌ์์ ์ง์ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ๋ น๊ณผ ์ฟผ๋ฆฌ๋ฅผ ํจ๊ป ์คํํ๋ฏ๋ก ๋ค๋ฅธ ์ธํฐํ์ด์ค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๋ช ๋ น์ ์ฟผ๋ฆฌ์ ๋ถ๋ฆฌํ์ฌ ์ ์งํ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ CQRS ๋์์ธ ํจํด์ ์ ์ฉํ ๊ฒ์ ๋๋ค. ๊ธฐ์ฌ์ ์ธ๊ธ ๋ CQRS์ ๋ชจ๋ ์ด์ ์ ์ป๋ ๋ฐฉํฅ์ผ๋ก ์๋ดํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@martinmthomas ์ฌ์ค ๋ช ๋ น ํธ๋ค๋ฌ๋ ์ ์ฅ์๊ฐ ์๋๋๋ค. ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ๋ "์ ํฉํ ๊ฒฝ์ฐ ์ค์ ๋ช ๋ น์ ์ฒ๋ฆฌ"ํ๊ธฐ์ํ ๊ฒ์ ๋๋ค. ์ด ์์์
ProductsCommandHandler
ํด๋์ค๋ ์์ฑ์์์IRepository<Product>
๋ฅผ๋ฐ์ต๋๋ค.์ฌ์ฉ์๊ฐ ์ ํ 5555๋ฅผ ๋ณ 4 ๊ฐ๋ก ํ๊ฐํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
{"product":"5555","stars":4}
๋ฐ์ดํฐ์ ํจ๊ป route / rate๋ก๊ฐ๋ AJAX POST๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.RateProduct
๋ช ๋ น์ ๋น๋ํ๊ณ ์ ํ 5555, ๋ณํ 4๋ฅผ ์ฑ ์๋๋ค. ์์ ์์๋ ๋๊ฐ ๋ฑ๊ธ์ ๋งค๊ธฐ๋์ง๋ ์ฑ ์๋๋ค.CommandHandler
๋ฅผ ๊ฐ์ ธ์ค๊ณ (์๋ง๋ ์ข ์์ฑ ์ฃผ์ ์ ์ํด) ๋ช ๋ น์ ์ฌ๊ธฐ์ ๋ฐฐ์นํฉ๋๋ค. h.Handle (c); ์ฌ๊ธฐ์ c๋ RateProduct ๋ช ๋ น์ ๋๋ค.๋ฐ๋ผ์ 3 ๊ฐ์ง ์ต์ : a) ํธ๋ค๋ฌ ๊ฐ์ ธ ์ค๊ธฐ, b) ํ ๊ฐ์ ธ ์ค๊ธฐ, c) ๋ฒ์ค๋ฅผ ๊ฐ์ ธ ์์ ํธ๋ค๋ฌ ๋๋ ํ์ ๋ช ๋ น์ ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋๋กํฉ๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฐ์ ... "ํด๋์ ์ ์ฅ์"์ ์ฃผ์ ์ฐจ์ด์ ์ ์ปจํธ๋กค๋ฌ์์ ์ ์ฅ์ ์์ฒด๋ฅผ ํธ์ถํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ์ปจํธ๋กค๋ฌ๋ "์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ"(ํด๋์ ์ ์ฅ์)์ ์์ง ๋ชปํ์ง๋ง "์ํฐํฐ์ ๋ํ INTENTS OF DOING THINGS๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ"(๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ)์ ์๊ณ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ธ ํ ํธ๋ก ์ ์ก ๋ ์ด๋๊ฐ (html ์น ์ปจํธ๋กค๋ฌ, API ์ปจํธ๋กค๋ฌ, ๋ช ๋ น ์ค ๋ฑ)์์ "๋ช ๋ น์ ์ฒ๋ฆฌ"ํ๋ ๊ฒ์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ์ด๋ฉฐ CommandHandler์ ๋๋ค. (์ฐ๊ธฐ ์ธก์ ์ํ๋) ํด๋น ๋ช ๋ น์ผ๋ก ์ํ ํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, CommandHandler๋ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ๊ฐ์ ธ์ค๊ณ , ์ํ๋ฅผ ์ค์ ํ๊ณ , ์ ์ฅ (์์ ์์์ ๊ฐ์ด) ํ ์ ์์ง๋ง ์ด๋ฒคํธ ๋ก๊ทธ์ ๊ธฐ๋กํ๊ณ ์์๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ฌ ์ฝ๊ธฐ ์ธก์ ์ ๋ฐ์ดํธํ๊ณ ์ธ๋ถ ์ปค๋ฅํฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฑ์ ์์ ์ ์ํ ํ ์๋ ์์ต๋๋ค.
์ ํ ๋ฐ ํด๋น ์ปจํธ๋กค๋ฌ๋ฅผ ๋ณํ ํ์ / ํ๊ฐ ์์คํ ์ด ๋ฐฐ์น๋๊ฑฐ๋ ์ ์ฅ๋๋ "์์น"์ ๋ํ AGNOSTIC์ผ๋ก ํ๊ฐํ๋ ์ฌ์ฉ์์ ์์ ๊ธฐ๋ฐ UI์ ๋๋ค. ์์คํ ์ ์ฒ์๋ถํฐ ๋์์ธํ๊ณ Product ํด๋์ค์ ์์ ์ ๊ฐ์ด RateProduct () ๋ฉ์๋๊ฐ ์ด๋ฏธ ํฌํจ๋์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์ญ์์ค. ์ข์.
ํ์ง๋ง ... ์ ํ์ "์ค๋๋"์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋ ๊ฑฐ์ ์์คํ ์ด ์๋ค๋ฉด ์ด๋จ๊น์? "๋ชจ๋ธ"(์ : Business Mind)์๋ ์ ํ์ ๋ํ "๋ฑ๊ธ"์ด ์์ต๋๋ค. ๋์ ๋ง์ผํ ๋ด๋น์๋ ๊ธฐ์กด ์ ํ์ ๋ฑ๊ธ์ "์ถ๊ฐ"ํ๊ณ ์ถ์ง๋ง ๋ชจ๋ ํ์ฌ๋ ์ด๊ฒ์ด "์ธ๋ถ์ ์ธ ๊ฒ"์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ ํ ์ ์ฅ์๋ฅผ ์ฌ์ฉ ํ์๊ฒ ์ต๋๊น? ์๋๋ฉด ์ด๋ฏธ ์๋ํ๊ณ ์์ ํ ํ ์คํธ ๋ ์ ํ ๋ฐ ProductRepository๋ฅผ "๋ง์ง์ง"์๋๋ก ๋ค๋ฅธ ๋์ฐ๋ฏธ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๊น?
๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์ฐ๊ธฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ์น, API ๋ฐ CLI๋ ๋ชจ๋ "๋ช ๋ น"์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ์ (์ง์ , ๋๊ธฐ์ด์ ํตํด ๋๋ ์ฐจ๋ก๋ก ์ฒ๋ฆฌ๊ธฐ ๋๋ ๋๊ธฐ์ด๋ก ๋ผ์ฐํ ํ๋ ๋ช ๋ น ๋ฒ์ค๋ฅผ ํตํด) ์ ์กํ๊ณ ์์ด ๋ฒ๋ฆฝ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ๋ ์์ค ์ฝ๋์ ์ค์ ์ง์ค์ ๋ฐ ์์ ์ง์ ์์ "RateProductCommand"๋ก ์ํ ํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ด ๋ถ๋ฆฌ๋์ด ์กฐ์์ฑ์ด ํฅ์๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ํธ๋ค๋ฌ๋ ProductRepository ๋๋ "์ ํ ๋ฑ๊ธ"์ ์ ์ฅํ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
๊ทธ๋์ ๋๋ตํ๋ ค๋ฉด :
CommandHandler => ์ํฐํฐ ํธ์ ๊ด๋ จ์ด ์์ต๋๋ค. "์ฌ์ฉ์์ ์๋"๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค (๊ฒฐ๊ตญ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ๋ช ๋ น ์ฒ๋ฆฌ๊ธฐ๋ ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค).
์ ์ฅ์ => ํน์ ์ํฐํฐ์ ๋ํ ์ค์ ์ ์ฅ์.
๋์์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์๋น.