BE/DDD

[DDD Start!] 3. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

Taylor Kang 2021. 6. 9. 01:50

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

  • ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์„ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๋‹จ์œ„๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ชจ๋ธ์„ ์กฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•จ
  • ์ผ๊ด€์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์ด ๋จ. ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ๋งŒํผ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ํ™•์žฅ/๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋…ธ๋ ฅ์ด ์ค„์–ด๋“ฌ.

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ๋…๋ฆฝ๋œ ๊ฐ์ฒด ๊ตฐ
    • ํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•˜์ง€ ์•Š์Œ.
    • ๊ฐ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ์ž๊ธฐ์ž์‹ ์„ ๊ด€๋ฆฌํ•  ๋ฟ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ
  • ๊ฒฝ๊ณ„ ์„ค์ •
    • ์„ค์ • ๊ธฐ์ค€: ๋„๋ฉ”์ธ ๊ทœ์น™ & ์š”๊ตฌ์‚ฌํ•ญ
    • A๊ฐ€ B๋ฅผ ๊ฐ–๋Š”๋‹ค (์ƒํ’ˆ-๋ฆฌ๋ทฐ) ≠> A B ๊ฐ€ ํ•œ ์• ๊ทธ๋ฆฌํ„ฐ๊ทธ์— ์†ํ•œ๋‹ค
      • ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
      • ๋ณ€๊ฒฝํ•˜๋Š” ์ฃผ์ฒด๋„ ๋‹ค๋ฆ„
      • B์˜ ๋ณ€๊ฒฝ์ด A์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
      → ๋‹ค์ˆ˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ํ•œ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋งŒ ๊ฐ–๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋‘๊ฐœ ์ด์ƒ์˜ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ๋“œ๋ฌผ๊ฒŒ ์กด์žฌํ•จ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๊ฐ์ฒด๋งŒ ์ƒํƒœ๊ฐ€ ์ •์ƒ์ด์–ด์„  ์•ˆ๋จ → ์ผ๊ด€์„ฑ ์œ ์ง€!
  • → ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ „์ฒด๋ฅผ ๊ด€๋ฆฌํ•  ์ฃผ์ฒด๊ฐ€ ํ•„์š”: ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ

๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ(์—๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ)

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ๋Œ€ํ‘œ ์—”ํ‹ฐํ‹ฐ
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋Š” ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ์— ์ง/๊ฐ„์ ‘์ ์œผ๋กœ ์†ํ•จ
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์ฑ…์ž„์ง → ๋„๋ฉ”์ธ ๊ทœ์น™์— ๋”ฐ๋ผ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ๊ตฌํ˜„(void verify~~~)
  • ๋ฃจํŠธ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋จ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋„๋ฉ”์ธ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•

  1. ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์—”ํ‹ฐํ‹ฐ๋‚˜ ๋ฐธ๋ฅ˜์— setter ๋ฅผ public ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
  2. ๋ฐธ๋ฅ˜ ํƒ€์ž…์€ ๋ถˆ๋ณ€์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ๋„๋ฉ”์ธ ๋กœ์ง์ด ๋„๋ฉ”์ธ ๊ฐ์ฒด์— ์‘์ง‘๋  ์ˆ˜ ์žˆ๋„๋ก setter๋ฅผ private์œผ๋กœ ์„ ์–ธ
  • set ํ˜•์‹์˜ ์ด๋ฆ„์„ ๊ฐ–๋Š” ๊ณต๊ฒŒ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์˜๋ฏธ๊ฐ€ ๋” ์ž˜ ๋“œ๋Ÿฌ๋‚˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ
    • ex. cancel, changePassword...
  • ๋ฐธ๋ฅ˜ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€์ด๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์€ → ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ ๋ฟ
  • ๋ถˆ๋ณ€์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ: ๋ณ€๊ฒฝ๊ธฐ๋Šฅ์„ ํŒจํ‚ค์ง€๋‚˜ protected ๋ฒ”์œ„๋กœ ํ•œ์ •ํ•˜๋„๋ก ์ œํ•œ
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด๋ถ€์˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์กฐํ•ฉํ•ด์„œ ๊ธฐ๋Šฅ์„ ์™„์„ฑ.

ํŠธ๋žœ์žญ์…˜

  • ํ•œ ํŠธ๋žœ์žญ์…˜์—์„œ๋Š” ํ•œ๊ฐœ์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋งŒ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค.
  • ์ˆ˜์ •ํ•˜๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ „์ฒด ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋–จ์–ด์ง (์ž ๊ธˆ๋Œ€์ƒ์ด ๋งŽ์•„์ง)

๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์™€ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

  • ๊ฐ์ฒด์˜ ์˜์†์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‹จ์œ„๋กœ ์กด์žฌํ•จ.
    • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๊ฐ€ ๋ณ„๋„์˜ DBํ…Œ์ด๋ธ”์— ์กด์žฌํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค
  • ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ์ œ๊ณต ๋ฉ”์„œ๋“œ
    • save : ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ €์žฅ
    • findById : ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ตฌํ•จ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„ ์ฐธ์กฐ

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„ ์ฐธ์กฐ = ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ๋ฃจํŠธ๋ฅผ ์ฐธ์กฐ
  • ๋ฐฉ๋ฒ•1) ํ•„๋“œ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„
    • ์—ฐ๊ด€๋œ ๊ฐ์ฒด ๋กœ๋”ฉ(JPA: @ManyToOne, @OneToOne...)
    • ํ•„๋“œ๋ฅผ ์ด์šฉํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์ฐธ์กฐ์˜ ๋ฌธ์ œ
      1. ํŽธํ•œ ํƒ์ƒ‰ ์˜ค์šฉ
        • ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋จ → ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ด€๋ฆฌ๋ฒ”์œ„๋Š” ์ž๊ธฐ์ž์‹ ์œผ๋กœ ํ•œ์ •๋˜์–ด์•ผํ•จ.
      2. ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ
        • ์ง€์—ฐ ๋กœ๋”ฉ(lazy) vs ์ฆ‰์‹œ ๋กœ๋”ฉ(eager)
      3. ํ™•์žฅ ์–ด๋ ค์›€
        • ์‚ฌ์šฉ์ž/ํŠธ๋ž˜ํ”ฝ์ด ๋Š˜์ˆ˜๋ก ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์œ„ํ•ด ํ•˜์œ„ ๋„๋ฉ”์ธ๋ณ„๋กœ ์‹œ์Šคํ…œ์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ → ํ•˜์œ„ ๋„๋ฉ”์ธ ๋งˆ๋‹ค ๋‹ค๋ฅธ DBMS / ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ ์ƒ๊น€ → JPA์™€ ๊ฐ™์€ ๋‹จ์ผ ๊ธฐ์ˆ  ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด์ง
      ⇒ ID๋ฅผ ์ด์šฉํ•œ ๊ฐ„์ ‘ ์ฐธ์กฐ
  • ๋ฐฉ๋ฒ•2) ID๋ฅผ ์ด์šฉํ•œ ๊ฐ„์ ‘ ์ฐธ์กฐ
    • ๋ชจ๋“  ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋กœ ์—ฐ๊ฒฐ๋˜์ง€ ์•ˆํ˜น, ํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋“ค๋งŒ ์ฐธ์กฐ๋กœ ์—ฐ๊ฒฐ๋จ → ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ๋ฌผ๋ฆฌ์  ์—ฐ๊ฒฐ์„ ์ œ๊ฑฐ
    • ์ฐธ์กฐ๊ฐ€ ํ•„์š”ํ• ๋•Œ๋งŒ ์‘์šฉ์„œ๋น„์Šค์—์„œ ์•„์ด๋””๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉํ•˜๋ฉด ๋จ(=์ง€์—ฐ๋กœ๋”ฉ)
    • ๋ฌธ์ œ์ 
      • ์—ฌ๋Ÿฌ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์ฝ์–ด์•ผ ํ•  ๋•Œ ์กฐํšŒ ์†๋„๊ฐ€ ๋ฌธ์ œ ๋  ์ˆ˜ ์žˆ์Œ ⇒ N+1 ์กฐํšŒ
        • ์ฃผ๋ฌธ ์ฝ์–ด์˜ค๊ธฐ(1) + ์ฃผ๋ฌธ๋ณ„ ์ƒํ’ˆ ์ฝ์–ด์˜ค๊ธฐ(N)
        • ์ง€์—ฐ ๋กœ๋”ฉ์˜ ๋ฌธ์ œ์ 
        ⇒ (X) ์กฐ์ธ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ: ID ์ฐธ์กฐ → ๊ฐ์ฒด ์ฐธ์กฐ๋กœ ๋ณ€๊ฒฝ : ๋‹ค์‹œ ๋ฐฉ๋ฒ•1๋กœ ๋Œ์•„๊ฐ€๊ฒŒ๋จ
        • jpa : jpql ์‚ฌ์šฉ or sql ํŠนํ™” ๊ธฐ๋Šฅ ์‚ฌ์šฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ: ์กฐํšŒ ๋ถ€๋ถ„๋งŒ MyBatis ์ด์šฉ
      • ⇒ (O) ์ „์šฉ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉ : ๋ณ„๋„ DAO๋ฅผ ๋งŒ๋“ค๊ณ  ์กฐํšŒ ๋ฉ”์„œ๋“œ์—์„œ ์„ธํƒ€์กฐ์ธ์„ ์ด์šฉํ•ด์„œ ๋กœ๋”ฉ
  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ์ €์žฅ์†Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
    • ํ•œ๋ฒˆ์˜ ์ฟผ๋ฆฌ๋กœ ๊ด€๋ จ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ์กฐํšŒ ๋ถˆ๊ฐ€
    • ์บ์‹œ ์ ์šฉ or ์กฐํšŒ ์ „์šฉ ์ €์žฅ์†Œ ๋”ฐ๋กœ ๊ตฌ์„ฑ
      • ์ฝ”๋“œ ๋ณต์žกํ•ด์ง€์ง€๋งŒ, ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ๋Ÿ‰ ๋†’์ผ์ˆ˜ ์žˆ์Œ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ„ ์ง‘ํ•ฉ ์—ฐ๊ด€

1:N or N:1

  • 1 → N : ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ”„๋กœ๋•ํŠธ ์กฐํšŒ
    • Set ๊ณผ ๊ฐ™์€ ์ปฌ๋ ‰์…˜์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ ⇒ but, ์„ฑ๋Šฅ ๋ฌธ์ œ ๋ฐœ์ƒ
  • N → 1 : ํ”„๋กœ๋•ํŠธ์˜ ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ
    • ID๋ฅผ ์ด์šฉํ•œ ์—ฐ๊ด€ ์„ค์ •

M:N

  • ์–‘์ชฝ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์ปฌ๋ ‰์…˜์œผ๋กœ ์—ฐ๊ด€ ์ƒ์„ฑ → ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.. ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•˜์—ฌ ํ•„์š”ํ•œ ์ชฝ์—๋งŒ ์—ฐ๊ด€์„ ์ ์šฉํ•˜์ž.
  • RDBMS: ์กฐ์ธํ…Œ์ด๋ธ” ์‚ฌ์šฉ
  • JPA
    • @CollectionTable, @ElementCollection , @JoinColumn๋“ฑ๊ณผ ๊ฐ™์€ ๋งคํ•‘์„ค์ •์„ ์‚ฌ์šฉ
    • JPQL - member of ์—ฐ์‚ฐ์ž ์ด์šฉ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ํŒฉํ† ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

  • ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•œ๋‹ค๋ฉดex. store(์ƒ์ ) ์˜ ์ƒํƒœ(๋ฐ์ดํ„ฐ)์— ๋”ฐ๋ผ product(๋ฌผ๊ฑด)์„ ์ƒ์„ฑํ•˜๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š” ๊ฒฝ์šฐ : store ์— product๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€
  • → ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ž

'BE > DDD' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[DDD Start!] 2. ์•„ํ‚คํ…์ณ ๊ฐœ์š”  (0) 2021.06.07
[DDD Start!] 1. ๋„๋ฉ”์ธ ๋ชจ๋ธ ์‹œ์ž‘  (0) 2021.06.07