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.7k
Other Decks in Programming
See All in Programming
CSC305 Lecture 13
javiergs
PRO
0
130
Vue.js学習の振り返り
hiro_xre
2
130
CPython 인터프리터 구조 파헤치기 - PyCon Korea 24
kennethanceyer
0
240
僕がつくった48個のWebサービス達
yusukebe
18
17k
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
330
RailsのPull requestsのレビューの時に私が考えていること
yahonda
5
1.7k
JaSST 24 九州:ワークショップ(は除く)実践!マインドマップを活用したソフトウェアテスト+活用事例
satohiroyuki
0
260
Amazon Neptuneで始めてみるグラフDB-OpenSearchによるグラフの全文検索-
satoshi256kbyte
4
330
Outline View in SwiftUI
1024jp
1
110
Progressive Web Apps für Desktop und Mobile mit Angular (Hands-on)
christianliebel
PRO
0
110
From Subtype Polymorphism To Typeclass-based Ad hoc Polymorphism- An Example
philipschwarz
PRO
0
170
cXML という電子商取引の トランザクションを支える プロトコルと向きあっている話
phigasui
3
2.3k
Featured
See All Featured
Facilitating Awesome Meetings
lara
49
6k
Producing Creativity
orderedlist
PRO
341
39k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
The Cost Of JavaScript in 2023
addyosmani
45
6.6k
Fashionably flexible responsive web design (full day workshop)
malarkey
404
65k
Thoughts on Productivity
jonyablonski
67
4.3k
It's Worth the Effort
3n
183
27k
A designer walks into a library…
pauljervisheath
202
24k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
46
2.1k
Navigating Team Friction
lara
183
14k
Docker and Python
trallard
40
3.1k
Designing for humans not robots
tammielis
249
25k
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