Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ドメイン駆動設計を軽快に実践するための工夫
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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.9k
普段使いのDDD
haljik
21
9.5k
実録Spring MVC
haljik
10
5k
Other Decks in Technology
See All in Technology
構造で守らせる データ・法務・セキュリティ・開発チームとつくる AI時代のデータガバナンスとデータ基盤のリアル
legalontechnologies
PRO
1
510
React改造してみた
tsukina_7mochi
0
160
AWSセキュリティで活用するAI機能
cmusudakeisuke
1
300
Agent × Maestro で始める モバイル E2E 端末準備からテスト実行・結果確認まで
sansantech
PRO
0
210
DevelopersIO 2026 Tokyo 現時点の衛星通信サービスの現状を整理してみる
maroon1st
0
310
Adversary Infrastructure Hunting101
disconinja
0
160
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
170
Gemini Intelligence 入門 ― AppFunctions と Gemini Nano
takuroabe
0
370
導入から定着へ ~コーディングエージェントを日常業務に組み込む実践知~
yukisakai1225
0
230
ガチで放置できるClaude Code実行環境の作り方.pdf
lamaglama39
5
9.7k
AIで選択肢が広がった組織設計の理想と現実
konifar
12
4.9k
BacklogのRAG 今ならこう作る - S3 Vectorsと自前パイプラインの勘所
revsystem
0
130
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
516
110k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Ethics towards AI in product and experience design
skipperchong
2
440
Google's AI Overviews - The New Search
badams
0
1.6k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
540
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Visualization
eitanlees
153
17k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.5k
How to Ace a Technical Interview
jacobian
280
24k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
So, you think you're a good person
axbom
PRO
2
2.2k
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