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
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
270
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
760
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
3
470
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
190
testcontainers のススメ
sgash708
1
120
return文におけるstd::moveについて
onihusube
1
1.1k
nekko cloudにおけるProxmox VE利用事例
irumaru
3
430
Security_for_introducing_eBPF
kentatada
0
110
DevFest Tokyo 2025 - Flutter のアプリアーキテクチャ現在地点
wasabeef
5
910
103 Early Hints
sugi_0000
1
230
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
390
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
130
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Raft: Consensus for Rubyists
vanstee
137
6.7k
Building a Scalable Design System with Sketch
lauravandoore
460
33k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
GraphQLとの向き合い方2022年版
quramy
44
13k
Docker and Python
trallard
42
3.1k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
2
290
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Music & Morning Musume
bryan
46
6.2k
How To Stay Up To Date on Web Technology
chriscoyier
789
250k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Fantastic passwords and where to find them - at NoRuKo
philnash
50
2.9k
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