Architecture-center: ProductsCommandHandler (CQRS)์™€ ProductRepository (๊ธฐ์กด ์•„์น˜)์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2019๋…„ 11์›” 15์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: MicrosoftDocs/architecture-center

์•ˆ๋…•ํ•˜์„ธ์š”,
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);
    }
  }
}

๋ฌธ์„œ ์„ธ๋ถ€ ์ •๋ณด

โš  ์ด ์„น์…˜์„ ํŽธ์ง‘ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

Pri1 architecture-centesvc assigned-to-author cloud-fundamentalsubsvc product-question triaged

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@martinmthomas ์‚ฌ์‹ค ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋Š” ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น ์ฒ˜๋ฆฌ๊ธฐ๋Š” "์ ํ•ฉํ•œ ๊ฒฝ์šฐ ์‹ค์ œ ๋ช…๋ น์„ ์ฒ˜๋ฆฌ"ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ProductsCommandHandler ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž์—์„œ IRepository<Product> ๋ฅผ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ œํ’ˆ 5555๋ฅผ ๋ณ„ 4 ๊ฐœ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€ (๋กœ์ปฌ .exe ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Œ, ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)๋ฅผ ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด {"product":"5555","stars":4} ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ route / rate๋กœ๊ฐ€๋Š” AJAX POST๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค.
  • POST ๊ฒฝ๋กœ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” POST ํ˜ธ์ถœ์—์„œ ๋ฐœ์ƒํ•˜๋Š” "์“ฐ๊ธฐ"์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ณ ์ „์ ์ธ ์ œํ’ˆ ์ €์žฅ์†Œ๋ฅผ๋กœ๋“œํ•˜๊ณ  ์ œํ’ˆ 5555๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œํ’ˆ์— "๋ณ„ 4 ๊ฐœ ๋“ฑ๊ธ‰์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” RateProduct ๋ช…๋ น์„ ๋นŒ๋“œํ•˜๊ณ  ์ œํ’ˆ 5555, ๋ณ„ํ‘œ 4๋ฅผ ์ฑ„ ์›๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋ˆ„๊ฐ€ ๋“ฑ๊ธ‰์„ ๋งค๊ธฐ๋Š”์ง€๋„ ์ฑ„ ์›๋‹ˆ๋‹ค.
  • ์ด ์ˆœ๊ฐ„ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์“ฐ๊ธฐ ๋ชจ๋ธ์— "๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค". ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ธฐ์—ด์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ CommandHandler ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  (์•„๋งˆ๋„ ์ข…์†์„ฑ ์ฃผ์ž…์— ์˜ํ•ด) ๋ช…๋ น์„ ์—ฌ๊ธฐ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. h.Handle (c); ์—ฌ๊ธฐ์„œ c๋Š” RateProduct ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • ๋Œ€๊ธฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋Œ€๊ธฐ์—ด์„ ๊ฐ€์ ธ์˜ค๊ณ  (์•„๋งˆ๋„ ์ข…์†์„ฑ ์ฃผ์ž…์œผ๋กœ) ๋ช…๋ น์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค. q.Queue (c);
  • ์ด ๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ ํ์˜ ๋ฆฌ์Šค๋„ˆ๋Š” ํ์—์„œ ๋ช…๋ น์„ ๊ฐ€์ ธ์™€ ๋Œ€์‹  ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • thirs ์˜ต์…˜ (๊ถŒ์žฅ)์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ช…๋ น์ด ๋™ ๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ (์ฒ˜๋ฆฌ๊ธฐ ๊ฐ€์ ธ ์˜ค๊ธฐ) ๋˜๋Š” ๋น„๋™๊ธฐ ์ ์œผ๋กœ (๋Œ€๊ธฐ์—ด ๊ฐ€์ ธ ์˜ค๊ธฐ) ์ฒ˜๋ฆฌ๋˜๋Š”์ง€๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ช…๋ น ๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” "์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹"์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ๋ฒ„์Šค๊ฐ€ b๋ผ๊ณ  ๋งํ•˜๋ฉด b.Send (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 => ์—”ํ‹ฐํ‹ฐ ํŠธ์™€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. "์‚ฌ์šฉ์ž์˜ ์˜๋„"๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค (๊ฒฐ๊ตญ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๋ช…๋ น ์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค).
์ €์žฅ์†Œ => ํŠน์ • ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•œ ์‹ค์ œ ์ €์žฅ์†Œ.

๋„์›€์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
์ž๋น„.

๋ชจ๋“  5 ๋Œ“๊ธ€

@martinmthomas ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ ์ ˆํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ์ œ๊ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@MikeWasson ์—ฌ๊ธฐ์— ์–ด๋–ค ์ƒ๊ฐ?

AB # 160217- ์‹ ๊ณ  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋Š” ๊ฒ€ํ†  ์ค‘์ž…๋‹ˆ๋‹ค.

@martinmthomas ์‚ฌ์‹ค ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋Š” ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น ์ฒ˜๋ฆฌ๊ธฐ๋Š” "์ ํ•ฉํ•œ ๊ฒฝ์šฐ ์‹ค์ œ ๋ช…๋ น์„ ์ฒ˜๋ฆฌ"ํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ProductsCommandHandler ํด๋ž˜์Šค๋Š” ์ƒ์„ฑ์ž์—์„œ IRepository<Product> ๋ฅผ๋ฐ›์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ œํ’ˆ 5555๋ฅผ ๋ณ„ 4 ๊ฐœ๋กœ ํ‰๊ฐ€ํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€ (๋กœ์ปฌ .exe ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์Œ, ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ƒ์ƒํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค)๋ฅผ ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด {"product":"5555","stars":4} ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ route / rate๋กœ๊ฐ€๋Š” AJAX POST๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค.
  • POST ๊ฒฝ๋กœ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ปจํŠธ๋กค๋Ÿฌ๋Š” POST ํ˜ธ์ถœ์—์„œ ๋ฐœ์ƒํ•˜๋Š” "์“ฐ๊ธฐ"์ž‘์—…๊ณผ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์ „์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ณ ์ „์ ์ธ ์ œํ’ˆ ์ €์žฅ์†Œ๋ฅผ๋กœ๋“œํ•˜๊ณ  ์ œํ’ˆ 5555๋ฅผ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ œํ’ˆ์— "๋ณ„ 4 ๊ฐœ ๋“ฑ๊ธ‰์ด ์ง€์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•˜๊ณ  ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ ‘๊ทผ ๋ฐฉ์‹์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” RateProduct ๋ช…๋ น์„ ๋นŒ๋“œํ•˜๊ณ  ์ œํ’ˆ 5555, ๋ณ„ํ‘œ 4๋ฅผ ์ฑ„ ์›๋‹ˆ๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋ˆ„๊ฐ€ ๋“ฑ๊ธ‰์„ ๋งค๊ธฐ๋Š”์ง€๋„ ์ฑ„ ์›๋‹ˆ๋‹ค.
  • ์ด ์ˆœ๊ฐ„ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์“ฐ๊ธฐ ๋ชจ๋ธ์— "๋ช…๋ น์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค". ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๊ธฐ์—ด์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ CommandHandler ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  (์•„๋งˆ๋„ ์ข…์†์„ฑ ์ฃผ์ž…์— ์˜ํ•ด) ๋ช…๋ น์„ ์—ฌ๊ธฐ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. h.Handle (c); ์—ฌ๊ธฐ์„œ c๋Š” RateProduct ๋ช…๋ น์ž…๋‹ˆ๋‹ค.
  • ๋Œ€๊ธฐ์—ด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋Œ€๊ธฐ์—ด์„ ๊ฐ€์ ธ์˜ค๊ณ  (์•„๋งˆ๋„ ์ข…์†์„ฑ ์ฃผ์ž…์œผ๋กœ) ๋ช…๋ น์„ ๋Œ€๊ธฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค. q.Queue (c);
  • ์ด ๋งˆ์ง€๋ง‰ ๊ฒฝ์šฐ ํ์˜ ๋ฆฌ์Šค๋„ˆ๋Š” ํ์—์„œ ๋ช…๋ น์„ ๊ฐ€์ ธ์™€ ๋Œ€์‹  ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • thirs ์˜ต์…˜ (๊ถŒ์žฅ)์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ช…๋ น์ด ๋™ ๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€ (์ฒ˜๋ฆฌ๊ธฐ ๊ฐ€์ ธ ์˜ค๊ธฐ) ๋˜๋Š” ๋น„๋™๊ธฐ ์ ์œผ๋กœ (๋Œ€๊ธฐ์—ด ๊ฐ€์ ธ ์˜ค๊ธฐ) ์ฒ˜๋ฆฌ๋˜๋Š”์ง€๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ช…๋ น ๋ฒ„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” "์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹"์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋ช…๋ น ๋ฒ„์Šค๊ฐ€ b๋ผ๊ณ  ๋งํ•˜๋ฉด b.Send (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์˜ ๋ชจ๋“  ์ด์ ์„ ์–ป๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰