DDD์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์ž

DDD์˜ ๊ฐœ๋…๊ณผ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

  • ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ = ๊ณ ๊ฐ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๋Š” ๊ฒƒ
  • ๊ณผ๊ฑฐ : ๊ธฐ์ˆ  ์ค‘์‹ฌ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•๋ก  โ†’ ๋น„์ฆˆ๋‹ˆ์Šค ์ธก๋ฉด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ ๋ฐ˜์˜์— ํ•œ๊ณ„

DDD์˜ ํ•ต์‹ฌ ๊ฐ€์น˜

  • ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„์—์„œ ๋„๋ฉ”์ธ ์ง€์‹์ด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ์ž„์„ ์ธ์‹ํ•˜๊ณ  ์ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„
  • ์œ ๋น„์ฟผํ„ฐ์Šค ์–ธ์–ด : ๋ชจ๋“  ๊ณณ์—์„œ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด
  • ์šฉ์–ด์˜ ๋ชจํ˜ธํ•จ์„ ์ค„์ด๊ณ  ๋„๋ฉ”์ธ๊ณผ ์ฝ”๋“œ ์‚ฌ์ด ๋ถˆํ•„์š”ํ•œ ํ•ด์„ ๊ณผ์ • ๊ฐ์†Œ

๋„๋ฉ”์ธ ๋ชจ๋ธ

  • DDD์—์„œ ํ•ต์‹ฌ ๊ฐœ๋…์„ ํฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ง€์‹, ๊ทœ์น™, ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ฐœ๋…์ ์œผ๋กœ ํ‘œํ—Œํ•œ ๊ฒƒ

DDD์˜ ๊ตฌ์กฐ์™€ ์šฉ์–ด

Entity

  • ๊ณ ์œ ์˜ ์‹๋ณ„์ž๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด๋กœ ์ž์‹ ์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ๊ฐ€์ง
  • ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด
  • ๋„๋ฉ”์ธ ๊ด€์ ์—์„œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์บก์Аํ™”ํ•ด์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ž„์˜๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๋ฐฉ์ง€

Value

  • ๊ณ ์œ ์˜ ์‹๋ณ„์ž๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ๊ฐ์ฒด๋กœ ๊ฐœ๋…์ ์ธ ํ•˜๋‚˜์˜ ๊ฐ’์„ ํ‘œํ˜„

Domain Service

  • ํŠน์ • ์—”ํ‹ฐํ‹ฐ์— ์†ํ•˜์ง€ ์•Š๋Š” ๋„๋ฉ”์ธ ๋กœ์ง

Aggregate

  • ๊ด€๋ จ๋œ ๊ฐ์ฒด๋“ค์„ ๋ชจ์•„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ทจ๊ธ‰ํ•˜๋Š” ๊ฐœ๋…
  • ์—ฐ๊ด€ ๋„๋ฉ”์ธ์„ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋กœ ๋ฌถ์–ด ํ•˜๋‚˜์˜ ๊ตฐ์ง‘์œผ๋กœ ์ดํ•ด
  • ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฐ„์˜ ๊ด€๊ณ„ ํŒŒ์•… ๊ฐ€๋Šฅ
  • ํŠน์ • ๋„๋ฉ”์ธ ๊ตฐ์ง‘์— ์†ํ•œ ๊ฐ์ฒด๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ฐ€์ง
  • ํ•˜๋‚˜์˜ ์• ๊ฑฐ๋ฆฌ๊ฑฐํŠธ์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์กด์žฌ

JPA์—์„œ์˜ DDD

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด repository ํŒจํ„ด ๊ถŒ์žฅ
  • JpaRepository, @Entity
  • ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ๋งคํ•‘์„ ํ•˜๋ฉด์„œ๋„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์ˆœ์ˆ˜์„ฑ ์œ ์ง€ ๊ฐ€๋Šฅ

๊ทธ๋Ÿผ mybatis๋กœ DDD ๊ฐœ๋ฐœ์€ ์–ด๋ ต๋‚˜โ€ฆ? ๋˜‘๊ฐ™์ด repository๋กœ ํ•˜๋Š”๊ฑฐ๋ผ ์ƒ๊ด€์—†๋‚˜..? ํ 

  • JpaRepository๋ฅผ ๋ฃจํŠธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์—๋งŒ ๊ตฌํ˜„
    • ๋ฃจํŠธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ํ•˜์œ„ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ด€๋ฆฌ
    • ์˜์†์„ฑ ๋กœ์ง๋„ ๋ฃจํŠธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์ง‘์ค‘
    • ex) Order(root) โ†’ OrderProduct โ†’ Receipt ๊ฐ€๊ฒฉ ์ •๋ณด ์ˆ˜์ •
@Transactional
public void updateOrderProductReceiptPrice(Long id, Long orderProductId, Long receiptId, Long price) {
	orderRepository.findById(id)
			.flatMap(order -> order.getProduct(orderProductId))
			.flatMap(orderProduct -> orderProduct.findReceipt(receiptId))
			.ifPresent(receipt -> receipt.update(price));
}

OrderProduct๋Š” Order์— ์˜ํ•ด ๋ณ€๊ฒฝ ๋˜๊ณ , Receipt๋Š” OrderProduct์— ์˜ํ•ด ๋ณ€๊ฒฝ๋จ โ†’ ์บก์Аํ™”๊ฐ€ ๊นจ์ง€์ง€ ์•Š์Œ!

MSA ์—์„œ์˜ DDD

  • ๋ชจ๋†€๋ฆฌ์‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ MSA๋กœ ์ „ํ™˜ํ•  ๋•Œ ์ค‘์š”ํ•œ ๊ฒƒ : ์„œ๋น„์Šค์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„๋Š” ๊ฒƒ
  • ๋„๋ฉ”์ธ ๊ฐœ๋…์„ ๊ธฐ์ค€์œผ๋กœ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ตฌ์ถ•(์ฃผ๋ฌธ, ์ƒํ’ˆ, ๋ฆฌ๋ทฐ ๋“ฑ)