Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ドメイン駆動設計を軽快に実践するための工夫
Search
haljik
March 05, 2016
Technology
7.7k
22
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ドメイン駆動設計を軽快に実践するための工夫
DDD関西.java 3/5(土) 発表資料
haljik
March 05, 2016
More Decks by haljik
See All by haljik
develop-with-domain-expert
haljik
1
1.2k
ドメイン駆動設計の紹介
haljik
0
140
Isolating-the-domainの紹介
haljik
3
1.8k
普段使いのDDD
haljik
21
9.5k
実録Spring MVC
haljik
10
5k
Other Decks in Technology
See All in Technology
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
『自分で判断できるか』を基準に、プロダクトのハンズオン研修でAI利用の線を引いてみた / Where We Drew the Line on AI in Hands-on Training
honyanya
0
430
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
130
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.3k
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
20k
AI駆動開発はどこまで来たのか? ファインディの最新実態調査で読み解く現在地 Devin Con Tokyo
akiratom
4
1.9k
医療の現場を変革に挑戦した半年間の軌跡 - PythonとAIで現場を変える / From Code to Care
soudai
PRO
1
640
サーバー常駐型の 簡易障害調査AI エージェントを作ってみた話
masayoshi
1
290
EUDIWの枠組みを出発点に民間エコシステムの在り方を考える(OAuth/OIDC Numa (Immersion) Workshop 2026)
oidfj
PRO
0
340
Cloudflare製品を活用した AIガバナンス実践入門 / AI governance with Cloudflare Service
delta_tech
1
120
ハッカソンで入賞した話 @ Findy LT
asari194617
0
1.5k
500名弱規模の組織のPythonプロジェクト(dbt) をどう管理するか?
hiracky16
0
360
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
180
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
220
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
Side Projects
sachag
455
43k
The browser strikes back
jonoalderson
0
1.6k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
410
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Deep Space Network (abreviated)
tonyrice
0
270
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Being A Developer After 40
akosma
91
590k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Transcript
υϝΠϯۦಈઃܭΛ ܰշʹ࣮ફ͢ΔͨΊ ͷ 2016/3/4 ؔDDD.java @haljik
ࣗݾհ Տ্ ࢘(͔Θ͔Έ ͍ͤ͡ʣ @haljik ϑϦʔϥϯεJavaΤϯδχΞ 4 ؔDDD.javaओ࠵ 4 ؔJavaΤϯδχΞͷձϝϯόʔ
4 DDDΞϥΠΞϯεൃىਓϝϯόʔ
ࠓ͢͜ͱ 4 ॏް͞ͱܰշ͞ 4 ϞσϧͷϑΟʔυόοΫɾϧʔϓ 4 ϚΠϒʔϜ 4 ࠷ۙͷ՝
ࠓ͞"ͳ͍"͜ͱ 4 ϓϩδΣΫτॳظͷ׆ಈ ͓͓ΑͦͷۀΠϝʔδɺγεςϜͷશମ ૾ɺࠎ֨ͱͳΔ༻ޠΠϯϓοτࡁΈͰɺ ͋Δఔͷूϧʔτ͕ݟ͍͑ͯΔ͙Β͍ͷঢ় ଶΛલఏͱ͓ͯ͠ฉ͖͍ͩ͘͞ɻ
എܠ 4 WebΞϓϦέʔγϣϯ։ൃ 4 Java 4 Spring Boot 4 Thymeleaf
4 MyBatis H2database & PostgreSQL 4 ։ൃϝϯόʔ࠷େͰ10ਓ͙Β͍ͷنײ
ࢲ͕ࢥ͏ॏް͞ 4 ϞσϧਤΛ͔ͬ͠Γॻ͘ 4 ৗʹϞσϧਤΛߋ৽͢Δ 4 ϞσϧਤͰυϝΠϯΤΩεύʔτͱձ
ॏް͞ͷ 4 ϞσϧਤͰձͯ͘͠ΕΔυϝΠϯΤΩεύʔ τ͍ͬͯΔͷ? 4 ී௨υϝΠϯΤΩεύʔτ͍ͬͯ͠ਓͩΑ Ͷ? 4 ͦͦυϝΠϯΤΩεύʔτ͕͍ͳ͍ 4
ϞσϧਤΛৗʹ࠷৽ʹߋ৽͢Δ࣌ؒ͋ΔͳΒί ʔυॻ͖͍ͨ
ࢲ͕ࢥ͏ܰշ͞ 4 ݪଇίʔυϑΝʔετ 4 ϞσϧਤΛؚΉυΩϡϝϯτྨεφοϓγϣ οτͱͯ͠ॻ͘͜ͱ͋Δ 4 υϝΠϯΤΩεύʔτΛͨͳ͍ 4 ސ٬ɺར༻ऀ͔ΒͷϑΟʔυόοΫಈ͘UI͔
ΒͰྑ͠ͱ͢Δ
ཁϞσϧΛચ࿅͍ͤͯ͞ ͨ͘Ίͷૉૣ͍ϑΟʔυό οΫϧʔϓΛͲͷΑ͏ʹߏங ͢Δͷ͔ 4 ࣗୡͰճͤΔϧʔϓࣗୡͰճ͢ 4 ૣ͘খ͘͞ճ͢
۩ମతʹͲ͏͍ͯ͠Δ͔
ϑΟʔυόοΫɾϧʔϓΛ ࢧ͑Δ׆ಈͷશମ૾
None
ྫɿ৽͍͠ूϧʔτͱ͠ ͯʮར༻ऀʯΛՃ͢Δ
લఏͱͳ͍ͬͯΔ։ൃελΠϧ 4 ूϧʔτ͕։ൃͷجຊ୯Ґ 4 ूϧʔτʹରͯ͠Ϣʔεέʔε͕͋Δ 4 ྫ͑ར༻ऀͩͱɺ৽نొɺϓϩϑΟʔ ϧมߋ etc.
1. ूϧʔτͷ࣮ 4 ूͱͦͷID͙Β͍ public class User { UserId id;
} public class UserId { String value; }
2. ϢʔεέʔεͷςετΛॻ͘ @Autowired UserRegisterService service; def "ར༻ऀΞΧϯτͷ৽نొ"() { given: def
newUser = new User(); when: "ొ͢Δ" service.register(newUser); then: "ొͰ͖Δ" noExceptionThrown(); }
3. ϢʔεέʔεΛ࣮͢Δ @Service public class UserRegisterService { @Autowired UserRepository repository;
public void register(User user) { repository.register(user); } }
4. σʔλιʔεͷ࣮ public interface UserRepository { void register(User user); }
@Repository public class UserDataSource implements UserRepository { //...ུ }
5. ϓϨθϯςʔγϣϯͷ࣮ @Controller public class UserRegisterController { //ొը໘ͷදࣔ //ొ }
<h1>Ϣʔβʔొ<h1> <form th:action="@{/users/}" method="post"> <input type="submit" value="ొ͢Δ"/> </form>
͜ͷঢ়ଶͰεοΧ εΧʹݟ͑Δ…
ͦΕͰ࠷ॳʹ͜ͷ ঢ়ଶͰಈ͔͢͜ͱΛ ࢦ͢
ͦͯ͜͠ͷʮಈ͘ঢ়ଶʯΛ ʮҡ࣋ʯ͠ͳ͕Β2ʙ5·ͰΛ܁Γฦ͢
ʮಈ͔ͳ͍ঢ়ଶʯ = ϑΟʔυόοΫ·Ͱ͕͍
ʮಈ͘ঢ়ଶʯ = ϑΟʔυόοΫ·Ͱ͕͍
ಘΒΕΔϑΟʔυόοΫ
1. ूϧʔτͷ࣮ 4 ͜ͷ࣌ͰͳʹϑΟʔυόοΫ͕ͳ͍ɻ
2. ςετΛॻ͘ 4 ॳճͷϑΟʔυόοΫ΄΅ͳ͍ 4 Ϣʔεέʔεͷҙຯ͕ϝιου໊ʹݱΕΔ͔ʁ ͱ͔ 4 ΠϯελϯεੜnewͰྑ͍Μ͚ͩͬʁԿ͕ ඞཁʹͳΔΜ͚ͩͬʁ
ͱ͔࣮ͷࢦΈ͍ͨͳؾ͖ͮ݁ߏ͋Δ
3. ϢʔεέʔεΛ࣮ 4 ॳճͷϑΟʔυόοΫ΄΅ͳ͍ 4 ͜͜ͰϞσϧͷ͍উख͕Θ͔Δ 4 Ϣʔεέʔε͕ෳࡶԽͯ͘͠Δͱۀ͕ࣝᷓ Εग़ͯ͠·͏ࣄ͕ଟ͍
4. σʔλɾιʔεͷ࣮ 4 DB͔ΒͷϑΟʔυόοΫ 4 ͜͜࠷ॳϑΟʔυόοΫͳ͍ 4 Կ͔͋Δ߹ϞσϧʹͱͬͯϚΠφεͷϑ ΟʔυόοΫʹͳΓ͕ͪ... 4
ͰσʔλͷϥΠϑαΠΫϧΛͲ͏͢ΔΜ ͚ͩͬʁͱ͔ͦ͏͍͏ؾ͖͋Δ
5. ϓϨθϯςʔγϣϯͷ࣮ 4 UI͔ΒͷϑΟʔυόοΫ 4 ࠷ॳͷঢ়ଶͰͦΜͳʹϑΟʔυόοΫ ͳ͍ 4 Ϟσϧʹߏ͕ग़ͯ͘ΔͱɺͦΕΛHTML ʹөͤ͞Δͱ͖ʹҧײΛײͨ͡Γ
4 ϓϩάϥϚʔҎ֎ͷਓ͔ΒϑΟʔυόοΫ ͕Β͑Δ <-ॏཁ
ίʔυ͔ΒಘΒΕͳ͍ͷ 4 ूΛލ͙၆ᛌࢹ͔Βͷҧײෆ߹ ※ਂ͍Ϟσϧʹ౸ୡ͢Δʹඞཁʹࢥ͑Δ ͜͜ࡧத 4 શମΛ௨͢γφϦΦςετΛॻ͍͓ͯ͘ͱ͔ 4 Ϗϧυ͢ΔͱԿ͔ਤΛੜ͢Δͱ͔
ॏཁͳ͜ͱ
ϓϩάϥϚʔҎ֎ͷਓ͔Β ϑΟʔυόοΫ͕Β͑Δঢ়ଶΛ ૣ͘࡞ͬͯҡ࣋͢Δࣄ
࠷ॳශ݂Ͱྑ͍ ࿙ΕͰͨۀࣝΛޙ͔ΒͰ υϝΠϯϞσϧʹͤΔΑ͏ʹ࡞Δ
։ൃऀۀࣝΛϞσϧ ʹڽू͍ͤͯ͘͞աఔͰͦ ͷυϝΠϯʹର͢ΔཧղΛ ਂΊΔ
ͦΕ͕ਂ͍Ϟσϧͷ͕ ͔ΓʹͳΔ
ؓٳ
ϚΠϒʔϜ(ࢮޠ?)
ෳͷूΛࢀর͢Δूϧʔτͷ෮ݩ
ྫ͑ ޏ༻อݥՃೖ݅ͱ͍͏ूϧʔτΛ෮ݩ͍ͨ͠ 4 Ұिؒͷबۀ͕࣌ؒ߹ܭ20࣌ؒҎ্ 4 Ұϲ݄ͷबۀ͕࣌ؒ߹ܭ87࣌ؒҎ্ 4 बۀظ͕ؒ31Ҏ্ 4 னֶؒੜͰͳ͍
4 ޏ༻։࢝࣌Ͱ65ࡀະຬ
ඞཁͳଞͷू * ඃޏ༻ऀͷۈ݅ Ұिؒ͋ͨΓͷबۀ࣌ؒ Ұϲ݄͋ͨΓͷबۀ࣌ؒ * ඃޏ༻ऀͷݸਓใ னֶؒੜ͔Ͳ͏͔ ྸ
Ͳ͏͍͏࣮͕ߟ͑ΒΕΔ͔ʁ 1. ΞϓϦέʔγϣϯαʔϏεͰ ଞͷूͷαʔϏεΛݺͿʁ 2. ޏ༻อݥՃೖ݅ͷϦϙδτϦͰ ଞͷूͷϦϙδτϦΛݺͿʁ 3. SQLͰ·ͱΊͯऔͬͯ͘Δʁ
࠷ۙ1 4 ΓूͷϑΝαʔυΞϓϦέʔγϣϯα ʔϏεʹͳ͍ͬͯΔͷ͕ࣗવʹײ͡Δ 4 ࢀর͍ͯ͠Δू͕ޙ͔ΒผίϯςΩετڥք ͷͷͰ͋Δࣄ͕Θ͔ͬͯผϓϩηεͰಈ࡞͢ ΔαʔϏεͱͳΔՄೳੑ͕͋Δ
ूϧʔτΛ෦ߋ৽͢ΔࡍͷӬଓԽ
େମूͷҰ෦͚ͩͷߋ ৽ཁ͕݅ൃੜ͢Δ ͍ΘΏΔλεΫϕʔεUIݦஶʹͦ͏ͳΔɻ ूϧʔτ͕࣋ͭάϩʔόϧͳࣝผࢠΛม͑Δ͜ ͱͳ͘ɺ ԼͷΤϯςΟςΟ͚ͩΛߋ৽͢Δτϥ ϯβΫγϣϯΛߦ͏έʔε͕ଟ͍
Ͳ͏͍͏࣮͕ߟ͑ΒΕΔ͔ʁ 1. ৗʹ·Δ͝ͱӬଓԽ͢Δʁ 2. ߋ৽͢Δ෦͚ͩͷߋ৽ґཔʢ̋̋RequestΦ ϒδΣΫτʣΛ࡞Δʁ 3. ू͔ΒDomainEventΛൃߦͯ͠Subscriber ͕ӬଓԽʁ
߹ʹΑΓҧ͏͚Ͳେମ̎ 4 ·Δ͝ͱӬଓԽ 4 DataSourceʹͨ࣌͠Ͱ෦ߋ৽Ͱ͋ Δ͜ͱͷจ຺͕ࣦΘΕ͕ͪ 4 DomainEvent 4 ໌ࣔతͳϏδωεϓϩηε͕ΠϕϯτΛܦ
༝͢Δ͜ͱͰӅΕͯ͠·͍ͦ͏ 4 ͰΦϒδΣΫτࢦతʹʮ͍߹Θͤ Δͳ໋͡Ζʯ͕Ͱ͖ͦ͏ͰͬͯΈ͍ͨ
2ͷ࣮ྫ ར༻ऀϞσϧ public class User { //ར༻ऀ UserId id; ...
Profile profile; //ݸਓใ ResponsibleArea area; //୲ΤϦΞ }
2ͷ࣮ྫ(ଓ͖) ݸਓใߋ৽࣌ͷґཔΦϒδΣΫτ public class ProfileUpdateRequest { User old; //ूϧʔτΛ๊͑ͯ͠·͏ Profile
update; } ୲ΤϦΞߋ৽࣌ͷґཔΦϒδΣΫτ public class ResponsibleAreaUpdateRequest { User old; //ूϧʔτΛ๊͑ͯ͠·͏ ResponsibleArea area; }
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); //ϦϙδτϦΠϕϯτͷੵΈ্͛ } }
2ͷ࣮ྫ(ଓ͖) σʔλϕʔε
None
2ͷ࣮ྫ(ଓ͖) Πϛϡʔλϒϧσʔλ 4 Πϕϯτσʔλॻ͖͑ͳ͍ 4 ࠷৽Ϩίʔυͷཧ͚ͩΛߦ͏ ར 4 ӨڹൣғͷہॴԽ 4
τϥϯβΫγϣϯʹཔΒͳͯ͘ྑ͍
1:Nͷղ͖ํ ྫɿٻਓ(1)ʹඥͮ͘Ҭ(N)͕͋Δ߹ʹɺٻਓ ҰཡΛऔಘ͢Δɻ 1. SQLͰjoinͯ͠MyBatisͷResultMapͳͲͰ ্ख͘ٵऩͯ͠औಘ͢Δ 2. JavaଆͰผ్औಘͯ͠ޙ͔ΒJoin͢Δɻ
࠷ۙՄೳͰ͋Ε2 4 StreamAPIͷԸܙͰผʑʹऔಘ & GroupingBy & Ϛʔδ ͕؆୯ 4 ͰϝϞϦޮѱ͍ͷͰStreamΛฦͯ͘͠
ΕΔDomaʹ͍ͯ͠Δ
ೖྗͷλΠϓϛεϚον ྫ: ෦ܕ͕IntegerͳͲܕͰ͋Δ߹ 4 ߲୯ҐͷόϦϡʔΦϒδΣΫτͷ෦ܕΛจ ࣈྻʹ͢Δ͜ͱͰղܾ͍ͯ͠Δ 4 ߲ͦͦ୯ҐͷܕΛ࡞ΔͷͰ෦ܕԿͰ ྑ͍ 4
λΠϓϛεϚονΤϥʔͱೖྗݕূΤϥʔͷग़ ΔλΠϛϯάͰফ͢Δ͙Β͍ͳΒจࣈྻͰ
࠷ۙͷٕज़త՝
࠷ۙͷٕज़త՝ ೖྗͷόΠϯσΟϯά 4 setter࡞Γͨ͘ͳ͍
࠷ۙͷٕज़త՝ ೖྗͷݕূ 4 λΠϛϯάUIͷίϯτϩʔϥ͡Όͳͯ͘α ʔϏεͰ ※ݕূҧΛྫ֎ͱͯ͠͠·͑εοΩϦ͢Δ 4 એݴϞσϧʹڽू͍ͤͨ͞ ※BeanValidationͰ͋Δఔ࣮ݱ͍ͯ͠Δ
࠷ۙͷٕज़త՝ ηΩϡϦςΟ 4 ηΩϡϦςΟʹؔ͢Δ͕ࣝڽू͠ʹ͍͘ 4 Ϟσϧʹڽू্ͤͨ͞Ͱԣஅతʹద༻͍ͨ͠
࠷ۙͷٕज़త՝ DB͔Βͷूϧʔτ෮ݩ 4 ςʔϒϧϚούʔͰ͍͠ 4 SQLͷ݁ՌηοτΛϚοϐϯά͍ͨ͠
DB͔Βͷूϧʔτ෮ݩ(ଓ͖ʣ ݱ࣌Ͱ૬ੑͷྑͦ͞͏ͳϑϨʔϜϫʔΫ 4 Doma DomaͰݴ͏EntityΛDomainϞσϧʹ͢ Δ͜ͱͳ͍͚Ͳɺ DomaͷEntity͔Βू ϧʔτΛ෮ݩͬͯͷ༗Γͳؾ͕͍ͯ͠Δ 4 SpringͷJdbcTemplate
͍Ζ͍Ζͱ͔ͿͤΕ͋Δ͍…
DB͔Βͷूϧʔτ෮ݩ(ଓ͖ʣ ΄͍͠ػೳ 4 ࣮ߦίϯςΩετʹ͋ΔΦϒδΣΫτΛผͷΦ ϒδΣΫτͷϑΟʔϧυʹϚοϐϯά 4 ϑΝΫτϦϝιουʹରԠ 4 StreamΛฦ͢API 4
୯߲ValueObjectʹରԠ
Ҏ্ɺ࠷ۙͷٕज़త՝Ͱͨ͠
࠷ޙʹ
υϝΠϯϞσϧʹؔ৺ࣄΛຊʹڽूͤ͞Δʹ ·ͩ·ٕͩज़తͳ՝ඞཁͳϊϋ͕ ͨ͘͞Μ͋Γ·͢ʂ ָ͠ΜͰ͍͖·͠ΐ͏ʂ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ
None