Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

83579d17f780c8712ac17fa800efbbbb?s=47 haljik
March 05, 2016

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

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

83579d17f780c8712ac17fa800efbbbb?s=128

haljik

March 05, 2016
Tweet

More Decks by haljik

Other Decks in Technology

Transcript

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

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

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

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

  5. എܠ 4 WebΞϓϦέʔγϣϯ։ൃ 4 Java 4 Spring Boot 4 Thymeleaf

    4 MyBatis H2database & PostgreSQL 4 ։ൃϝϯόʔ͸࠷େͰ΋10ਓ͙Β͍ͷن໛ײ
  6. ࢲ͕ࢥ͏ॏް͞ 4 ϞσϧਤΛ͔ͬ͠Γॻ͘ 4 ৗʹϞσϧਤΛߋ৽͢Δ 4 ϞσϧਤͰυϝΠϯΤΩεύʔτͱձ࿩

  7. ॏް͞ͷ໰୊ 4 ϞσϧਤͰձ࿩ͯ͘͠ΕΔυϝΠϯΤΩεύʔ τ͍ͬͯΔͷ? 4 ී௨υϝΠϯΤΩεύʔτͬͯ๩͍͠ਓͩΑ Ͷ? 4 ͦ΋ͦ΋υϝΠϯΤΩεύʔτ͕͍ͳ͍ 4

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

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

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

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

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

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

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

    } public class UserId { String value; }
  16. 2. ϢʔεέʔεͷςετΛॻ͘ @Autowired UserRegisterService service; def "ར༻ऀΞΧ΢ϯτͷ৽نొ࿥"() { given: def

    newUser = new User(); when: "ొ࿥͢Δ" service.register(newUser); then: "ొ࿥Ͱ͖Δ" noExceptionThrown(); }
  17. 3. ϢʔεέʔεΛ࣮૷͢Δ @Service public class UserRegisterService { @Autowired UserRepository repository;

    public void register(User user) { repository.register(user); } }
  18. 4. σʔλιʔεͷ࣮૷ public interface UserRepository { void register(User user); }

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

    <h1>Ϣʔβʔొ࿥<h1> <form th:action="@{/users/}" method="post"> <input type="submit" value="ొ࿥͢Δ"/> </form>
  20. ͜ͷঢ়ଶͰ͸εοΧ εΧʹݟ͑Δ…

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

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

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

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

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

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

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

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

  29. 4. σʔλɾιʔε૚ͷ࣮૷ 4 DB͔ΒͷϑΟʔυόοΫ 4 ͜͜΋࠷ॳ͸ϑΟʔυόοΫ͸ͳ͍ 4 Կ͔͋Δ৔߹͸ϞσϧʹͱͬͯϚΠφεͷϑ ΟʔυόοΫʹͳΓ͕ͪ... 4

    Ͱ΋σʔλͷϥΠϑαΠΫϧΛͲ͏͢ΔΜ ͚ͩͬʁͱ͔ͦ͏͍͏ؾ෇͖͸͋Δ
  30. 5. ϓϨθϯςʔγϣϯ૚ͷ࣮૷ 4 UI͔ΒͷϑΟʔυόοΫ 4 ࠷ॳͷঢ়ଶͰ͸ͦΜͳʹϑΟʔυόοΫ͸ ͳ͍ 4 Ϟσϧʹߏ଄͕ग़ͯ͘ΔͱɺͦΕΛHTML ʹ൓өͤ͞Δͱ͖ʹҧ࿨ײΛײͨ͡Γ

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

  32. ॏཁͳ͜ͱ

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

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

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

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

  37. ؓ࿩ٳ୊

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

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

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

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

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

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

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

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

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

  47. ৔߹ʹΑΓҧ͏͚Ͳେମ̎ 4 ·Δ͝ͱӬଓԽ 4 DataSourceʹ౉ͨ࣌͠఺Ͱ෦෼ߋ৽Ͱ͋ Δ͜ͱͷจ຺͕ࣦΘΕ͕ͪ 4 DomainEvent 4 ໌ࣔతͳϏδωεϓϩηε͕ΠϕϯτΛܦ

    ༝͢Δ͜ͱͰӅΕͯ͠·͍ͦ͏ 4 Ͱ΋ΦϒδΣΫτࢦ޲తʹ͸ʮ໰͍߹Θͤ Δͳ໋͡Ζʯ͕Ͱ͖ͦ͏Ͱ΍ͬͯΈ͍ͨ
  48. 2ͷ࣮૷ྫ ར༻ऀϞσϧ public class User { //ར༻ऀ UserId id; ...

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

    update; } ୲౰ΤϦΞߋ৽࣌ͷґཔΦϒδΣΫτ public class ResponsibleAreaUpdateRequest { User old; //ू໿ϧʔτΛ๊͑ͯ͠·͏ ResponsibleArea area; }
  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); //ϦϙδτϦ͸ΠϕϯτͷੵΈ্͛ } }
  51. 2ͷ࣮૷ྫ(ଓ͖) σʔλϕʔε

  52. None
  53. 2ͷ࣮૷ྫ(ଓ͖) Πϛϡʔλϒϧσʔλ 4 Πϕϯτσʔλ͸ॻ͖׵͑ͳ͍ 4 ࠷৽Ϩίʔυͷ؅ཧ͚ͩΛߦ͏ ར఺ 4 ӨڹൣғͷہॴԽ 4

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

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

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

    λΠϓϛεϚονΤϥʔͱೖྗݕূΤϥʔͷग़ ΔλΠϛϯάͰফ໣͢Δ͙Β͍ͳΒจࣈྻͰ
  57. ࠷ۙͷٕज़త՝୊

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

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

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

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

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

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

    ୯߲໨ValueObjectʹରԠ
  64. Ҏ্ɺ࠷ۙͷٕज़త՝୊Ͱͨ͠

  65. ࠷ޙʹ

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

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

  68. None