$30 off During Our Annual Pro Sale. View Details »

ドメイン駆動設計を軽快に実践するための工夫

haljik
March 05, 2016

 ドメイン駆動設計を軽快に実践するための工夫

DDD関西.java 3/5(土) 発表資料

haljik

March 05, 2016
Tweet

More Decks by haljik

Other Decks in Technology

Transcript

  1. υϝΠϯۦಈઃܭΛ
    ܰշʹ࣮ફ͢ΔͨΊ
    ͷ޻෉
    2016/3/4 ؔ੢DDD.java
    @haljik

    View Slide

  2. ࣗݾ঺հ
    Տ্ ੖࢘(͔Θ͔Έ ͍ͤ͡ʣ
    @haljik
    ϑϦʔϥϯεJavaΤϯδχΞ
    4 ؔ੢DDD.javaओ࠵
    4 ؔ੢JavaΤϯδχΞͷձϝϯόʔ
    4 DDDΞϥΠΞϯεൃىਓϝϯόʔ

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    4 ॏް͞ͱܰշ͞
    4 Ϟσϧ΁ͷϑΟʔυόοΫɾϧʔϓ
    4 ϚΠϒʔϜ
    4 ࠷ۙͷ՝୊

    View Slide

  4. ࠓ೔࿩͞"ͳ͍"͜ͱ
    4 ϓϩδΣΫτॳظͷ׆ಈ
    ͓͓Αͦͷۀ຿Πϝʔδ΍ɺγεςϜͷશମ
    ૾ɺࠎ֨ͱͳΔ༻ޠ͸ΠϯϓοτࡁΈͰɺ
    ͋Δఔ౓ͷू໿ϧʔτ͕ݟ͍͑ͯΔ͙Β͍ͷঢ়
    ଶΛલఏͱ͓ͯ͠ฉ͖͍ͩ͘͞ɻ

    View Slide

  5. എܠ
    4 WebΞϓϦέʔγϣϯ։ൃ
    4 Java
    4 Spring Boot
    4 Thymeleaf
    4 MyBatis
    H2database & PostgreSQL
    4 ։ൃϝϯόʔ͸࠷େͰ΋10ਓ͙Β͍ͷن໛ײ

    View Slide

  6. ࢲ͕ࢥ͏ॏް͞
    4 ϞσϧਤΛ͔ͬ͠Γॻ͘
    4 ৗʹϞσϧਤΛߋ৽͢Δ
    4 ϞσϧਤͰυϝΠϯΤΩεύʔτͱձ࿩

    View Slide

  7. ॏް͞ͷ໰୊
    4 ϞσϧਤͰձ࿩ͯ͘͠ΕΔυϝΠϯΤΩεύʔ
    τ͍ͬͯΔͷ?
    4 ී௨υϝΠϯΤΩεύʔτͬͯ๩͍͠ਓͩΑ
    Ͷ?
    4 ͦ΋ͦ΋υϝΠϯΤΩεύʔτ͕͍ͳ͍
    4 ϞσϧਤΛৗʹ࠷৽ʹߋ৽͢Δ࣌ؒ͋ΔͳΒί
    ʔυॻ͖͍ͨ

    View Slide

  8. ࢲ͕ࢥ͏ܰշ͞
    4 ݪଇίʔυϑΝʔετ
    4 ϞσϧਤΛؚΉυΩϡϝϯτྨ͸εφοϓγϣ
    οτͱͯ͠ॻ͘͜ͱ͸͋Δ
    4 υϝΠϯΤΩεύʔτΛ଴ͨͳ͍
    4 ސ٬ɺར༻ऀ͔ΒͷϑΟʔυόοΫ͸ಈ͘UI͔
    ΒͰྑ͠ͱ͢Δ

    View Slide

  9. ཁ͸ϞσϧΛચ࿅͍ͤͯ͞
    ͨ͘Ίͷૉૣ͍ϑΟʔυό
    οΫϧʔϓΛͲͷΑ͏ʹߏங
    ͢Δͷ͔
    4 ࣗ෼ୡͰճͤΔϧʔϓ͸ࣗ෼ୡͰճ͢
    4 ૣ͘খ͘͞ճ͢

    View Slide

  10. ۩ମతʹͲ͏͍ͯ͠Δ͔

    View Slide

  11. ϑΟʔυόοΫɾϧʔϓΛ
    ࢧ͑Δ׆ಈͷશମ૾

    View Slide

  12. View Slide

  13. ྫɿ৽͍͠ू໿ϧʔτͱ͠
    ͯʮར༻ऀʯΛ௥Ճ͢Δ

    View Slide

  14. લఏͱͳ͍ͬͯΔ։ൃελΠϧ
    4 ू໿ϧʔτ͕։ൃͷجຊ୯Ґ
    4 ू໿ϧʔτʹରͯ͠Ϣʔεέʔε͕͋Δ
    4 ྫ͑͹ར༻ऀͩͱɺ৽نొ࿥ɺϓϩϑΟʔ
    ϧมߋ etc.

    View Slide

  15. 1. ू໿ϧʔτͷ࣮૷
    4 ू໿ͱͦͷID͙Β͍
    public class User {
    UserId id;
    }
    public class UserId {
    String value;
    }

    View Slide

  16. 2. ϢʔεέʔεͷςετΛॻ͘
    @Autowired
    UserRegisterService service;
    def "ར༻ऀΞΧ΢ϯτͷ৽نొ࿥"() {
    given:
    def newUser = new User();
    when: "ొ࿥͢Δ"
    service.register(newUser);
    then: "ొ࿥Ͱ͖Δ"
    noExceptionThrown();
    }

    View Slide

  17. 3. ϢʔεέʔεΛ࣮૷͢Δ
    @Service
    public class UserRegisterService {
    @Autowired
    UserRepository repository;
    public void register(User user) {
    repository.register(user);
    }
    }

    View Slide

  18. 4. σʔλιʔεͷ࣮૷
    public interface UserRepository {
    void register(User user);
    }
    @Repository
    public class UserDataSource implements UserRepository {
    //...ུ
    }

    View Slide

  19. 5. ϓϨθϯςʔγϣϯͷ࣮૷
    @Controller
    public class UserRegisterController {
    //ొ࿥ը໘ͷදࣔ
    //ొ࿥
    }
    Ϣʔβʔొ࿥



    View Slide

  20. ͜ͷঢ়ଶͰ͸εοΧ
    εΧʹݟ͑Δ…

    View Slide

  21. ͦΕͰ΋࠷ॳʹ͜ͷ
    ঢ়ଶͰಈ͔͢͜ͱΛ
    ໨ࢦ͢

    View Slide

  22. ͦͯ͜͠ͷʮಈ͘ঢ়ଶʯΛ
    ʮҡ࣋ʯ͠ͳ͕Β2ʙ5·ͰΛ܁Γฦ͢

    View Slide

  23. ʮಈ͔ͳ͍ঢ়ଶʯ
    = ϑΟʔυόοΫ·Ͱ͕௕͍

    View Slide

  24. ʮಈ͘ঢ়ଶʯ
    = ϑΟʔυόοΫ·Ͱ͕୹͍

    View Slide

  25. ಘΒΕΔϑΟʔυόοΫ

    View Slide

  26. 1. ू໿ϧʔτͷ࣮૷
    4 ͜ͷ࣌఺Ͱ͸ͳʹ΋ϑΟʔυόοΫ͕ͳ͍ɻ

    View Slide

  27. 2. ςετΛॻ͘
    4 ॳճͷϑΟʔυόοΫ͸΄΅ͳ͍
    4 Ϣʔεέʔεͷҙຯ͕ϝιου໊ʹݱΕΔ͔ʁ
    ͱ͔
    4 Πϯελϯεੜ੒͸newͰྑ͍Μ͚ͩͬʁԿ͕
    ඞཁʹͳΔΜ͚ͩͬʁ
    ͱ͔࣮૷ͷࢦ਑Έ͍ͨͳؾ͖ͮ͸݁ߏ͋Δ

    View Slide

  28. 3. ϢʔεέʔεΛ࣮૷
    4 ॳճͷϑΟʔυόοΫ͸΄΅ͳ͍
    4 ͜͜ͰϞσϧͷ࢖͍উख͕Θ͔Δ
    4 Ϣʔεέʔε͕ෳࡶԽͯ͘͠Δͱۀ຿஌͕ࣝᷓ
    Εग़ͯ͠·͏ࣄ͕ଟ͍

    View Slide

  29. 4. σʔλɾιʔε૚ͷ࣮૷
    4 DB͔ΒͷϑΟʔυόοΫ
    4 ͜͜΋࠷ॳ͸ϑΟʔυόοΫ͸ͳ͍
    4 Կ͔͋Δ৔߹͸ϞσϧʹͱͬͯϚΠφεͷϑ
    ΟʔυόοΫʹͳΓ͕ͪ...
    4 Ͱ΋σʔλͷϥΠϑαΠΫϧΛͲ͏͢ΔΜ
    ͚ͩͬʁͱ͔ͦ͏͍͏ؾ෇͖͸͋Δ

    View Slide

  30. 5. ϓϨθϯςʔγϣϯ૚ͷ࣮૷
    4 UI͔ΒͷϑΟʔυόοΫ
    4 ࠷ॳͷঢ়ଶͰ͸ͦΜͳʹϑΟʔυόοΫ͸
    ͳ͍
    4 Ϟσϧʹߏ଄͕ग़ͯ͘ΔͱɺͦΕΛHTML
    ʹ൓өͤ͞Δͱ͖ʹҧ࿨ײΛײͨ͡Γ
    4 ϓϩάϥϚʔҎ֎ͷਓ͔ΒϑΟʔυόοΫ
    ͕΋Β͑Δ <-ॏཁ

    View Slide

  31. ίʔυ͔Β͸ಘΒΕͳ͍΋ͷ
    4 ू໿Λލ͙၆ᛌࢹ఺͔Βͷҧ࿨ײ΍ෆ੔߹
    ※ਂ͍Ϟσϧʹ౸ୡ͢Δʹ͸ඞཁʹࢥ͑Δ
    ͜͜͸໛ࡧத
    4 શମΛ௨͢γφϦΦςετΛॻ͍͓ͯ͘ͱ͔
    4 Ϗϧυ͢ΔͱԿ͔ਤΛੜ੒͢Δͱ͔

    View Slide

  32. ॏཁͳ͜ͱ

    View Slide

  33. ϓϩάϥϚʔҎ֎ͷਓ͔Β
    ϑΟʔυόοΫ͕΋Β͑Δঢ়ଶΛ
    ૣ͘࡞ͬͯҡ࣋͢Δࣄ

    View Slide

  34. ࠷ॳ͸ශ݂঱Ͱ΋ྑ͍
    ࿙ΕͰͨۀ຿஌ࣝΛޙ͔ΒͰ΋
    υϝΠϯϞσϧʹ໭ͤΔΑ͏ʹ࡞Δ

    View Slide

  35. ։ൃऀ͸ۀ຿஌ࣝΛϞσϧ
    ʹڽू͍ͤͯ͘͞աఔͰͦ
    ͷυϝΠϯʹର͢ΔཧղΛ
    ਂΊΔ

    View Slide

  36. ͦΕ͕ਂ͍Ϟσϧ΁ͷ଍͕
    ͔ΓʹͳΔ

    View Slide

  37. ؓ࿩ٳ୊

    View Slide

  38. ϚΠϒʔϜ(ࢮޠ?)

    View Slide

  39. ෳ਺ͷू໿Λࢀর͢Δू໿ϧʔτͷ෮ݩ

    View Slide

  40. ྫ͑͹
    ޏ༻อݥՃೖ৚݅ͱ͍͏ू໿ϧʔτΛ෮ݩ͍ͨ͠
    4 Ұिؒͷबۀ͕࣌ؒ߹ܭ20࣌ؒҎ্
    4 Ұϲ݄ͷबۀ͕࣌ؒ߹ܭ87࣌ؒҎ্
    4 बۀظ͕ؒ31೔Ҏ্
    4 னֶؒੜͰ͸ͳ͍
    4 ޏ༻։࢝࣌఺Ͱ65ࡀະຬ

    View Slide

  41. ඞཁͳଞͷू໿
    * ඃޏ༻ऀͷۈ຿৚݅
    Ұिؒ͋ͨΓͷबۀ࣌ؒ
    Ұϲ݄͋ͨΓͷबۀ࣌ؒ
    * ඃޏ༻ऀͷݸਓ৘ใ
    னֶؒੜ͔Ͳ͏͔
    ೥ྸ

    View Slide

  42. Ͳ͏͍͏࣮૷͕ߟ͑ΒΕΔ͔ʁ
    1. ΞϓϦέʔγϣϯαʔϏεͰ
    ଞͷू໿ͷαʔϏεΛݺͿʁ
    2. ޏ༻อݥՃೖ৚݅ͷϦϙδτϦͰ
    ଞͷू໿ͷϦϙδτϦΛݺͿʁ
    3. SQLͰ·ͱΊͯऔͬͯ͘Δʁ

    View Slide

  43. ࠷ۙ͸1
    4 ΍͸Γू໿ͷϑΝαʔυ͸ΞϓϦέʔγϣϯα
    ʔϏεʹͳ͍ͬͯΔͷ͕ࣗવʹײ͡Δ
    4 ࢀর͍ͯ͠Δू໿͕ޙ͔ΒผίϯςΩετڥք
    ͷ΋ͷͰ͋Δࣄ͕Θ͔ͬͯผϓϩηεͰಈ࡞͢
    ΔαʔϏεͱͳΔՄೳੑ͕͋Δ఺

    View Slide

  44. ू໿ϧʔτΛ෦෼ߋ৽͢ΔࡍͷӬଓԽ

    View Slide

  45. େମ͸ू໿ͷҰ෦͚ͩͷߋ
    ৽ཁ͕݅ൃੜ͢Δ
    ͍ΘΏΔλεΫϕʔεUI͸ݦஶʹͦ͏ͳΔɻ
    ू໿ϧʔτ͕࣋ͭάϩʔόϧͳࣝผࢠΛม͑Δ͜
    ͱͳ͘ɺ ഑ԼͷΤϯςΟςΟ͚ͩΛߋ৽͢Δτϥ
    ϯβΫγϣϯΛߦ͏έʔε͕ଟ͍

    View Slide

  46. Ͳ͏͍͏࣮૷͕ߟ͑ΒΕΔ͔ʁ
    1. ৗʹ·Δ͝ͱӬଓԽ͢Δʁ
    2. ߋ৽͢Δ෦෼͚ͩͷߋ৽ґཔʢ̋̋RequestΦ
    ϒδΣΫτʣΛ࡞Δʁ
    3. ू໿͔ΒDomainEventΛൃߦͯ͠Subscriber
    ͕ӬଓԽʁ

    View Slide

  47. ৔߹ʹΑΓҧ͏͚Ͳେମ̎
    4 ·Δ͝ͱӬଓԽ
    4 DataSourceʹ౉ͨ࣌͠఺Ͱ෦෼ߋ৽Ͱ͋
    Δ͜ͱͷจ຺͕ࣦΘΕ͕ͪ
    4 DomainEvent
    4 ໌ࣔతͳϏδωεϓϩηε͕ΠϕϯτΛܦ
    ༝͢Δ͜ͱͰӅΕͯ͠·͍ͦ͏
    4 Ͱ΋ΦϒδΣΫτࢦ޲తʹ͸ʮ໰͍߹Θͤ
    Δͳ໋͡Ζʯ͕Ͱ͖ͦ͏Ͱ΍ͬͯΈ͍ͨ

    View Slide

  48. 2ͷ࣮૷ྫ
    ར༻ऀϞσϧ
    public class User { //ར༻ऀ
    UserId id;
    ...
    Profile profile; //ݸਓ৘ใ
    ResponsibleArea area; //୲౰ΤϦΞ
    }

    View Slide

  49. 2ͷ࣮૷ྫ(ଓ͖)
    ݸਓ৘ใߋ৽࣌ͷґཔΦϒδΣΫτ
    public class ProfileUpdateRequest {
    User old; //ू໿ϧʔτΛ๊͑ͯ͠·͏
    Profile update;
    }
    ୲౰ΤϦΞߋ৽࣌ͷґཔΦϒδΣΫτ
    public class ResponsibleAreaUpdateRequest {
    User old; //ू໿ϧʔτΛ๊͑ͯ͠·͏
    ResponsibleArea area;
    }

    View Slide

  50. 2ͷ࣮૷ྫ(ଓ͖)
    ར༻ऀαʔϏε
    @Service
    public UserRegisterService {
    @Autowired
    UserRepository repository;
    public void register(User user) {
    repository.register(user); //ొ࿥͸·Δͬͱ
    }
    public void updateProfile(ProfileUpdateRequest request) {
    repository.register(request); //ϦϙδτϦ͸ΠϕϯτͷੵΈ্͛
    }
    public void updateResponsibleArea(ResponsibleAreaRequest request) {
    repository.register(request); //ϦϙδτϦ͸ΠϕϯτͷੵΈ্͛
    }
    }

    View Slide

  51. 2ͷ࣮૷ྫ(ଓ͖)
    σʔλϕʔε

    View Slide

  52. View Slide

  53. 2ͷ࣮૷ྫ(ଓ͖)
    Πϛϡʔλϒϧσʔλ
    4 Πϕϯτσʔλ͸ॻ͖׵͑ͳ͍
    4 ࠷৽Ϩίʔυͷ؅ཧ͚ͩΛߦ͏
    ར఺
    4 ӨڹൣғͷہॴԽ
    4 τϥϯβΫγϣϯʹཔΒͳͯ͘ྑ͍

    View Slide

  54. 1:N໰୊ͷղ͖ํ
    ྫɿٻਓ(1)ʹඥͮ͘஍Ҭ(N)͕͋Δ৔߹ʹɺٻਓ
    ҰཡΛऔಘ͢Δɻ
    1. SQLͰjoinͯ͠MyBatisͷResultMapͳͲͰ
    ্ख͘ٵऩͯ͠औಘ͢Δ
    2. JavaଆͰผ్औಘͯ͠ޙ͔ΒJoin͢Δɻ

    View Slide

  55. ࠷ۙ͸ՄೳͰ͋Ε͹2
    4 StreamAPIͷԸܙͰผʑʹऔಘ &
    GroupingBy & Ϛʔδ ͕؆୯
    4 Ͱ΋ϝϞϦޮ཰͸ѱ͍ͷͰStreamΛฦͯ͘͠
    ΕΔDomaʹ΋஫໨͍ͯ͠Δ

    View Slide

  56. ೖྗ஋ͷλΠϓϛεϚον໰୊
    ྫ: ಺෦ܕ͕IntegerͳͲ਺஋ܕͰ͋Δ৔߹
    4 ߲໨୯ҐͷόϦϡʔΦϒδΣΫτͷ಺෦ܕΛจ
    ࣈྻʹ͢Δ͜ͱͰղܾ͍ͯ͠Δ
    4 ͦ΋ͦ΋߲໨୯ҐͷܕΛ࡞ΔͷͰ಺෦ܕ͸ԿͰ
    ΋ྑ͍
    4 λΠϓϛεϚονΤϥʔͱೖྗݕূΤϥʔͷग़
    ΔλΠϛϯάͰফ໣͢Δ͙Β͍ͳΒจࣈྻͰ

    View Slide

  57. ࠷ۙͷٕज़త՝୊

    View Slide

  58. ࠷ۙͷٕज़త՝୊
    ೖྗ஋ͷόΠϯσΟϯά
    4 setter࡞Γͨ͘ͳ͍

    View Slide

  59. ࠷ۙͷٕज़త՝୊
    ೖྗͷݕূ
    4 λΠϛϯά͸UI૚ͷίϯτϩʔϥ͡Όͳͯ͘α
    ʔϏεͰ
    ※ݕূҧ൓Λྫ֎ͱͯ͠͠·͑͹εοΩϦ͢Δ
    4 એݴ͸Ϟσϧʹڽू͍ͤͨ͞
    ※BeanValidationͰ͋Δఔ౓͸࣮ݱ͍ͯ͠Δ

    View Slide

  60. ࠷ۙͷٕज़త՝୊
    ηΩϡϦςΟ
    4 ηΩϡϦςΟʹؔ͢Δ஌͕ࣝڽू͠ʹ͍͘
    4 Ϟσϧʹڽू্ͤͨ͞Ͱԣஅతʹద༻͍ͨ͠

    View Slide

  61. ࠷ۙͷٕज़త՝୊
    DB͔Βͷू໿ϧʔτ෮ݩ
    4 ςʔϒϧϚούʔͰ͸೉͍͠
    4 SQLͷ݁ՌηοτΛϚοϐϯά͍ͨ͠

    View Slide

  62. DB͔Βͷू໿ϧʔτ෮ݩ(ଓ͖ʣ
    ݱ࣌఺Ͱ૬ੑͷྑͦ͞͏ͳϑϨʔϜϫʔΫ
    4 Doma
    DomaͰݴ͏EntityΛ௚઀DomainϞσϧʹ͢
    Δ͜ͱ͸ͳ͍͚Ͳɺ DomaͷEntity͔Βू໿
    ϧʔτΛ෮ݩͬͯͷ͸༗Γͳؾ͕͍ͯ͠Δ
    4 SpringͷJdbcTemplate
    ͍Ζ͍Ζͱ͔ͿͤΕ͹͋Δ͍͸…

    View Slide

  63. DB͔Βͷू໿ϧʔτ෮ݩ(ଓ͖ʣ
    ΄͍͠ػೳ
    4 ࣮ߦίϯςΩετʹ͋ΔΦϒδΣΫτΛผͷΦ
    ϒδΣΫτͷϑΟʔϧυʹϚοϐϯά
    4 ϑΝΫτϦϝιουʹରԠ
    4 StreamΛฦ͢API
    4 ୯߲໨ValueObjectʹରԠ

    View Slide

  64. Ҏ্ɺ࠷ۙͷٕज़త՝୊Ͱͨ͠

    View Slide

  65. ࠷ޙʹ

    View Slide

  66. υϝΠϯϞσϧʹؔ৺ࣄΛຊ౰ʹڽूͤ͞Δʹ͸
    ·ͩ·ٕͩज़తͳ՝୊΍ඞཁͳϊ΢ϋ΢͕
    ͨ͘͞Μ͋Γ·͢ʂ
    ָ͠ΜͰ͍͖·͠ΐ͏ʂ

    View Slide

  67. ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

    View Slide

  68. View Slide