ゲンバのクリーンアーキテクチャ - Scala play プロジェクト設計のお話 -

E87ea92925b9f4a21e328e9c5a514083?s=47 Yad
March 26, 2016

ゲンバのクリーンアーキテクチャ - Scala play プロジェクト設計のお話 -

2016/03/26 Developers.IO 2016 in Osaka #cmdevio2016 発表資料

E87ea92925b9f4a21e328e9c5a514083?s=128

Yad

March 26, 2016
Tweet

Transcript

  1. ήϯόͷ ΫϦʔϯΞʔΩςΫνϟ 4DBMBQMBZϓϩδΣΫτઃܭͷ͓࿩   ҆ୡ༐Ұ Ϋϥεϝιουגࣜձࣾ ೥݄೔ ⡥$MBTTNFUIPE *OD

  2.  ҆ୡɹ༐Ұ • 2013/12 ೖࣾ • TwitterID: @UsrNameu1 • Github:

    https://github.com/ UsrNameu1 • Blog: http://dev.classmethod.jp/ author/yad • ͜͜Ұ೥͸αʔόʔαΠυϝΠϯ
  3. ࠓ೔࿩͞ͳ͍͜ͱ w %%%ʢυϝΠϯۦಈઃܭʣͷσΟςʔϧ w ߴ౓ͳؔ਺ܕݴޠͷτϐοΫʢݍ࿦ɺϞφυFUDʜʣ  ⡥$MBTTNFUIPE *OD

  4. ຊ೔ͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ͸ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ 

    ⡥$MBTTNFUIPE *OD
  5. ຊ೔ͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ͸ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ 

    ⡥$MBTTNFUIPE *OD
  6. ΫϦʔϯΞʔΩςΫνϟͱ͸ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻ 

    ⡥$MBTTNFUIPE *OD
  7. ΫϦʔϯΞʔΩςΫνϟͱ͸ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻ 

    ⡥$MBTTNFUIPE *OD
  8. ΫϦʔϯΞʔΩςΫνϟ֓ཁ  ⡥$MBTTNFUIPE *OD IUUQCMPHUIMJHIUDPNVODMFCPC UIFDMFBOBSDIJUFDUVSFIUNM UI-JHIU *ODͷ6ODMF#PCࢯ͕ఏҊ

  9.  ⡥$MBTTNFUIPE *OD ʮؔ৺ͷ෼཭ʯΛ໨తͱ͢Δ༷ʑͳΞʔΩςΫνϟ Λ୯Ұͷ֓೦ʹ౷߹ w ϔΩαΰφϧΞʔΩςΫνϟ  ๜༁ॻɿ࣮ફςετۦಈ։ൃʣ w

    ΦχΦϯΞʔΩςΫνϟ ݩهࣄɿIUUQKF⒎SFZQBMFSNPDPNCMPHUIFPOJPOBSDIJUFDUVSFQBSUʣ w %BUB$POUFYU*OUFSBDUJPO  ༸ॻɿ-FBOBSDIJUFDUVSFʣ w #PVOEBSZ $POUSPM &OUJUZ  ๜༁ॻɿΦϒδΣΫτࢦ޲ιϑτ΢ΣΞ޻ֶ004&ʣ
  10. ΫϦʔϯΞʔΩςΫνϟͱ͸ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻ 

    ⡥$MBTTNFUIPE *OD
  11. w ϓϩδΣΫτϨϕϧͷϏδωεϧʔϧɾϩδοΫΛ ΧϓηϧԽͨ͠΋ͷ w ֎ଆͷԿ͔͕มԽͯ͠΋͔ΘΒͳ͍ w Ώ͑ʹɺ͜ͷޙઆ໌͢ΔϢʔεέʔε ΠϯλʔϑΣΠεΞμϓλʔʹ͸ඇґଘ ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ 

    ⡥$MBTTNFUIPE *OD ΤϯςΟςΟ &OUJUJFT
  12. w ΞϓϦέʔγϣϯϨϕϧͷϏδωεϧʔϧɺϩδοΫΛΧϓ ηϧԽͨ͠΋ͷ w ಺ଆͷΤϯςΟςΟͷΈΛ༻͍ͯ໨తΛୡ੒͢Δ w ֎ଆͷԿ͔͕มԽͯ͠΋͔ΘΒͳ͍ w Ώ͑ʹɺ͜ͷޙઆ໌͢Δ ɹΠϯλʔϑΣΠεΞμϓλʔʹ͸

    ɹඇґଘ  ⡥$MBTTNFUIPE *OD Ϣʔεέʔε &OUJUJFT 6TFDBTFT
  13. w σʔλϕʔεɺ6*ɺ"1**'ɺ֎෦γεςϜͷػೳʹ࠷΋ศ རͳܗࣜʹσʔλΛม׵ $POUSPMMFS %"0  w ֤ػೳͷΞμϓλ͸ϢʔεέʔεΛ௨ͯ͡ଞͷΞμϓλͱ΍ ΓऔΓ͢ΔʢଞͷػೳͷΞμϓλΛ௚઀஌Βͳ͍ʣ w

    ֤ػೳʹݻ༗ͷσʔλߏ଄ ɹ͸͜͜Ͱ಺෦ʢϢʔεέʔεɾ ɹΤϯςΟςΟʣͷѻ͍΍͍͢ ɹσʔλߏ଄ʹม׵͞ΕΔ  ⡥$MBTTNFUIPE *OD ΠϯλʔϑΣΠεΞμϓλʔ &OUJUJFT 6TFDBTFT *OUFSGBDFBEBQUFS %# 6* "1**' ֎෦γεςϜ '8
  14. ίʔυͷґଘੑ͸ ৗʹ಺ଆʹ޲͔͏  ⡥$MBTTNFUIPE *OD

  15. ΫϦʔϯΞʔΩςΫνϟͱ͸ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻ 

    ⡥$MBTTNFUIPE *OD
  16. ΫϦʔϯΞʔΩςΫνϟͱ%*%*1  ⡥$MBTTNFUIPE *OD ࣮ࡍͷ੍ޚϑϩʔʹ͸֎ଆʹ޲͔͏έʔε͕͋Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*

    "1**' %# $BDIF
  17.  ⡥$MBTTNFUIPE *OD ͜ͷΑ͏ͳίϯϙʔωϯτؒͷؔ܎͸ ίʔυͷґଘੑ͕ৗʹ಺ଆʹ޲͔͏ݪଇʹ൓͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*

    "1**' ͇ %# $BDIF
  18.  ⡥$MBTTNFUIPE *OD ͜ͷ໰୊Λଧ։͢ΔͨΊɺ 6TFDBTFT૚ʹσʔλετΞந৅Λ࡞੒͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*

    "1**' 4UPSF %# $BDIF
  19.  ⡥$MBTTNFUIPE *OD ͍··Ͱ6TFDBTFT૚͔Β௚઀ࢀর͍ͯͨ͠ ֎෦ͷ%"0͸6TFDBTFT૚ͷ σʔλετΞந৅Λ࣮૷͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF

    6* "1**' 4UPSF %# $BDIF
  20.  ⡥$MBTTNFUIPE *OD 6TFDBTFT૚ͷαʔϏε͸͋͘·Ͱ 6TFDBTFT૚ͷσʔλετΞந৅Λར༻ͯ͠ ػೳΛ࣮ݱ͢Δ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF

    6* "1**' 4UPSF %# $BDIF
  21.  ⡥$MBTTNFUIPE *OD ͜ͷछͷιʔείʔυґଘੑͱ੍ޚͷྲྀΕͷ൓సΛ %*1 %FQFOEFODZ*OWFSTJPO1SJODJQMFґଘੑٯసͷݪଇ  ͱ͍͍ɺ͜ΕΛ࢖ͬͯ಺ଆ΁ͷίʔυґଘੑΛอͯΔ &OUJUJFT %"0

    $POUSPMMFS 4FSWJDF 6* "1**' 4UPSF %*1 %# $BDIF
  22.  ⡥$MBTTNFUIPE *OD ͜ΕΒͷιʔείʔυؒͷґଘੑͷղܾʹ͸ %* %FQFOEFODZ*OKFDUJPOґଘੑ஫ೖ ίϯςφ͕࢖͑Δ ͨͩ͠ɺҰ෦ઃఆ͕ඞཁ &OUJUJFT %"0

    $POUSPMMFS 4FSWJDF 6* "1**' 4UPSF %*$POUBJOFS DPOG %*1 %# $BDIF
  23. ΫϦʔϯΞʔΩςΫνϟͱ͸ w ΫϦʔϯΞʔΩςΫνϟ֓ཁ w ΫϦʔϯΞʔΩςΫνϟͷొ৔ਓ෺ୡ w ΫϦʔϯΞʔΩςΫνϟͱ%*%*1 w ΫϦʔϯΞʔΩςΫνϟͷޮ༻ 

    ⡥$MBTTNFUIPE *OD
  24.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ϑϨʔϜϫʔΫ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ΫϦʔϯΞʔΩςΫνϟͷޮ༻ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT

    'SBNFXPSL -JCSBSZ 4%, &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
  25.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ϑϨʔϜϫʔΫ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ΫϦʔϯΞʔΩςΫνϟͷޮ༻ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT

    'SBNFXPSL -JCSBSZ 4%, &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ಺ଆͷϨΠϠ͸ ϑϨʔϜϫʔΫ౳ͷ มߋʹӨڹΛड͚ͳ͍
  26.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ 6*ɺ"1*ͷ*'͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT 6*ɾ"1**'

    &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
  27.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ 6*ɺ"1*ͷ*'͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT 6*ɾ"1**'

    &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ಺ଆͷϨΠϠ͸ 6*ɺ"1**'ͷ มߋʹӨڹΛ ड͚ͳ͍
  28.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ σʔλϕʔε͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS

    6TFDBTFT %# $BDIF &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 
  29.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ σʔλϕʔε͔Βಠཱͨ͠γεςϜΛੜΈग़͢ ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS

    6TFDBTFT %# $BDIF &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF  6TFDBTFTΑΓ ಺ଆͷϨΠϠ͸ %# $BDIFͷ มߋʹӨڹΛ ड͚ͳ͍
  30.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ֎෦ػೳ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT ֎෦"1*

    ֎෦γεςϜ &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF
  31.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ֎෦ػೳ͔Βಠཱͨ͠γεςϜΛੜΈग़͢ &OUJUJFT %"0 $POUSPMMFS 6TFDBTFT ֎෦"1*

    ֎෦γεςϜ &YUFSOBM "1*$MJFOU "84 $MJFOU 4FSWJDF 6TFDBTFTΑΓ ಺ଆͷϨΠϠ͸ ֎෦"1*ɺγεςϜͷ มߋʹӨڹΛ ड͚ͳ͍
  32.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ςελϏϦςΟʹ༏ΕͨγεςϜΛੜΈग़͢ %# $BDIF 6*ɾ"1**' &OUJUJFT %"0

    $POUSPMMFS 4FSWJDF 4UPSF
  33.  ⡥$MBTTNFUIPE *OD ΫϦʔϯΞʔΩςΫνϟ͸ ςελϏϦςΟʹ༏ΕͨγεςϜΛੜΈग़͢ %# $BDIF 6*ɾ"1**' &OUJUJFT %"0

    $POUSPMMFS 4FSWJDF 4UPSF ֎෦ʹ௚઀ґଘ͍ͯ͠ͳ͍ͨΊ 6TFDBTFT &OUJUJFT ͷςετʹ͸ ୯७ͳϞοΫͱ ࣄલ৚݅ͷΈ͕ඞཁ
  34. ຊ೔ͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ͸ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ 

    ⡥$MBTTNFUIPE *OD
  35. ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞ೰Μͩͱ͜Ζ  ⡥$MBTTNFUIPE *OD

  36. ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞ೰Μͩͱ͜Ζ  ⡥$MBTTNFUIPE *OD

  37. ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ  ⡥$MBTTNFUIPE *OD ։ൃ؀ڥ w +BWB w 4DBMB w

    TCU w QMBZ w BXTTEL ༻్ w େ͖ͳμ΢ϯϩʔυ਺͕૝ఆ͞ΕΔϞόΠϧΞϓϦͷ όοΫΤϯυ"1*
  38. ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ  ⡥$MBTTNFUIPE *OD !"" app $"" controllers $"" core

    $"" domains $"" infrastructures $"" modules !"" services
  39. ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ  ⡥$MBTTNFUIPE *OD !"" app $"" controllers $"" core

    $"" domains $"" infrastructures $"" modules !"" services *OUFSGBDF"EBQUFSϨΠϠ 6TFDBTFTϨΠϠ &OUJUJFTϨΠϠ $PSFϨΠϠ %*ίϯςφઃఆ
  40. ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞ೰Μͩͱ͜Ζ  ⡥$MBTTNFUIPE *OD

  41. !"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala

    !"" SomeEndpointResultGenerator.scala  ⡥$MBTTNFUIPE *OD DPOUSPMMFST഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ ύοέʔδͱϨΠϠͷରԠ
  42. !"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala

    !"" SomeEndpointResultGenerator.scala  ⡥$MBTTNFUIPE *OD DPOUSPMMFST഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷม׵Λ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ ύοέʔδͱϨΠϠͷରԠ
  43. !"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala

    !"" SomeEndpointResultGenerator.scala  ⡥$MBTTNFUIPE *OD DPOUSPMMFST഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷม׵Λ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ 3PVUFT΁ͷϦΫΤετΛࡹ͘ίϯτϩʔϥ ύοέʔδͱϨΠϠͷରԠ
  44. !"" controllers !"" someendpoint $"" RequestBodyConverter.scala $"" ResponseBodyConverter.scala $"" SomeEndpointController.scala

    !"" SomeEndpointResultGenerator.scala  ⡥$MBTTNFUIPE *OD DPOUSPMMFST഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ "1**'ʹؔΘΔػೳΛఏڙͨ͠ +TPO㱻&OUJUZͷม׵Λ୲͏3FBET 8SJUFT͕ هड़͞Εͨίϯόʔλ 3PVUFT΁ͷϦΫΤετΛࡹ͘ίϯτϩʔϥ ಺෦ɺ֎෦Ͱग़ͨΤϥʔΛΤϥʔϨεϙϯεʹม׵͢ΔϞδϡʔϧ ύοέʔδͱϨΠϠͷରԠ
  45.  ⡥$MBTTNFUIPE *OD !"" infrastructures !"" somesystem $"" apiclients $""

    awsclients !"" dbclients JOGSBTUSVDUVSFT഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84΁ͷػೳΛఏڙͨ͠
  46. !"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients

     ⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFT഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84΁ͷػೳΛఏڙͨ͠ ֎෦"1*΁ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈
  47. !"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients

     ⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFT഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84΁ͷػೳΛఏڙͨ͠ ֎෦"1*΁ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈ %#Ҏ֎ͷ"84αʔϏε΁ͷΞΫηεΛ୲͏ΫϥΠΞϯτ܈
  48. !"" infrastructures !"" somesystem $"" apiclients $"" awsclients !"" dbclients

     ⡥$MBTTNFUIPE *OD JOGSBTUSVDUVSFT഑ԼύοέʔδͰ͸ *OUFSGBDF"EBQUFSϨΠϠͷ͏ͪ %#$BDIF &YUFSOBM"1* "84΁ͷػೳΛఏڙͨ͠ ֎෦"1*΁ͷΞΫηεΛ୲͏"1*ΫϥΠΞϯτ܈ %#౳΁ͷΞΫηεΛ୲͏%"0܈ %#Ҏ֎ͷ"84αʔϏε΁ͷΞΫηεΛ୲͏ΫϥΠΞϯτ܈
  49.  ⡥$MBTTNFUIPE *OD !"" services !"" someusecase $"" SomeModelStore.scala !""

    FindSomeModelService.scala TFSWJDFT഑ԼύοέʔδͰ͸ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠
  50. !"" services !"" someusecase $"" SomeModelStore.scala !"" FindSomeModelService.scala  ⡥$MBTTNFUIPE

    *OD TFSWJDFT഑ԼύοέʔδͰ͸ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ σʔλετΞந৅ʢUSBJU 
  51. !"" services !"" someusecase $"" SomeModelStore.scala !"" FindSomeModelService.scala  ⡥$MBTTNFUIPE

    *OD TFSWJDFT഑ԼύοέʔδͰ͸ 6TFDBTFTϨΠϠͷϏδωεɾϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ σʔλετΞந৅ʢUSBJU  4PNF.PEFMऔಘαʔϏε
  52.  ⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""

    SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOT഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠͷσʔλߏ଄ɺϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠
  53.  ⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""

    SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOT഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠͷσʔλߏ଄ɺϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ 4PNF.PEFMΛද͢σʔλߏ଄
  54.  ⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""

    SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOT഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠͷσʔλߏ଄ɺϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ σʔλετΞந৅ʢUSBJU  4PNF.PEFMΛද͢σʔλߏ଄
  55.  ⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""

    SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOT഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠͷσʔλߏ଄ɺϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ σʔλετΞந৅ʢUSBJU  4PNF.PEFMΛද͢σʔλߏ଄ 4PNF.PEFMͷొ࿥Λද͢σʔλߏ଄
  56.  ⡥$MBTTNFUIPE *OD !"" domains !"" somemodel $"" SomeModel.scala $""

    SomeModelRepository.scala $"" SomeModelRegistration.scala !"" PublishSomeModelIdService.scala EPNBJOT഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠͷσʔλߏ଄ɺϧʔϧ ֎෦ϨΠϠͰ࣮૷͢Δந৅Λఏڙͨ͠ σʔλετΞந৅ʢUSBJU  4PNF.PEFMΛද͢σʔλߏ଄ 4PNF.PEFMͷొ࿥Λද͢σʔλߏ଄ 4PNF.PEFMͷ*EൃߦΛ͢ΔαʔϏε
  57.  ⡥$MBTTNFUIPE *OD DPSF഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠ͔ΒͰ΋ґଘͯ͠Α͍ ൚༻తͳػೳΛఏڙͨ͠ &OUJUJFT *OUFSGBDF"EBQUFST 6TFDBTFT DPSF

  58.  ⡥$MBTTNFUIPE *OD DPSF഑ԼύοέʔδͰ͸ &OUJUJFTϨΠϠ͔ΒͰ΋ґଘͯ͠Α͍ ൚༻తͳػೳΛఏڙͨ͠ &OUJUJFT *OUFSGBDF"EBQUFST 6TFDBTFT DPSF

    ɹྫɿ-PDBM%BUF5JNFͷ 0SEFSJOHUSBJUରԠ จࣈྻͷ੔਺Ϧετ΁ͷ ίϯόʔλ
  59. ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w ࣮ࡍͷϓϩδΣΫτύοέʔδߏ੒ྫ w ύοέʔδͱϨΠϠʔͷରԠ w ͦͷଞ೰Μͩͱ͜Ζ  ⡥$MBTTNFUIPE *OD

  60.  ⡥$MBTTNFUIPE *OD ͦͷଞ೰Μͩͱ͜Ζ w ৽ͨͳϑΟʔϧυͷ௥Ճ͸ଟ͘ͷ৔߹ɺ&OUJUJFTͷϑΟʔ ϧυʹӨڹͨ͠ɻ w ڥք͝ͱͷσʔλߏ଄ʢ%50ʣ͸͋·Γఆٛͤͣɺґଘϧʔ ϧతʹ͸໰୊͕ͳ͍ͱߟ͑ɺ*OUFSGBDF"EBQUFS΋

    &OUJUJFTͷσʔλߏ଄Λར༻ͨ͠ɻʢهࣄ಺Ͱ͸ਪ঑͞Ε ͍ͯͳ͍ʣ w ಉ༷ʹ%*1͸6TFDBTFT૚Λ·͕ͨͬͯ&OUJUJFTͷσʔλ ετΞந৅Λ௚઀*OUFSGBDF"EBQUFS͕࣮૷͢Δ͜ͱ͕ ͋ͬͨɻ
  61.  ⡥$MBTTNFUIPE *OD ͦͷଞ೰Μͩͱ͜Ζ w 9994FSWJDFͱ͍͏໊લͷϏδωεϩδοΫΛ6TF DBTFTϨΠϠ͔&OUJUJFTϨΠϠʹஔ͔͘Ͱ໎ͬͨɻ w 6TFDBTFTϨΠϠͷϩδοΫ͕ಉ͡Α͏ͳՕॴͰ͔ͭͦΕ ͕ϓϩδΣΫτશମͱͯ͠ڞ௨ʹ༻͍ΒΕͦ͏ͳ֓೦ͷ৔

    ߹ɺ&OUJUJFTʹ͓͘ͱ͍͏҉໧ͷج४͸͋ͬͨɻ w ϓϩδΣΫτશମͰͷڞ༻ϥΠϒϥϦͰ΋ڞ௨ͷ *OUFSGBDF"EBQUFS͕͋ͬͨͨΊɺڞ༻ϥΠϒϥϦͷύο έʔδߏ੒͸ΞϓϦέʔγϣϯͱಉ͡Α͏ͳ΋ͷʹͳͬͨɻ
  62. ຊ೔ͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ͸ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ 

    ⡥$MBTTNFUIPE *OD
  63. %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑ஫ೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ 

    ⡥$MBTTNFUIPE *OD
  64. %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑ஫ೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ 

    ⡥$MBTTNFUIPE *OD
  65.  ⡥$MBTTNFUIPE *OD %*1ʢґଘੑٯసͷݪଇʣ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6* "1**'

    4UPSF %*1 %# $BDIF લड़ͷ௨ΓɺΫϦʔϯΞʔΩςΫνϟʹ͸%*1͕ඞཁ
  66. %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑ஫ೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ 

    ⡥$MBTTNFUIPE *OD
  67.  ⡥$MBTTNFUIPE *OD %*ʢґଘੑ஫ೖʣ ͦͯ͠%*1ͷ࣮ݱʹ͸%*ίϯςφΛར༻ͨ͠ &OUJUJFT %"0 $POUSPMMFS 4FSWJDF 6*

    "1**' 4UPSF %*$POUBJOFS DPOG %*1 %# $BDIF
  68. %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑ஫ೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ 

    ⡥$MBTTNFUIPE *OD
  69. (PPHMFHVJDF  ⡥$MBTTNFUIPE *OD w ґଘੑ஫ೖͷͨΊͷίϯςφ w 1MBZ͔Β1MBZଆͰ΋αϙʔτ w +43ʢ%FQFOEFODZ*OKFDUJPOGPS+BWBʣͷ

    ϦϑΝϨϯε࣮૷ w ϥϯλΠϜ࣌%*ʢ㱻ίϯύΠϧ࣌%*ʣ
  70. %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w %*1ʢґଘੑٯసͷݪଇʣ w %*ʢґଘੑ஫ೖʣ w (PPHMF(VJDF w (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ 

    ⡥$MBTTNFUIPE *OD
  71. (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ  ⡥$MBTTNFUIPE *OD &OUJUJFT %"0 $POUSPMMFS 4FSWJDF "1**' 4UPSF

    %*$POUBJOFS DPOG %*1 $BDIF ԼͷΑ͏ͳΞϓϦέʔγϣϯΛ%*Λ༻͍࣮ͯ૷͢Δ
  72. (VJDFʹΑΔ%*ͱ%*1ͷ࣮૷ྫ  ⡥$MBTTNFUIPE *OD IUUQTHJUIVCDPN6TS/BNFV3FEJT%*4BNQMF ιʔείʔυ͸ͪ͜Βˣ

  73.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந৅ trait SomeModelStore { def findById( identifier:

    String ): Future[Option[SomeModel]] }
  74.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந৅ trait SomeModelStore { def findById( identifier:

    String ): Future[Option[SomeModel]] } 6TFDBTFTϨΠϠͷந৅σʔλετΞ͸ USBJUͰ࣮૷ͨ͠
  75.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷσʔλετΞந৅ trait SomeModelStore { def findById( identifier:

    String ): Future[Option[SomeModel]] } *%Λࢦఆͯ͠ ϞσϧΛಘΔ ͳ͚Ε͹/POF 6TFDBTFTϨΠϠͷந৅σʔλετΞ͸ USBJUͰ࣮૷ͨ͠
  76.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮૷ class FindSomeModelService @Inject()( store: SomeModelStore )

    { def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) }
  77.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮૷ class FindSomeModelService @Inject()( store: SomeModelStore )

    { def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) } 4FSWJDF͸%*͞Εͨ6TFDBTFTϨΠϠͷ ந৅σʔλετΞΛར༻͢Δ
  78.  ⡥$MBTTNFUIPE *OD 6TFDBTFTϨΠϠͷ4FSWJDF࣮૷ class FindSomeModelService @Inject()( store: SomeModelStore )

    { def findById( identifier: String ): Future[Option[SomeModel]] = store.findById(identifier) } 4FSWJDF͸%*͞Εͨ6TFDBTFTϨΠϠͷ ந৅σʔλετΞΛར༻͢Δ 4FSWJDF͸ந৅σʔλετΞಉ࢜ͷ ୯७ͳ૊Έ߹ΘͤΛ࣮૷͢Δ
  79.  ⡥$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 } } } }
  80.  ⡥$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λάʹΑͬͯ%*͢ΔΠϯελϯεͷ ੍ޚΛߦ͑Δ
  81.  ⡥$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͸࣮૷͢Δ
  82.  ⡥$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ˠϞσϧʹม׵ͯ͠ Ξ΢τϓοτ
  83.  ⡥$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
  84.  ⡥$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ϨΠϠͷ αʔϏεΛར༻͢Δ
  85.  ⡥$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ϨΠϠͷ αʔϏεΛར༻͢Δ
  86.  ⡥$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 ) }
  87.  ⡥$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Λܧঝͯ͠ઃఆΫϥεΛͭ͘Δ
  88.  ⡥$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Λܧঝͯ͠ઃఆΫϥεΛͭ͘Δ
  89.  ⡥$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઀ଓͷͨΊͷ ΫϥεΛઃఆ
  90.  ⡥$MBTTNFUIPE *OD )0$0/ )VNBO0QUJNJ[FE$POpH0CKFDU /PUBUJPO ϑΥʔϚοτͰએݴ͞Εͨ %*ίϯςφͷઃఆΫϥεରԠDPOGϑΝΠϧ redis {

    host = "localhost" port = "6379" } play.modules.enabled += modules.AppDependencyModule
  91.  ⡥$MBTTNFUIPE *OD )0$0/ )VNBO0QUJNJ[FE$POpH0CKFDU /PUBUJPO ϑΥʔϚοτͰએݴ͞Εͨ %*ίϯςφͷઃఆΫϥεରԠDPOGϑΝΠϧ redis {

    host = "localhost" port = "6379" } play.modules.enabled += modules.AppDependencyModule 3FEJTʹ༻͍ΔIPTU QPSUએݴ QMBZͷΞϓϦέʔγϣϯʹ ઌ΄Ͳͷ%*ઃఆΫϥεΛಡΈ͜·ͤΔ
  92. ຊ೔ͷτϐοΫ w ΫϦʔϯΞʔΩςΫνϟͱ͸ w ϨΠϠʔͷ۠ผΛͲ͏ߦ͔ͬͨ w %*%*1Λ࢖ͬͯͲ͏࣮૷͔ͨ͠ w ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ 

    ⡥$MBTTNFUIPE *OD
  93. ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿΍͍ͨ͠ w $BTF෦෼తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*Λ௥Ճ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖׵͍͑ͨ 

    ⡥$MBTTNFUIPE *OD
  94. ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿΍͍ͨ͠ w $BTF෦෼తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*Λ௥Ճ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖׵͍͑ͨ 

    ⡥$MBTTNFUIPE *OD
  95. $BTF ϨεϙϯεͷϑΟʔϧυ Λ૿΍͍ͨ͠  ⡥$MBTTNFUIPE *OD w ΋ͱ΋ͱ֎෦"1*ͷΈʹґଘ͍ͯͨ͠ΤϯυϙΠϯτ ͷ+TPOϑΟʔϧυʹ৽͍͠ϑΟʔϧυΛ௥Ճ͍ͨ͠ w

    ϑΟʔϧυͷ஋͸֎෦"1*ͷϑΟʔϧυΛ΋ͱʹม׵ ͞Εͨ΋ͷΛ࢖͍͍ͨ ֎քͷ࡞༻ʢ࢓༷มߋʣͷ಺༰
  96.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**'
  97.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ ௥Ճ
  98.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏ଄ʹ ৽͍͠ϑΟʔϧυΛ௥Ճ $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ ௥Ճ
  99.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏ଄ʹ ৽͍͠ϑΟʔϧυΛ௥Ճ $POUSPMMFSɺ֎෦"1*ͷ Ϩεϙϯε+TPOίϯόʔλ ʹ৽͍͠ϑΟʔϧυͷ ௥Ճ ϑΟʔϧυಛ༗ͷϩδοΫΛ ॻ͔ͳ͔ͬͨ 6TFDBTFTϨΠϠ͸ ࡞༻ͷӨڹΛड͚ͳ͍
  100.  ⡥$MBTTNFUIPE *OD ૝ఆ͞ΕΔ6TFDBTFTϨΠϠͷ໾ׂʹର͢ΔԾઆ w &OUJUJFTϨΠϠͷ֤छσʔλߏ଄ͷಛఆͷϑΟʔϧυʹؔ ࿈ͨ͠ϩδοΫ͸ΞϓϦέʔγϣϯಛ༗ͱ͍͏ΑΓ͸ϓϩ δΣΫτશମͱͯ͠ͷϏδωεɾϧʔϧͱͯ͠ѻͬͨ΄͏ ͕֎քͷ࡞༻ʹ͸ڧ͍͔΋͠Εͳ͍ w

    Ώ͑ʹɺ6TFDBTFTϨΠϠʹஔ͘ϩδοΫ͸ಛఆͷϑΟʔ ϧυʹґଘ͠ͳ͍΋ͷΛஔ͍ͨ΄͏͕Α͍͔΋͠Εͳ͍
  101. ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿΍͍ͨ͠ w $BTF෦෼తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*Λ௥Ճ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖׵͍͑ͨ 

    ⡥$MBTTNFUIPE *OD
  102. $BTF̎ ෦෼తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*Λ௥Ճ͍ͨ͠  ⡥$MBTTNFUIPE *OD w ͦΕ·ͰผͷΤϯυϙΠϯτͰѻ͍ͬͯͨ ෦෼తͳϑΟʔϧυʹؔ͢Δ࠷৽ͷ৘ใΛฦ٫͢Δ৽ ͍͠ΤϯυϙΠϯτΛ࡞੒͍ͨ͠

    w ࠷৽ͷ৘ใ΁ͷߋ৽͸֎෦"1*Λͨͨ͘ඞཁ͕͋Δ ֎քͷ࡞༻ʢ࢓༷มߋʣͷ಺༰
  103.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**'
  104.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' ࠷৽ͷ৘ใऔಘ ΤϯυϙΠϯτ޲͚ ΞΫγϣϯΛ௥Ճ
  105.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' ࠷৽ͷ৘ใߋ৽"1* ΫϥΠΞϯτΛ௥Ճ ࠷৽ͷ৘ใऔಘ ΤϯυϙΠϯτ޲͚ ΞΫγϣϯΛ௥Ճ
  106.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' ࠷৽ͷ৘ใߋ৽"1* ΫϥΠΞϯτΛ௥Ճ ࠷৽৘ใऔಘ αʔϏεΛ ௥Ճ ࠷৽ͷ৘ใऔಘ ΤϯυϙΠϯτ޲͚ ΞΫγϣϯΛ௥Ճ
  107.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT ֎෦"1* &YUFSOBM "1*$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ Ϟσϧσʔλߏ଄͸ ߏ଄Խ͞Ε͍ͯΔͨΊ ࡞༻ͷӨڹΛड͚ͳ͍ ࠷৽ͷ৘ใߋ৽"1* ΫϥΠΞϯτΛ௥Ճ ࠷৽৘ใऔಘ αʔϏεΛ ௥Ճ ࠷৽ͷ৘ใऔಘ ΤϯυϙΠϯτ޲͚ ΞΫγϣϯΛ௥Ճ
  108.  ⡥$MBTTNFUIPE *OD ૝ఆ͞ΕΔ&OUJUJFTϨΠϠͷσʔλߏ଄ʹؔ͢ΔԾઆ w &OUJUJFTϨΠϠͷ֤छσʔλߏ଄͸ߏ଄Խ͓ͯ͘͠ͱ ෦෼తͳมߋ͕ೖͬͨ࣌ͷӨڹΛ͏͚ͳ͍͔΋͠Εͳ͍ w σʔλߏ଄Λ͍͔ʹߏ଄Խ͢΂͖͔ʹ͍ͭͯ͸%%%ͷϢϏ Ωλεݴޠͷ֓೦͕ࢀߟʹͳΔ͔΋͠Εͳ͍

  109. ֎քͷ࡞༻ͱͲ͏޲͖߹͔ͬͨ w $BTFϨεϙϯεͷϑΟʔϧυΛ૿΍͍ͨ͠ w $BTF෦෼తͳϑΟʔϧυ܈Λฦ٫͢Δ ৽͍͠"1*Λ௥Ճ͍ͨ͠ w $BTFॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖׵͍͑ͨ 

    ⡥$MBTTNFUIPE *OD
  110. $BTF̏ ॺ໊͖ͭ63-Λ௨ৗͷ63-ʹ ஔ͖׵͍͑ͨ  ⡥$MBTTNFUIPE *OD w $MPVE'SPOUͷॺ໊͖ͭ63-Λ ௨ৗͷ$MPVE'SPOU63-ʹஔ͖׵͍͑ͨ w

    ΋ͱ΋ͱ&OUJUJFTʹ͸ʮॺ໊͖ͭ63-ൃߦαʔϏ εʯ͕͋ͬͨ ֎քͷ࡞༻ʢ࢓༷มߋʣͷ಺༰
  111.  ⡥$MBTTNFUIPE *OD ॺ໊͖ͭ63-ͷൃߦ IUUQEFWDMBTTNFUIPEKQDMPVEBXT DGTEFMJWFSJFTVTFTJHOVSM 4FFBMTP

  112.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU

    4FSWJDF "1**'
  113.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU

    4FSWJDF "1**' 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม׵͢Δػೳʹमਖ਼
  114.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃ཭ͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม׵͢Δػೳʹमਖ਼
  115.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃ཭ͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม׵͢Δػೳʹमਖ਼ &OUJUJFTͷมߋʹ߹Θͤͨ ίʔυͷमਖ਼͕ൃੜ
  116.  ⡥$MBTTNFUIPE *OD Ͳ͏޲͖߹͔ͬͨ &OUJUJFT $POUSPMMFS 6TFDBTFT "84ɹ $MPVE'SPOU "84$MJFOU

    4FSWJDF "1**' &OUJUJFTͷ αʔϏεͷ໊લ͕࣮ଶͱ ဃ཭ͯ͠͠·ͬͨͨΊ मਖ਼͕ൃੜͨ͠ 4ͷΩʔ໊͔Βͷ ॺ໊͖ͭ63- ൃߦػೳΛ 4ͷΩʔ໊͔Β $MPVE'SPOUͷ63-ʹ ม׵͢Δػೳʹमਖ਼ &OUJUJFTͷมߋʹ߹Θͤͨ ίʔυͷमਖ਼͕ൃੜ "1**'मਖ਼͕ͳ͍ͨΊ ࡞༻ͷӨڹΛड͚ͳ͍
  117.  ⡥$MBTTNFUIPE *OD ૝ఆ͞ΕΔ&OUJUJFTϨΠϠͷαʔϏεʹؔ͢ΔԾઆ w &OUJUJFTϨΠϠͷαʔϏεʹରͯ͠ɺʮॺ໊͖ͭ63-ൃ ߦʯͱ͍͏۩ମతͳ໊લΛ͚ͭͯ͠·ͬͨ͜ͱʹΑͬͯɺ େن໛ͳमਖ਼͕ൃੜͨ͠ͱߟ͑ΒΕΔ w αʔϏεͷ໊લ͕࠷ॳ͔Βʮ63-ม׵ʯͩͬͨΒେن໛ͳ

    ม׵͸ى͜Βͳ͔͔ͬͨ΋͠Εͳ͍ w Αͬͯɺ&OUJUJFTϨΠϠͷαʔϏεʹରͯ͠͸Πϯϑϥʹ ґଘ͠ͳ͍Α͏ͳɺΑΓϏδωεϩδοΫͱͯ͠ͷந৅౓ ͷߴ໊͍લΛ͚ͭͨํ͕Α͔͔ͬͨ΋͠Εͳ͍
  118. ·ͱΊ w ΫϦʔϯΞʔΩςΫνϟ͸֎ք΁ͷґଘੑΛഉআ͠ɺ ίʔυͷґଘੑΛϓϩδΣΫτશମͷϩδοΫΛදݱ ͨ͠σʔλߏ଄ɺαʔϏεʹΉ͚Δ w ݩهࣄͷ಺༰Λݫີʹద༻͠ͳͯ͘΋͏·͍͘͘έʔε ͸͋Δ w ஫ҙਂ͘ύοέʔδΘ͚Λ͢Ε͹ɺ֎քͷ࡞༻ʹର͠

    ͯಛఆͷϨΠϠΛத৺ͱ͢ΔมߋͰࡁΉ  ⡥$MBTTNFUIPE *OD
  119. ࢀߟαΠτ  ⡥$MBTTNFUIPE *OD w 5IF$MFBO"SDIJUFDUVSF IUUQCMPHUIMJHIUDPNVODMFCPCUIFDMFBOBSDIJUFDUVSFIUNM w ΞʔΩςΫνϟͷ໨త͸ҙਤͰ͋ΓɺϑϨʔϜϫʔΫͰ͸ͳ͍ IUUQXXXJOGPRDPNKQOFXTBSDIJUFDUVSF@JOUFOU@GSBNFXPSLT