Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜

bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. ࠤ౻ ୓ਓ Sato Takuto 2015.04 2019.05 2020.01 େֶ(ݐஙֶઐ߈)ଔۀޙɺ גࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾ ձܭγεςϜͷιϑτ΢ΣΞ։ൃΛ୲౰

    ಛʹࡒ຿ձܭͷ࢓༁ؔ࿈ ϏοτΩʔ΁ࢀը ECαΠτͷ։ൃ / อकɺࣾ಺γεςϜͷ։ൃ TaKuTyͷ։ൃ ࠓͷHomeͷલ਎ͱͳΔResidenceνʔϜʹ഑ଐ bitlockΛѻ͏؅ཧը໘΍όοΫΤϯυɺappͷ։ൃ ʹैࣄ 2022.07 HomeϓϩμΫτͷٕज़੹೚ऀ ෳࡶͳࣄ৅ΛಡΈղ͍ͯߏ଄Խ͠ɺந৅Խ / ൚༻Խ Ͱ͖ΔΑ͏ʹઃܭ͠ɺ௿ίετͰଟ͘ͷՁ஋Λͩͤ Δ։ൃΛ͢Δ͜ͱΛ޷Ή
  2. Outline 1. ͸͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.

    ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ΋͙΋͙ (͓͍͍͠ͷ) 6. ͠Ί 7 7
  3. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.01 11 11 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ

    = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
  4. 1. ;Ή;Ή 1. ଥ౰͔ʁ ։ൃͷϑΣʔζ / ՝୊౳ΛؑΈͯ൑அ σϝϦοτ্͕ճͬͨΒҙຯແ͠... 2. ղܾͰ͖Δ͔ʁ

    ղܾͷखஈʹঢ՚Ͱ͖Δ͔ ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠ ՝୊͕ղܾͰ͖Δͱ͸ݶΒͳ͍... 15 15
  5. 1. ;Ή;Ή 1. ଥ౰͔ʁ ։ൃͷϑΣʔζ / ՝୊౳ΛؑΈͯ൑அ σϝϦοτ্͕ճͬͨΒҙຯແ͠… 2. ղܾͰ͖Δ͔ʁ

    ղܾͷखஈʹঢ՚Ͱ͖Δ͔ ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠ ՝୊͕ղܾͰ͖Δͱ͸ݶΒͳ͍... 16 16 ։ൃͷϑΣʔζͱ՝୊Λ ͪΌΜͱཧղͰ͖ͯΔʁʁ ఏএ಺༰Λ뱌ͯ͠ ՝୊ΛͲ͏΍ͬͨΒղܾͰ͖Δ ͷͩΖ͏͔ʁ
  6. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 18 18 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ

    = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
  7. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 19 19 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ

    = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍... ͜͏ࢥ͍ͬͯΔ࣌఺Ͱɺͦ΋ͦ΋ඞཁͳঢ়گͰͳ͍
  8. ͜͜͸΍Γํͷ໰୊ɻDDD͔ΒೖΔͱ೉͍͔͠΋.... ՝୊ͱୡ੒͍ͨ͜͠ͱΛ໌֬ʹͯ͠ྟΊ͹͍͚Δʂʂ 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 20 20 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ

    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
  9. Outline 1. ͸͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.

    ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ΋͙΋͙ (͓͍͍͠ͷ) 6. ͠Ί 23 24
  10. νʔϜߏ੒ - ࣾһ4-5ਓ + ۀ຿ҕୗ ։ൃϓϩηε - εΫϥϜ։ൃͰɺ1िؒεϓϦϯτ - ϑϩϯτ

    × όοΫΤϯυ݉ۀΛਪ঑ - openapiͰAPIͷIFఆ͔ٛͯ͠Β࣮૷ ٕज़ - React × Typescriptɺnode.js × Typescript - ؀ڥ͸GCPɺDB͸firestore͕΄΅΄΅ 35 36 ೉͍͠ϙΠϯτ - ྖҬ͕޿͍ɺػೳ΋ଟذʹΘͨΔ (ݖݶͷ؅ཧ / ΧΪͷ؅ཧ / ೖୀډ؅ཧ / ܝࣔ൘ / ౤ථ...) - ڞ௨Խͷਪਐ -> ந৅Խ͞Εͨσʔλ΍ϩδοΫ 1. ͦ΋ͦ΋ ιʔεن໛ - ςʔϒϧɿ400ఔ౓ - APIɿ500ʙ1000ఔ౓ - ιʔεɿ100ສߦఔ౓
  11. ։ൃಛੑ 36 37 1. ͦ΋ͦ΋ ɾՁ஋ఏڙͷର৅ͱͳΔࣄۀྖҬ͕ඇৗʹ޿͍ ɹΧΪ / ಺ݟ༧໿ /

    ཧࣄ૯ձ / إೝূ / ഑ୡαʔϏε࿈ܞ ...ͳͲ ɹந৅Խ൚༻Խ͞Εͨػೳ͕͍ΖΜͳจ຺Ͱར༻͞ΕΔ ɾந৅Խ & ൚༻ԽΛੵۃతʹ࣮ࢪ ɹ(֓೦తͳཁૉ͕ڧ͘ͳΓɺೝࣝ૬ҧ͕ੜ·ΕΔϦεΫ͋Γ) ϓϩμΫτ਺ / ػೳ਺ ͕૿͑ɺ։ൃʹؔΘΔਓ΋૿Ճ → શମΛ೺Ѳ͠ͳ͕Β։ൃΛ͢Δ͜ͱ͕ඇৗʹࠔ೉ͳঢ়ଶʹ...
  12. ྫ1 ༧໿ͷσʔλʹ͸ҎԼͷϑΟʔϧυ͕͋Δ ɾॏෳ༧໿Մ൱: boolean (ඞਢ߲໨) ɾॏෳ༧໿Մೳ਺: number (೚ҙ߲໨) ॏෳ༧໿Մ൱͕trueͷ৔߹ʹɺॏෳ༧໿Մೳ਺͕ະࢦఆͷ৔߹ͷऔΓѻ͍ํ ॏෳ༧໿Մೳ਺͕ෛͷ਺ͩͬͨ৔߹ͷऔΓѻ͍ํ

    Ͱॲཧͷ݁Ռ͕ࠩҟ͕ग़ΔՄೳੑ͕͋Δ ಺ݟ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕ະࢦఆͷ৔߹ʹ͸੍ݶ͔͚ͳ͍ ձٞࣨ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕-1ͷ৔߹ʹ͸ձٞࣨͰࢦఆ͞Ε͍ͯΔσ ϑΥϧτͷ੍ݶ਺Ͱѻ͏ ͱ͔... 38 39 1. ͦ΋ͦ΋
  13. 40 ՝୊ - ଞػೳͰෆ੔߹ͱͳΔσʔλΛ࡞Δ࣮૷͕Մೳ - Өڹൣғͷ೺Ѳࠔ೉Ͱɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλε೺Ѳ͕ࠔ೉

    (σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ೉ (ػೳ × σʔλͷؔ࿈) - validation౳ͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొ࿥஋ͷೝࣝͷ࢓ํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮૷͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - service૚ˠservice૚ˠ...→service૚ˠ update & commit 41 1. ͦ΋ͦ΋
  14. 41 ՝୊ - ଞػೳͰෆ੔߹ͱͳΔσʔλΛ࡞Δ࣮૷͕Մೳ - Өڹൣғͷ೺Ѳࠔ೉Ͱɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλε೺Ѳ͕ࠔ೉

    (σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ೉ (ػೳ × σʔλͷؔ࿈) - validation౳ͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొ࿥஋ͷೝࣝͷ࢓ํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮૷͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - service૚ˠservice૚ˠ...→service૚ˠ update & commit 42 1. ͦ΋ͦ΋
  15. υϝΠϯΤΩεύʔτ ϢϏΩλεݴޠͰձ࿩͕Ͱ͖Δͱ͔ ϞσϧΛܧଓతʹ੒௕͍ͤͯ͘͞ͱ͔... ͸࣍ͷεςοϓͰ 1. ݎ࿚ɺ2. ஌ࣝͷू໿ ͕·ͣ͸ओ໨త 50 51

    1. ͯͯ͞͞ DDDͱ͍ͬͯ΋... ↑͜Ε΋ॏཁͰ͕͢ओͨΔ՝୊Ͱͳ͍ͷͰɺ࠷ॳ͸ߟ͑ͳ͍ ɹ࠷ॳ͔Β͋Ε΋͜Ε΋ͩͱࠞཚͯ͠͠·͏ͷͰ...
  16. طଘ࣮૷ ϨΠϠʔυߏ଄ 54 55 1. ͯͯ͞͞ DB(firestore)΁ͷґଘ౓େ serviceϨΠϠͰ΋ґଘ࣮ͨ͠૷಺༰ service ->

    service -> service … Έ͍ͨͳߏ଄..͚ͬ͜͏͋Δ DBͷܕ৘ใ υΩϡϝϯτύεͷఆٛ (table໊+primaryKeyΈ͍ͨͳ΋ͷ)
  17. ɾطଘϑΝΠϧͷߏ੒ͱͷซ༻ ɾஈ֊తಋೖ ɾݎ࿚ԽͷͨΊͷpackageߏ੒ ɾιʔεهࡌྔΛ΁Βͨ͢Ίͷ࢓૊ ɾมߋલޙͷ৘ใΛ΋ͨͤΔΑ͏ʹ ɾtransactionͷ؅ཧ 71 72 1. ΋͙΋͙

    ޻෉఺ ɾloggerɺdeep cloneɺ ɾreadOnly ɾvalueObjectͷdefault checker ɾtypeUtils ɾtoFirestoreͷconverter ɾlooseEntityͰgetterͷσϑΥ࣮૷ ɾDIपΓ
  18. ࠓޙ • ϞσϧΛνʔϜ/૊৫Ͱৢ੒͍ͯ͘͠࢓૊Έͮ͘Γ • ValueObjectͷීٴ (஋ͷ؅ཧͷ࢓ํʹϧʔϧ͕༗Δ΍ͭ) • υϝΠϯΠϕϯτͷಋೖ • ࣮૷ྔͷ௿ݮ

    • DomainModel ← infractructure ͷιʔε࣮૷ྔ௿ݮ • ࢀর༻σʔλͱͷ࿈ܞڧԽ • τϥϯβΫγϣϯ؅ཧͷ؅ཧ • ྖҬͷ੾Γํͷྑ͍ํ๏ͷ໛ࡧ 78 79 1. ͠Ί
  19. Ͳ͔͜Ͱ࿩ͤΔͱ͍͍ͳͱࢥ͏͜ͱ • Ϗδωεͷ࿩ • ந৅Խ / ߏ଄Խ / ൚༻ԽΛ໨ࢦ͢։ൃͷ࿩ •

    ՝୊ͷৄࡉ / ࣮ྫɺͱղܾํ๏ • ҎԼཁૉͷ࢖͍ํৄࡉ / ࣮ྫ ◦ ValueObject / Entity / DomainService / DomainEvent • ϞσϦϯάͷ࢓ํ ͱ ࣮ྫ • σʔλߋ৽࣌ͷτϥϯβΫγϣϯ؅ཧͷ࢓ํͱ޻෉఺ৄࡉ • ॏෳνΣοΫͷػߏͷ࣮ݱͷ࢓ํ࣮ྫ (DomainService) • ΧϓηϧԽͷ࣮ݱ౓߹ɺgetter, setterͱ͔Ͳ͏࣮ݱͯ͠Δ͔ • ίετෛՙͱͷ޲͖߹͍ํ • σΟϨΫτϦߏ੒ • ͓ͷ͓ͷಉ͡ࣄ৅ʹ͍ͭͯϞσϦϯάͯ͠ɺσΟϕʔτͷ࣮ԋ 79 80 1. ͠Ί
  20. 84

  21. Queue Smaple આ໌ 94 95 1. Appendix ▪ Queue ɾQueue

    Λ؅ཧ͢ΔͨΊͷσʔλ ɾॲཧத͔൱͔ɺॲཧ͍ͯ͠Δ task ͕ͳʹ͔ͳͲΛ؅ཧ͢Δ ▪ QueueTask ɾQueue ʹੵ·ΕͨλεΫ ɾॲཧதͱͳΔλΠϛϯάͰ࡟আ͞Εɺॲཧʹࣦഊ͠ϦτϥΠର৅ͱͳͬͨλΠϛϯάͰ࠶ੜ੒͞ΕΔ ɾجຊతʹ͸ enqueue ͞Εͨ೔࣌ॱʹλεΫΛ࣮ߦ͢Δ ɾ༏ઌ౓͕ࢦఆ͞Εͯݴ͏৔߹ʹ͸༏ઌ౓͕ߴ͍ॱʹ࣮ߦ͢Δ ▪ QueueTaskResult ɾQueue ͷ࣮ߦ݁ՌΛ؅ཧ͢ΔͨΊͷσʔλ ɾॲཧࣦഊͯ͠ϦτϥΠ͢Δ৔߹ͳͲ͸ɺϦτϥΠ͝ͱʹ݁ՌσʔλΛੜ੒͢Δ ɾTaskEntry ʹ͸࠷ऴతͳ݁ՌͷΈ֨ೲ͢Δ ▪ QueueEntry ɾQueue λεΫΛ؅ཧ͢Δݩσʔλ ɾλεΫੜ੒࣌ʹຊσʔλ͕ੜ੒͞ΕΔ ɾλεΫ࣮ߦʹඞཁͳ৘ใͱɺ࠷௿ݶͷεςʔλεͷ؅ཧΛߦ͏ ɾ࣮ࡍʹ Queue ্ͷσʔλભҠΛ؅ཧ͢Δσʔλ͸ผ ▪ QueueEntrySubtask ɾ1 ͭͷ Entry Λ࣮ݱ͢ΔͨΊʹෳ਺ͷ Task Λ࣮ߦ͢Δඞཁ͕͋Δ৔߹ʹ ɹෳ਺ͷ Task Λ SubTask ͱͯ͠؅ཧ͢Δ