$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ゲンバのクリーンアーキテクチャ - Scala play プロジェクト設計のお話 -
Search
Yad
March 26, 2016
Programming
15
4.6k
ゲンバのクリーンアーキテクチャ - Scala play プロジェクト設計のお話 -
2016/03/26 Developers.IO 2016 in Osaka #cmdevio2016 発表資料
Yad
March 26, 2016
Tweet
Share
More Decks by Yad
See All by Yad
Swift ABI Stability Manifestoを読む
usrnameu1
2
2.9k
Other Decks in Programming
See All in Programming
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
190
乱雑なコードの整理から学ぶ設計の初歩
masuda220
PRO
32
15k
AIと協働し、イベントソーシングとアクターモデルで作る後悔しないアーキテクチャ Regret-Free Architecture with AI, Event Sourcing, and Actors
tomohisa
5
16k
社内オペレーション改善のためのTypeScript / TSKaigi Hokuriku 2025
dachi023
1
290
dotfiles 式年遷宮 令和最新版
masawada
1
430
Level up your Gemini CLI - D&D Style!
palladius
1
150
大体よく分かるscala.collection.immutable.HashMap ~ Compressed Hash-Array Mapped Prefix-tree (CHAMP) ~
matsu_chara
1
190
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
140
251126 TestState APIってなんだっけ?Step Functionsテストどう変わる?
east_takumi
0
290
Atomics APIを知る / Understanding Atomics API
ssssota
1
240
ローターアクトEクラブ アメリカンナイト:川端 柚菜 氏(Japan O.K. ローターアクトEクラブ 会長):2720 Japan O.K. ロータリーEクラブ2025年12月1日卓話
2720japanoke
0
230
最新のDirectX12で使えるレイトレ周りの機能追加について
projectasura
0
330
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3k
Visualization
eitanlees
150
16k
4 Signs Your Business is Dying
shpigford
186
22k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
How to Ace a Technical Interview
jacobian
280
24k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Facilitating Awesome Meetings
lara
57
6.6k
Six Lessons from altMBA
skipperchong
29
4.1k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
How to Think Like a Performance Engineer
csswizardry
28
2.3k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
Transcript
ήϯόͷ ΫϦʔϯΞʔΩςΫνϟ 4DBMBQMBZϓϩδΣΫτઃܭͷ͓ ҆ୡ༐Ұ Ϋϥεϝιουגࣜձࣾ ݄ ⡥$MBTTNFUIPE *OD
҆ୡɹ༐Ұ • 2013/12 ೖࣾ • TwitterID: @UsrNameu1 • Github:
https://github.com/ UsrNameu1 • Blog: http://dev.classmethod.jp/ author/yad • ͜͜ҰαʔόʔαΠυϝΠϯ
ࠓ͞ͳ͍͜ͱ w %%%ʢυϝΠϯۦಈઃܭʣͷσΟςʔϧ w ߴͳؔܕݴޠͷτϐοΫʢݍɺϞφυFUDʜʣ ⡥$MBTTNFUIPE *OD
ຊͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1ΛͬͯͲ͏࣮͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ
⡥$MBTTNFUIPE *OD
ຊͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1ΛͬͯͲ͏࣮͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ
⡥$MBTTNFUIPE *OD
ΫϦʔϯΞʔΩςΫνϟͱ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొਓୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻
⡥$MBTTNFUIPE *OD
ΫϦʔϯΞʔΩςΫνϟͱ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొਓୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻
⡥$MBTTNFUIPE *OD
ΫϦʔϯΞʔΩςΫνϟ֓ཁ ⡥$MBTTNFUIPE *OD IUUQCMPHUIMJHIUDPNVODMFCPC UIFDMFBOBSDIJUFDUVSFIUNM UI-JHIU *ODͷ6ODMF#PCࢯ͕ఏҊ
⡥$MBTTNFUIPE *OD ʮؔ৺ͷʯΛతͱ͢Δ༷ʑͳΞʔΩςΫνϟ Λ୯Ұͷ֓೦ʹ౷߹ w ϔΩαΰφϧΞʔΩςΫνϟ ༁ॻɿ࣮ફςετۦಈ։ൃʣ w
ΦχΦϯΞʔΩςΫνϟ ݩهࣄɿIUUQKF⒎SFZQBMFSNPDPNCMPHUIFPOJPOBSDIJUFDUVSFQBSUʣ w %BUB$POUFYU*OUFSBDUJPO ༸ॻɿ-FBOBSDIJUFDUVSFʣ w #PVOEBSZ $POUSPM &OUJUZ ༁ॻɿΦϒδΣΫτࢦιϑτΣΞֶ004&ʣ
ΫϦʔϯΞʔΩςΫνϟͱ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొਓୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻
⡥$MBTTNFUIPE *OD
w ϓϩδΣΫτϨϕϧͷϏδωεϧʔϧɾϩδοΫΛ ΧϓηϧԽͨ͠ͷ w ֎ଆͷԿ͔͕มԽ͔ͯ͠ΘΒͳ͍ w Ώ͑ʹɺ͜ͷޙઆ໌͢ΔϢʔεέʔε ΠϯλʔϑΣΠεΞμϓλʔʹඇґଘ ΫϦʔϯΞʔΩςΫνϟͷొਓୡ
⡥$MBTTNFUIPE *OD ΤϯςΟςΟ &OUJUJFT
w ΞϓϦέʔγϣϯϨϕϧͷϏδωεϧʔϧɺϩδοΫΛΧϓ ηϧԽͨ͠ͷ w ଆͷΤϯςΟςΟͷΈΛ༻͍ͯతΛୡ͢Δ w ֎ଆͷԿ͔͕มԽ͔ͯ͠ΘΒͳ͍ w Ώ͑ʹɺ͜ͷޙઆ໌͢Δ ɹΠϯλʔϑΣΠεΞμϓλʔʹ
ɹඇґଘ ⡥$MBTTNFUIPE *OD Ϣʔεέʔε &OUJUJFT 6TFDBTFT
w σʔλϕʔεɺ6*ɺ"1**'ɺ֎෦γεςϜͷػೳʹ࠷ศ རͳܗࣜʹσʔλΛม $POUSPMMFS %"0 w ֤ػೳͷΞμϓλϢʔεέʔεΛ௨ͯ͡ଞͷΞμϓλͱ ΓऔΓ͢ΔʢଞͷػೳͷΞμϓλΛΒͳ͍ʣ w
֤ػೳʹݻ༗ͷσʔλߏ ɹ͜͜Ͱ෦ʢϢʔεέʔεɾ ɹΤϯςΟςΟʣͷѻ͍͍͢ ɹσʔλߏʹม͞ΕΔ ⡥$MBTTNFUIPE *OD ΠϯλʔϑΣΠεΞμϓλʔ &OUJUJFT 6TFDBTFT *OUFSGBDFBEBQUFS %# 6* "1**' ֎෦γεςϜ '8
ίʔυͷґଘੑ ৗʹଆʹ͔͏ ⡥$MBTTNFUIPE *OD
ΫϦʔϯΞʔΩςΫνϟͱ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొਓୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻
⡥$MBTTNFUIPE *OD
ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 ⡥$MBTTNFUIPE *OD ࣮ࡍͷ੍ޚϑϩʔʹ֎ଆʹ͔͏έʔε͕͋Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*
"1**' %# $BDIF
⡥$MBTTNFUIPE *OD ͜ͷΑ͏ͳίϯϙʔωϯτؒͷؔ ίʔυͷґଘੑ͕ৗʹଆʹ͔͏ݪଇʹ͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*
"1**' ͇ %# $BDIF
⡥$MBTTNFUIPE *OD ͜ͷΛଧ։͢ΔͨΊɺ 6TFDBTFTʹσʔλετΞநΛ࡞͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*
"1**' 4UPSF %# $BDIF
⡥$MBTTNFUIPE *OD ͍··Ͱ6TFDBTFT͔Βࢀর͍ͯͨ͠ ֎෦ͷ%"06TFDBTFTͷ σʔλετΞநΛ࣮͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF
6* "1**' 4UPSF %# $BDIF
⡥$MBTTNFUIPE *OD 6TFDBTFTͷαʔϏε͋͘·Ͱ 6TFDBTFTͷσʔλετΞநΛར༻ͯ͠ ػೳΛ࣮ݱ͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF
6* "1**' 4UPSF %# $BDIF
⡥$MBTTNFUIPE *OD ͜ͷछͷιʔείʔυґଘੑͱ੍ޚͷྲྀΕͷసΛ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMFґଘੑٯసͷݪଇ ͱ͍͍ɺ͜ΕΛͬͯଆͷίʔυґଘੑΛอͯΔ &OUJUJFT %"0
$POUSPMMFS 4FSWJDF 6* "1**' 4UPSF %*1 %# $BDIF
⡥$MBTTNFUIPE *OD ͜ΕΒͷιʔείʔυؒͷґଘੑͷղܾʹ %* %FQFOEFODZ*OKFDUJPOґଘੑೖ ίϯςφ͕͑Δ ͨͩ͠ɺҰ෦ઃఆ͕ඞཁ &OUJUJFT %"0
$POUSPMMFS 4FSWJDF 6* "1**' 4UPSF %*$POUBJOFS DPOG %*1 %# $BDIF
ΫϦʔϯΞʔΩςΫνϟͱ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొਓୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻
⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ϑϨʔϜϫʔΫ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ΫϦʔϯΞʔΩςΫνϟͷޮ༻ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT
'SBNFXPSL -JCSBSZ 4%, &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ϑϨʔϜϫʔΫ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ΫϦʔϯΞʔΩςΫνϟͷޮ༻ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT
'SBNFXPSL -JCSBSZ 4%, &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ଆͷϨΠϠ ϑϨʔϜϫʔΫͷ มߋʹӨڹΛड͚ͳ͍
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ 6*ɺ"1*ͷ*'͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT 6*ɾ"1**'
&YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ 6*ɺ"1*ͷ*'͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT 6*ɾ"1**'
&YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ଆͷϨΠϠ 6*ɺ"1**'ͷ มߋʹӨڹΛ ड͚ͳ͍
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ σʔλϕʔε͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS
6TFDBTFT %# $BDIF &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ σʔλϕʔε͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS
6TFDBTFT %# $BDIF &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ଆͷϨΠϠ %# $BDIFͷ มߋʹӨڹΛ ड͚ͳ͍
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ֎෦ػೳ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT ֎෦"1*
֎෦γεςϜ &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ֎෦ػೳ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT ֎෦"1*
֎෦γεςϜ &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ଆͷϨΠϠ ֎෦"1*ɺγεςϜͷ มߋʹӨڹΛ ड͚ͳ͍
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ςελϏϦςΟʹ༏ΕͨγεςϜΛੜΈग़͢ %# $BDIF 6*ɾ"1**' &OUJUJFT %"0
$POUSPMMFS 4FSWJDF 4UPSF
⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ ςελϏϦςΟʹ༏ΕͨγεςϜΛੜΈग़͢ %# $BDIF 6*ɾ"1**' &OUJUJFT %"0
$POUSPMMFS 4FSWJDF 4UPSF ֎෦ʹґଘ͍ͯ͠ͳ͍ͨΊ 6TFDBTFT &OUJUJFT ͷςετʹ ୯७ͳϞοΫͱ ࣄલ݅ͷΈ͕ඞཁ
ຊͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1ΛͬͯͲ͏࣮͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ
⡥$MBTTNFUIPE *OD
ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞΜͩͱ͜Ζ ⡥$MBTTNFUIPE *OD
ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞΜͩͱ͜Ζ ⡥$MBTTNFUIPE *OD
࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ ⡥$MBTTNFUIPE *OD ։ൃڥ w +BWB w 4DBMB w
TCU w QMBZ w BXTTEL ༻్ w େ͖ͳμϯϩʔυ͕ఆ͞ΕΔϞόΠϧΞϓϦͷ όοΫΤϯυ"1*
࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ ⡥$MBTTNFUIPE *OD !"" app $"" controllers $"" core
$"" domains $"" infrastructures $"" modules !"" services
࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ ⡥$MBTTNFUIPE *OD !"" app $"" controllers $"" core
$"" domains $"" infrastructures $"" modules !"" services *OUFSGBDF"EBQUFSϨΠϠ 6TFDBTFTϨΠϠ &OUJUJFTϨΠϠ $PSFϨΠϠ %*ίϯςφઃఆ
ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞΜͩͱ͜Ζ ⡥$MBTTNFUIPE *OD
!"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala
!"" SomeEndpointResultGenerator.scala ⡥$MBTTNFUIPE *OD DPOUSPMMFSTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ ύοέʔδͱϨΠϠͷରԠ
!"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala
!"" SomeEndpointResultGenerator.scala ⡥$MBTTNFUIPE *OD DPOUSPMMFSTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷมΛ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ ύοέʔδͱϨΠϠͷରԠ
!"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala
!"" SomeEndpointResultGenerator.scala ⡥$MBTTNFUIPE *OD DPOUSPMMFSTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷมΛ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ 3PVUFTͷϦΫΤετΛࡹ͘ίϯτϩʔϥ ύοέʔδͱϨΠϠͷରԠ
!"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala
!"" SomeEndpointResultGenerator.scala ⡥$MBTTNFUIPE *OD DPOUSPMMFSTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷมΛ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ 3PVUFTͷϦΫΤετΛࡹ͘ίϯτϩʔϥ ෦ɺ֎෦Ͱग़ͨΤϥʔΛΤϥʔϨεϙϯεʹม͢ΔϞδϡʔϧ ύοέʔδͱϨΠϠͷରԠ
⡥$MBTTNFUIPE *OD !"" infrastructures !"" somesystem $"" apiclients $""
awsclients !"" dbclients JOGSBTUSVDUVSFTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84ͷػೳΛఏڙͨ͠
!"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients
⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84ͷػೳΛఏڙͨ͠ ֎෦"1*ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈
!"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients
⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84ͷػೳΛఏڙͨ͠ ֎෦"1*ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈ %#Ҏ֎ͷ"84αʔϏεͷΞΫηεΛ୲͏ΫϥΠΞϯτ܈
!"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients
⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFTԼύοέʔδͰ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84ͷػೳΛఏڙͨ͠ ֎෦"1*ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈ %#ͷΞΫηεΛ୲͏%"0܈ %#Ҏ֎ͷ"84αʔϏεͷΞΫηεΛ୲͏ΫϥΠΞϯτ܈
⡥$MBTTNFUIPE *OD !"" services !"" someusecase $"" SomeModelStore.scala !""
FindSomeModelService.scala TFSWJDFTԼύοέʔδͰ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠
!"" services !"" someusecase $"" SomeModelStore.scala !"" FindSomeModelService.scala ⡥$MBTTNFUIPE
*OD TFSWJDFTԼύοέʔδͰ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ σʔλετΞநʢUSBJU
!"" services !"" someusecase $"" SomeModelStore.scala !"" FindSomeModelService.scala ⡥$MBTTNFUIPE
*OD TFSWJDFTԼύοέʔδͰ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ σʔλετΞநʢUSBJU 4PNF.PEFMऔಘαʔϏε
⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""
SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOTԼύοέʔδͰ &OUJUJFTϨΠϠͷσʔλߏɺϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠
⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""
SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOTԼύοέʔδͰ &OUJUJFTϨΠϠͷσʔλߏɺϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ 4PNF.PEFMΛද͢σʔλߏ
⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""
SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOTԼύοέʔδͰ &OUJUJFTϨΠϠͷσʔλߏɺϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ σʔλετΞநʢUSBJU 4PNF.PEFMΛද͢σʔλߏ
⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""
SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOTԼύοέʔδͰ &OUJUJFTϨΠϠͷσʔλߏɺϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ σʔλετΞநʢUSBJU 4PNF.PEFMΛද͢σʔλߏ 4PNF.PEFMͷొΛද͢σʔλߏ
⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""
SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOTԼύοέʔδͰ &OUJUJFTϨΠϠͷσʔλߏɺϧʔϧ ֎෦ϨΠϠͰ࣮͢ΔநΛఏڙͨ͠ σʔλετΞநʢUSBJU 4PNF.PEFMΛද͢σʔλߏ 4PNF.PEFMͷొΛද͢σʔλߏ 4PNF.PEFMͷ*EൃߦΛ͢ΔαʔϏε
⡥$MBTTNFUIPE *OD DPSFԼύοέʔδͰ &OUJUJFTϨΠϠ͔ΒͰґଘͯ͠Α͍ ൚༻తͳػೳΛఏڙͨ͠ &OUJUJFT *OUFSGBDF"EBQUFST 6TFDBTFT DPSF
⡥$MBTTNFUIPE *OD DPSFԼύοέʔδͰ &OUJUJFTϨΠϠ͔ΒͰґଘͯ͠Α͍ ൚༻తͳػೳΛఏڙͨ͠ &OUJUJFT *OUFSGBDF"EBQUFST 6TFDBTFT DPSF
ɹྫɿ-PDBM%BUF5JNFͷ 0SEFSJOHUSBJUରԠ จࣈྻͷϦετͷ ίϯόʔλ
ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞΜͩͱ͜Ζ ⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD ͦͷଞΜͩͱ͜Ζ w ৽ͨͳϑΟʔϧυͷՃଟ͘ͷ߹ɺ&OUJUJFTͷϑΟʔ ϧυʹӨڹͨ͠ɻ w ڥք͝ͱͷσʔλߏʢ%50ʣ͋·Γఆٛͤͣɺґଘϧʔ ϧతʹ͕ͳ͍ͱߟ͑ɺ*OUFSGBDF"EBQUFS
&OUJUJFTͷσʔλߏΛར༻ͨ͠ɻʢهࣄͰਪ͞Ε ͍ͯͳ͍ʣ w ಉ༷ʹ%*16TFDBTFTΛ·͕ͨͬͯ&OUJUJFTͷσʔλ ετΞநΛ*OUFSGBDF"EBQUFS͕࣮͢Δ͜ͱ͕ ͋ͬͨɻ
⡥$MBTTNFUIPE *OD ͦͷଞΜͩͱ͜Ζ w 9994FSWJDFͱ͍͏໊લͷϏδωεϩδοΫΛ6TF DBTFTϨΠϠ͔&OUJUJFTϨΠϠʹஔ͔͘Ͱ໎ͬͨɻ w 6TFDBTFTϨΠϠͷϩδοΫ͕ಉ͡Α͏ͳՕॴͰ͔ͭͦΕ ͕ϓϩδΣΫτશମͱͯ͠ڞ௨ʹ༻͍ΒΕͦ͏ͳ֓೦ͷ
߹ɺ&OUJUJFTʹ͓͘ͱ͍͏҉ͷج४͋ͬͨɻ w ϓϩδΣΫτશମͰͷڞ༻ϥΠϒϥϦͰڞ௨ͷ *OUFSGBDF"EBQUFS͕͋ͬͨͨΊɺڞ༻ϥΠϒϥϦͷύο έʔδߏΞϓϦέʔγϣϯͱಉ͡Α͏ͳͷʹͳͬͨɻ
ຊͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1ΛͬͯͲ͏࣮͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ
⡥$MBTTNFUIPE *OD
%*%*1ΛͬͯͲ͏࣮͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ
⡥$MBTTNFUIPE *OD
%*%*1ΛͬͯͲ͏࣮͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ
⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD %*1ʢґଘੑٯసͷݪଇʣ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6* "1**'
4UPSF %*1 %# $BDIF લड़ͷ௨ΓɺΫϦʔϯΞʔΩςΫνϟʹ%*1͕ඞཁ
%*%*1ΛͬͯͲ͏࣮͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ
⡥$MBTTNFUIPE *OD
⡥$MBTTNFUIPE *OD %*ʢґଘੑೖʣ ͦͯ͠%*1ͷ࣮ݱʹ%*ίϯςφΛར༻ͨ͠ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*
"1**' 4UPSF %*$POUBJOFS DPOG %*1 %# $BDIF
%*%*1ΛͬͯͲ͏࣮͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ
⡥$MBTTNFUIPE *OD
(PPHMFHVJDF ⡥$MBTTNFUIPE *OD w ґଘੑೖͷͨΊͷίϯςφ w 1MBZ͔Β1MBZଆͰαϙʔτ w +43ʢ%FQFOEFODZ*OKFDUJPOGPS+BWBʣͷ
ϦϑΝϨϯε࣮ w ϥϯλΠϜ࣌%*ʢ㱻ίϯύΠϧ࣌%*ʣ
%*%*1ΛͬͯͲ͏࣮͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ
⡥$MBTTNFUIPE *OD
(VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS 4FSWJDF "1**' 4UPSF
%*$POUBJOFS DPOG %*1 $BDIF ԼͷΑ͏ͳΞϓϦέʔγϣϯΛ%*Λ༻͍࣮ͯ͢Δ
(VJDFʹΑΔ%*ͱ%*1ͷ࣮ྫ ⡥$MBTTNFUIPE *OD IUUQTHJUIVCDPN6TS/BNFV3FEJT%*4BNQMF ιʔείʔυͪ͜Βˣ
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந trait SomeModelStore { def findById( identifier:
String ): Future[Option[SomeModel]] }
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந trait SomeModelStore { def findById( identifier:
String ): Future[Option[SomeModel]] } 6TFDBTFTϨΠϠͷநσʔλετΞ USBJUͰ࣮ͨ͠
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந trait SomeModelStore { def findById( identifier:
String ): Future[Option[SomeModel]] } *%Λࢦఆͯ͠ ϞσϧΛಘΔ ͳ͚Ε/POF 6TFDBTFTϨΠϠͷநσʔλετΞ USBJUͰ࣮ͨ͠
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮ class FindSomeModelService @Inject()( store: SomeModelStore )
{ def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) }
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮ class FindSomeModelService @Inject()( store: SomeModelStore )
{ def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) } 4FSWJDF%*͞Εͨ6TFDBTFTϨΠϠͷ நσʔλετΞΛར༻͢Δ
⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮ class FindSomeModelService @Inject()( store: SomeModelStore )
{ def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) } 4FSWJDF%*͞Εͨ6TFDBTFTϨΠϠͷ நσʔλετΞΛར༻͢Δ 4FSWJDFநσʔλετΞಉ࢜ͷ ୯७ͳΈ߹ΘͤΛ࣮͢Δ
⡥$MBTTNFUIPE *OD *OUFSGBDF"EBQUFSϨΠϠͷ%"0ʢ3FEJTʣ class SomeModelDAO @Inject()( @Named("some_model") pool: RedisClientPool
) extends SomeModelStore { import CacheJsonConverters._ override def findById( identifier: String ): Future[Option[SomeModel]] = Future { pool.withClient { client => val maybeJson = client.get(identifier) map Json.parse maybeJson map { Json.fromJson(_).get } } } }
⡥$MBTTNFUIPE *OD *OUFSGBDF"EBQUFSϨΠϠͷ%"0ʢ3FEJTʣ class SomeModelDAO @Inject()( @Named("some_model") pool: RedisClientPool
) extends SomeModelStore { import CacheJsonConverters._ override def findById( identifier: String ): Future[Option[SomeModel]] = Future { pool.withClient { client => val maybeJson = client.get(identifier) map Json.parse maybeJson map { Json.fromJson(_).get } } } } !/BNFEλάʹΑͬͯ%*͢ΔΠϯελϯεͷ ੍ޚΛߦ͑Δ
⡥$MBTTNFUIPE *OD *OUFSGBDF"EBQUFSϨΠϠͷ%"0ʢ3FEJTʣ class SomeModelDAO @Inject()( @Named("some_model") pool: RedisClientPool
) extends SomeModelStore { import CacheJsonConverters._ override def findById( identifier: String ): Future[Option[SomeModel]] = Future { pool.withClient { client => val maybeJson = client.get(identifier) map Json.parse maybeJson map { Json.fromJson(_).get } } } } !/BNFEλάʹΑͬͯ%*͢ΔΠϯελϯεͷ ੍ޚΛߦ͑Δ 6TFDBTFTϨΠϠͷநΛ %"0࣮͢Δ
⡥$MBTTNFUIPE *OD *OUFSGBDF"EBQUFSϨΠϠͷ%"0ʢ3FEJTʣ class SomeModelDAO @Inject()( @Named("some_model") pool: RedisClientPool
) extends SomeModelStore { import CacheJsonConverters._ override def findById( identifier: String ): Future[Option[SomeModel]] = Future { pool.withClient { client => val maybeJson = client.get(identifier) map Json.parse maybeJson map { Json.fromJson(_).get } } } } !/BNFEλάʹΑͬͯ%*͢ΔΠϯελϯεͷ ੍ޚΛߦ͑Δ 6TFDBTFTϨΠϠͷநΛ %"0࣮͢Δ จࣈྻˠ+TPOˠϞσϧʹมͯ͠ Ξτϓοτ
⡥$MBTTNFUIPE *OD class SomeModelController @Inject()( findService: FindSomeModelService ) extends
Controller { import ResponseBodyConverters._ def find(identifier: String) = Action.async { for { maybeModel <- findService.findById(identifier) result = maybeModel match { case None => NotFound case Some(model) => Ok(Json.toJson(model)) } } yield result } } *OUFSGBDF"EBQUFSϨΠϠͷ$POUSPMMFS
⡥$MBTTNFUIPE *OD class SomeModelController @Inject()( findService: FindSomeModelService ) extends
Controller { import ResponseBodyConverters._ def find(identifier: String) = Action.async { for { maybeModel <- findService.findById(identifier) result = maybeModel match { case None => NotFound case Some(model) => Ok(Json.toJson(model)) } } yield result } } *OUFSGBDF"EBQUFSϨΠϠͷ$POUSPMMFS %*͞Εͨ6TFDBTFTϨΠϠͷ αʔϏεΛར༻͢Δ
⡥$MBTTNFUIPE *OD class SomeModelController @Inject()( findService: FindSomeModelService ) extends
Controller { import ResponseBodyConverters._ def find(identifier: String) = Action.async { for { maybeModel <- findService.findById(identifier) result = maybeModel match { case None => NotFound case Some(model) => Ok(Json.toJson(model)) } } yield result } } Ϟσϧˠ+TPOʹมͯ͠ϨεϙϯεΛฦ٫ *OUFSGBDF"EBQUFSϨΠϠͷ$POUSPMMFS %*͞Εͨ6TFDBTFTϨΠϠͷ αʔϏεΛར༻͢Δ
⡥$MBTTNFUIPE *OD %*ίϯςφͷઃఆΫϥε class AppDependencyModule extends AbstractModule { override
def configure(): Unit = { bind(classOf[SomeModelStore]).to(classOf[SomeModelDAO]) } @Provides @Singleton @Named("some_model") def provideStoreDetailRedisClientPool( configuration: Configuration ): RedisClientPool = new RedisClientPool( configuration.getString("redis.host").get, configuration.getInt("redis.port").get, database = 1 ) }
⡥$MBTTNFUIPE *OD %*ίϯςφͷઃఆΫϥε class AppDependencyModule extends AbstractModule { override
def configure(): Unit = { bind(classOf[SomeModelStore]).to(classOf[SomeModelDAO]) } @Provides @Singleton @Named("some_model") def provideStoreDetailRedisClientPool( configuration: Configuration ): RedisClientPool = new RedisClientPool( configuration.getString("redis.host").get, configuration.getInt("redis.port").get, database = 1 ) } "CTUSBDU.PEVMFΛܧঝͯ͠ઃఆΫϥεΛͭ͘Δ
⡥$MBTTNFUIPE *OD %*ίϯςφͷઃఆΫϥε class AppDependencyModule extends AbstractModule { override
def configure(): Unit = { bind(classOf[SomeModelStore]).to(classOf[SomeModelDAO]) } @Provides @Singleton @Named("some_model") def provideStoreDetailRedisClientPool( configuration: Configuration ): RedisClientPool = new RedisClientPool( configuration.getString("redis.host").get, configuration.getInt("redis.port").get, database = 1 ) } 4FSWJDFͰ%*͞ΕΔσʔλετΞநʹରͯ͠ ͲͷΫϥε͕ ೖ͞ΕΔ͔ એݴ͢Δ "CTUSBDU.PEVMFΛܧঝͯ͠ઃఆΫϥεΛͭ͘Δ
⡥$MBTTNFUIPE *OD %*ίϯςφͷઃఆΫϥε class AppDependencyModule extends AbstractModule { override
def configure(): Unit = { bind(classOf[SomeModelStore]).to(classOf[SomeModelDAO]) } @Provides @Singleton @Named("some_model") def provideStoreDetailRedisClientPool( configuration: Configuration ): RedisClientPool = new RedisClientPool( configuration.getString("redis.host").get, configuration.getInt("redis.port").get, database = 1 ) } 4FSWJDFͰ%*͞ΕΔσʔλετΞநʹରͯ͠ ͲͷΫϥε͕ ೖ͞ΕΔ͔ એݴ͢Δ "CTUSBDU.PEVMFΛܧঝͯ͠ઃఆΫϥεΛͭ͘Δ %"0Ͱ༻͍Δ 3FEJTଓͷͨΊͷ ΫϥεΛઃఆ
⡥$MBTTNFUIPE *OD )0$0/ )VNBO0QUJNJ[FE$POpH0CKFDU /PUBUJPO ϑΥʔϚοτͰએݴ͞Εͨ %*ίϯςφͷઃఆΫϥεରԠDPOGϑΝΠϧ redis {
host = "localhost" port = "6379" } play.modules.enabled += modules.AppDependencyModule
⡥$MBTTNFUIPE *OD )0$0/ )VNBO0QUJNJ[FE$POpH0CKFDU /PUBUJPO ϑΥʔϚοτͰએݴ͞Εͨ %*ίϯςφͷઃఆΫϥεରԠDPOGϑΝΠϧ redis {
host = "localhost" port = "6379" } play.modules.enabled += modules.AppDependencyModule 3FEJTʹ༻͍ΔIPTU QPSUએݴ QMBZͷΞϓϦέʔγϣϯʹ ઌ΄Ͳͷ%*ઃఆΫϥεΛಡΈ͜·ͤΔ
ຊͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1ΛͬͯͲ͏࣮͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ
⡥$MBTTNFUIPE *OD
֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿͍ͨ͠ w $BTF෦తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*ΛՃ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖͍͑ͨ
⡥$MBTTNFUIPE *OD
֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿͍ͨ͠ w $BTF෦తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*ΛՃ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖͍͑ͨ
⡥$MBTTNFUIPE *OD
$BTF ϨεϙϯεͷϑΟʔϧυ Λ૿͍ͨ͠ ⡥$MBTTNFUIPE *OD w ͱͱ֎෦"1*ͷΈʹґଘ͍ͯͨ͠ΤϯυϙΠϯτ ͷ+TPOϑΟʔϧυʹ৽͍͠ϑΟʔϧυΛՃ͍ͨ͠ w
ϑΟʔϧυͷ֎෦"1*ͷϑΟʔϧυΛͱʹม ͞ΕͨͷΛ͍͍ͨ ֎քͷ࡞༻ʢ༷มߋʣͷ༰
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**'
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ Ճ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏʹ ৽͍͠ϑΟʔϧυΛՃ $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ Ճ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏʹ ৽͍͠ϑΟʔϧυΛՃ $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ Ճ ϑΟʔϧυಛ༗ͷϩδοΫΛ ॻ͔ͳ͔ͬͨ 6TFDBTFTϨΠϠ ࡞༻ͷӨڹΛड͚ͳ͍
⡥$MBTTNFUIPE *OD ఆ͞ΕΔ6TFDBTFTϨΠϠͷׂʹର͢ΔԾઆ w &OUJUJFTϨΠϠͷ֤छσʔλߏͷಛఆͷϑΟʔϧυʹؔ ࿈ͨ͠ϩδοΫΞϓϦέʔγϣϯಛ༗ͱ͍͏ΑΓϓϩ δΣΫτશମͱͯ͠ͷϏδωεɾϧʔϧͱͯ͠ѻͬͨ΄͏ ͕֎քͷ࡞༻ʹڧ͍͔͠Εͳ͍ w
Ώ͑ʹɺ6TFDBTFTϨΠϠʹஔ͘ϩδοΫಛఆͷϑΟʔ ϧυʹґଘ͠ͳ͍ͷΛஔ͍ͨ΄͏͕Α͍͔͠Εͳ͍
֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿͍ͨ͠ w $BTF෦తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*ΛՃ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖͍͑ͨ
⡥$MBTTNFUIPE *OD
$BTF̎ ෦తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*ΛՃ͍ͨ͠ ⡥$MBTTNFUIPE *OD w ͦΕ·ͰผͷΤϯυϙΠϯτͰѻ͍ͬͯͨ ෦తͳϑΟʔϧυʹؔ͢Δ࠷৽ͷใΛฦ٫͢Δ৽ ͍͠ΤϯυϙΠϯτΛ࡞͍ͨ͠
w ࠷৽ͷใͷߋ৽֎෦"1*Λͨͨ͘ඞཁ͕͋Δ ֎քͷ࡞༻ʢ༷มߋʣͷ༰
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**'
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' ࠷৽ͷใऔಘ ΤϯυϙΠϯτ͚ ΞΫγϣϯΛՃ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' ࠷৽ͷใߋ৽"1* ΫϥΠΞϯτΛՃ ࠷৽ͷใऔಘ ΤϯυϙΠϯτ͚ ΞΫγϣϯΛՃ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' ࠷৽ͷใߋ৽"1* ΫϥΠΞϯτΛՃ ࠷৽ใऔಘ αʔϏεΛ Ճ ࠷৽ͷใऔಘ ΤϯυϙΠϯτ͚ ΞΫγϣϯΛՃ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU
4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏ ߏԽ͞Ε͍ͯΔͨΊ ࡞༻ͷӨڹΛड͚ͳ͍ ࠷৽ͷใߋ৽"1* ΫϥΠΞϯτΛՃ ࠷৽ใऔಘ αʔϏεΛ Ճ ࠷৽ͷใऔಘ ΤϯυϙΠϯτ͚ ΞΫγϣϯΛՃ
⡥$MBTTNFUIPE *OD ఆ͞ΕΔ&OUJUJFTϨΠϠͷσʔλߏʹؔ͢ΔԾઆ w &OUJUJFTϨΠϠͷ֤छσʔλߏߏԽ͓ͯ͘͠ͱ ෦తͳมߋ͕ೖͬͨ࣌ͷӨڹΛ͏͚ͳ͍͔͠Εͳ͍ w σʔλߏΛ͍͔ʹߏԽ͖͔͢ʹ͍ͭͯ%%%ͷϢϏ Ωλεݴޠͷ֓೦͕ࢀߟʹͳΔ͔͠Εͳ͍
֎քͷ࡞༻ͱͲ͏͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿͍ͨ͠ w $BTF෦తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*ΛՃ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖͍͑ͨ
⡥$MBTTNFUIPE *OD
$BTF̏ ॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖͍͑ͨ ⡥$MBTTNFUIPE *OD w $MPVE'SPOUͷॺ໊͖ͭ63-Λ ௨ৗͷ$MPVE'SPOU63-ʹஔ͖͍͑ͨ w
ͱͱ&OUJUJFTʹʮॺ໊͖ͭ63-ൃߦαʔϏ εʯ͕͋ͬͨ ֎քͷ࡞༻ʢ༷มߋʣͷ༰
⡥$MBTTNFUIPE *OD ॺ໊͖ͭ63-ͷൃߦ IUUQEFWDMBTTNFUIPEKQDMPVEBXT DGTEFMJWFSJFTVTFTJHOVSM 4FFBMTP
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU
4FSWJDF "1**'
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU
4FSWJDF "1**' 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม͢Δػೳʹमਖ਼
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU
4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม͢Δػೳʹमਖ਼
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU
4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม͢Δػೳʹमਖ਼ &OUJUJFTͷมߋʹ߹Θͤͨ ίʔυͷमਖ਼͕ൃੜ
⡥$MBTTNFUIPE *OD Ͳ͏͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU
4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม͢Δػೳʹमਖ਼ &OUJUJFTͷมߋʹ߹Θͤͨ ίʔυͷमਖ਼͕ൃੜ "1**'मਖ਼͕ͳ͍ͨΊ ࡞༻ͷӨڹΛड͚ͳ͍
⡥$MBTTNFUIPE *OD ఆ͞ΕΔ&OUJUJFTϨΠϠͷαʔϏεʹؔ͢ΔԾઆ w &OUJUJFTϨΠϠͷαʔϏεʹରͯ͠ɺʮॺ໊͖ͭ63-ൃ ߦʯͱ͍͏۩ମతͳ໊લΛ͚ͭͯ͠·ͬͨ͜ͱʹΑͬͯɺ େنͳमਖ਼͕ൃੜͨ͠ͱߟ͑ΒΕΔ w αʔϏεͷ໊લ͕࠷ॳ͔Βʮ63-มʯͩͬͨΒେنͳ
มى͜Βͳ͔͔ͬͨ͠Εͳ͍ w Αͬͯɺ&OUJUJFTϨΠϠͷαʔϏεʹରͯ͠Πϯϑϥʹ ґଘ͠ͳ͍Α͏ͳɺΑΓϏδωεϩδοΫͱͯ͠ͷந ͷߴ໊͍લΛ͚ͭͨํ͕Α͔͔ͬͨ͠Εͳ͍
·ͱΊ w ΫϦʔϯΞʔΩςΫνϟ֎քͷґଘੑΛഉআ͠ɺ ίʔυͷґଘੑΛϓϩδΣΫτશମͷϩδοΫΛදݱ ͨ͠σʔλߏɺαʔϏεʹΉ͚Δ w ݩهࣄͷ༰Λݫີʹద༻͠ͳͯ͘͏·͍͘͘έʔε ͋Δ w ҙਂ͘ύοέʔδΘ͚Λ͢Εɺ֎քͷ࡞༻ʹର͠
ͯಛఆͷϨΠϠΛத৺ͱ͢ΔมߋͰࡁΉ ⡥$MBTTNFUIPE *OD
ࢀߟαΠτ ⡥$MBTTNFUIPE *OD w 5IF$MFBO"SDIJUFDUVSF IUUQCMPHUIMJHIUDPNVODMFCPCUIFDMFBOBSDIJUFDUVSFIUNM w ΞʔΩςΫνϟͷతҙਤͰ͋ΓɺϑϨʔϜϫʔΫͰͳ͍ IUUQXXXJOGPRDPNKQOFXTBSDIJUFDUVSF@JOUFOU@GSBNFXPSLT