Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
ドメイン駆動設計を軽快に実践するための工夫
haljik
March 05, 2016
Technology
22
7k
ドメイン駆動設計を軽快に実践するための工夫
DDD関西.java 3/5(土) 発表資料
haljik
March 05, 2016
Tweet
Share
More Decks by haljik
See All by haljik
develop-with-domain-expert
haljik
1
800
ドメイン駆動設計の紹介
haljik
0
65
Isolating-the-domainの紹介
haljik
3
1.2k
普段使いのDDD
haljik
21
8.3k
実録Spring MVC
haljik
10
4.1k
Other Decks in Technology
See All in Technology
tfcon-2022-cpp
cpp
5
4.9k
Power BIのモバイルと都 +1 / Tokyo
ishiayaya
0
140
組織でPower Virtual Agentsを導入するために知っておきたいこと
miyakemito
0
1.6k
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
0
580
LINEスタンプの実例紹介 小さく始める障害検知・対応・振り返りの 改善プラクティス
line_developers
PRO
3
1.3k
Spotify物理コントローラーがほしい
miso
0
140
Kubernetesの上に作る、統一されたマイクロサービス運用体験
tkuchiki
1
760
LINE WORKS API 2.0について
mmclsntr
0
100
AWSの基礎を学ぼうで学んだ9種類のDBを勝手にふりかえる
98lerr
2
720
1,000万人以上が利用する「家族アルバム みてね」のSRE組織は4年間でどのように作られてきたのか/SRE NEXT 2022
isaoshimizu
4
2.7k
技術広報の役割を定義してみた 2022年春
afroscript
3
2.4k
Puny to Powerful PostgreSQL Rails Apps
andyatkinson
PRO
0
250
Featured
See All Featured
Embracing the Ebb and Flow
colly
73
3.3k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
11
4.6k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
How STYLIGHT went responsive
nonsquared
85
3.9k
KATA
mclloyd
7
8.6k
A Modern Web Designer's Workflow
chriscoyier
689
180k
Rebuilding a faster, lazier Slack
samanthasiow
62
7.2k
BBQ
matthewcrist
74
7.9k
Code Reviewing Like a Champion
maltzj
506
37k
Building a Scalable Design System with Sketch
lauravandoore
447
30k
Building Better People: How to give real-time feedback that sticks.
wjessup
343
17k
Bash Introduction
62gerente
596
210k
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