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
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
1
430
AIは実装を速くする。では、私たちは何を今作るべきか?-立場を越えてリリースに向き合ったチーム開発の実践 / 20260801 Hiromi Nakaya and Naoki Takahashi
shift_evolve
PRO
3
450
toio・myCobotでフィジカルAIっぽいことを行うための検討(とりあえず調査) / フィジカルAI LT(IoTLTによる開催)
you
PRO
0
300
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
200
モバイルアプリ開発概論2026
recruitengineers
PRO
3
500
【CEDEC2026】『ウマ娘 プリティーダービー』 英語版のキャラクターの方言や口調をローカライズするための創造的アプローチ
cygames
PRO
1
200
もう一度考える SRE チームの作り方・育て方 / Rethinking SRE #1: Building and Growing SRE Teams
rrreeeyyy
6
1k
AI時代の強いチームの作り方
yuukiyo
25
16k
ラジオの科学
frievea
0
280
바이브풀 라이프
arawn
0
100
【CEDEC2026】グラフィックスエンジニアのためのニューラルシェーディング入門
cygames
PRO
0
120
20260801_スクフェス大阪
kgnkhkr
2
1.2k
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
690
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
My Coaching Mixtape
mlcsv
0
210
The untapped power of vector embeddings
frankvandijk
2
1.8k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
Exploring anti-patterns in Rails
aemeredith
3
460
Utilizing Notion as your number one productivity tool
mfonobong
4
520
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
340
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
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