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
ゲンバのクリーンアーキテクチャ - Scala play プロジェクト設計のお話 -
Search
Yad
March 26, 2016
Programming
15
4.3k
ゲンバのクリーンアーキテクチャ - 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.6k
Other Decks in Programming
See All in Programming
Новый уровень ML-персонализации Lamoda: Как мы усилили ее в каталоге и перенесли на другие продукты
lamodatech
0
220
実践サーバーレスパフォーマンスチューニング ~その実力に迫る~ / Practical Serverless Performance Tuning ~A Close Look at its Power~
seike460
PRO
2
180
CSC509 Lecture 03
javiergs
PRO
0
140
Pydantic x Database API:turu-pyの開発
yassun7010
1
740
Kubernetes上でOracle_Databaseの運用を楽にするOraOperatorの紹介
nnaka2992
0
160
データサイエンスのフルサイクル開発を実現する機械学習パイプライン
xcnkx
2
510
空間の中でアイドルとレッスンする技術 - 1st "Vision" / Spatial Lesson technologies with my idol - 1st "Vision"
banjun
PRO
0
160
DevFest Android in Korea 2024 - 안드로이드의 문단속 : 앱을 지키는 암호화 이야기
mdb1217
1
160
メルカリ ハロ アプリの技術スタック
atsumo
2
830
Compose Multiplatform과 Ktor로 플랫폼의 경계를 넘어보자
kwakeuijin
0
280
デバッグの話 / Debugging for Beginners
kaityo256
PRO
8
630
個人開発で使ってるやつを紹介する回
yohfee
1
710
Featured
See All Featured
BBQ
matthewcrist
85
9.2k
Creatively Recalculating Your Daily Design Routine
revolveconf
217
12k
Pencils Down: Stop Designing & Start Developing
hursman
119
11k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
The Pragmatic Product Professional
lauravandoore
31
6.2k
Bash Introduction
62gerente
608
210k
The Cost Of JavaScript in 2023
addyosmani
43
5.9k
Git: the NoSQL Database
bkeepers
PRO
425
64k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
Thoughts on Productivity
jonyablonski
67
4.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.7k
Gamification - CAS2011
davidbonilla
80
5k
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