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.4k
ゲンバのクリーンアーキテクチャ - 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.8k
Other Decks in Programming
See All in Programming
SwiftUI Viewの責務分離
elmetal
PRO
1
240
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
340
社内フレームワークとその依存性解決 / in-house framework and its dependency management
vvakame
1
560
Formの複雑さに立ち向かう
bmthd
1
850
ソフトウェアエンジニアの成長
masuda220
PRO
10
1.1k
ペアーズでの、Langfuseを中心とした評価ドリブンなリリースサイクルのご紹介
fukubaka0825
2
320
JavaScriptツール群「UnJS」を5分で一気に駆け巡る!
k1tikurisu
9
1.8k
Pulsar2 を雰囲気で使ってみよう
anoken
0
240
Amazon ECS とマイクロサービスから考えるシステム構成
hiyanger
2
560
技術を根付かせる / How to make technology take root
kubode
1
250
Spring gRPC について / About Spring gRPC
mackey0225
0
220
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
Featured
See All Featured
Thoughts on Productivity
jonyablonski
69
4.5k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Building an army of robots
kneath
303
45k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
Speed Design
sergeychernyshev
27
790
Six Lessons from altMBA
skipperchong
27
3.6k
Faster Mobile Websites
deanohume
306
31k
Navigating Team Friction
lara
183
15k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
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