Slide 1

Slide 1 text

+)JQTUFSͰ ֶͿʂ 4QSJOHʹΑΔαʔόαΠυ։ൃख๏ ++6($$$4QSJOH DDD@G

Slide 2

Slide 2 text

4ZTUFN"SDIJUFDU 4ZTUFN"SDIJUFDU +BWB ͚͜͟ 8IPBN*

Slide 3

Slide 3 text

ࠂ஌ʂʂ

Slide 4

Slide 4 text

,"/+"7"1"35: େࡕ ೔ຊϚΠΫϩιϑτؔ੢ࢧࣾ

Slide 5

Slide 5 text

ࠓ೔ͷΰʔϧ https://flic.kr/p/23R1Tx

Slide 6

Slide 6 text

+)JQTUFSͱ͸ https://flic.kr/p/4ms8ZA

Slide 7

Slide 7 text

8IZ+)JQTUFS https://flic.kr/p/dGrMZz

Slide 8

Slide 8 text

-FBSO4QSJOH XJUI+)JQTUFS https://flic.kr/p/qex9y4

Slide 9

Slide 9 text

(SFBU4QSJOH 'VO+)JQTUFS ʘ͢͝ʔ͍ʂͨͷ͠ʔʂʗ

Slide 10

Slide 10 text

஫ҙࣄ߲ʂ https://flic.kr/p/qSmXKV

Slide 11

Slide 11 text

͜ͷΑ͏ͳ΋ͷ͸͍͟͝·ͥΜɻɻɻ ؗد؄װ؝د؆

Slide 12

Slide 12 text

ࠓ೔ͷର৅ऀ 4QSJOH͸Ұ௨Γษڧͨ͠ʂ ޮ཰తͳ։ൃख๏Λ୳ٻத ໌೔ʹͰ΋αʔϏεΛ্ཱ͍ͪ͛ͨʂ https://flic.kr/p/oowrrL ͰɺͲ͏։ൃ͢Ε͹ʁ

Slide 13

Slide 13 text

"HFOEB (FUUJOH4UBSU +)JQTUFSͱ͸ -FBSOXJUI+)JQTUFS ·ͱΊ

Slide 14

Slide 14 text

"HFOEB (FUUJOH4UBSU +)JQTUFSͱ͸ -FBSOXJUI+)JQTUFS ·ͱΊ

Slide 15

Slide 15 text

+)JQTUFSJTB:FPNBOHFOFSBUPS 4QSJOH#PPU"OHVMBS Ϟμϯ8FCΞϓϦέʔγϣϯΛૉૣ͘࡞ΕΔ͜ͱΛ໨త Φʔϓϯιʔε :FPNBO͸Ϟμϯ8FCΞϓϦέʔγϣϯΛఏڙ͢Δ4DB⒎PMEπʔϧ ͢΂ͯ(JU)VCͰ։ൃɻ"QBDIFMJDFOTFEɻ ਓͷ։ൃऀͱਓͷίϯτϦϏϡʔλ IUUQTHJUIVCDPNKIJQTUFSHFOFSBUPSKIJQTUFS +)JQTUFSJT

Slide 16

Slide 16 text

4DB⒎PME5PPMJT ʮTDB⒎PMEʢεΩϟϑΥʔϧυʣʯ͸ʮ଍৔ʯͱ͍͏ҙຯͰ͢ɻ ʮ଍৔ʯͱ͍͏໊ͷ௨ΓɺΞϓϦέʔγϣϯͷͻͳܗͱͳΔ ιʔείʔυΛࣗಈੜ੒͠·͢ɻ

Slide 17

Slide 17 text

)JTUPSZ ೥݄ʹ+VMJFO%VCPJTʹΑͬͯ։࢝͞Ε·ͨ͠ɻ ࠷ॳͷެࣜϦϦʔε WFSTJPO ͕೥݄೔ɻ ͦΕҎདྷɺ΋ͷϦϦʔε͕͞Ε͍ͯ·͢ʂʢݱࡏʣ

Slide 18

Slide 18 text

8IZ+)JQTUFS https://flic.kr/p/dGrMZz

Slide 19

Slide 19 text

#PIWNCT 5RTKPI$QQV 4QSJOH#PPUͱ"OHVMBS͸ɺ ૉ੖Β͍͠ϑϧελοΫϑϨʔϜϫʔΫͰ͢ɻ

Slide 20

Slide 20 text

#PIWNCT Ͱ͕͢ɺͱͯ΋େ͖ͳϑϨʔϜϫʔΫͰ͢ɻ शಘίετ΋େ͖͍Ͱ͢ɻ 5RTKPI$QQV

Slide 21

Slide 21 text

+)JQTUFSΛ༻͍Δ͜ͱͰ ͢͹΍͘8FCΞϓϦέʔγϣϯͷ ਽ܗΛ࡞Δ͜ͱ͕Ͱ͖·͢ʂ ૉ੖Β͍͠αϯϓϧ͸ϓϩδΣΫτʹͱͬͯඇৗʹ༗ޮͰ͢ɻ

Slide 22

Slide 22 text

͜Ε͕+)JQTUFSͰੜ੒͞Εͨ8FCΞϓϦέʔγϣϯͷը໘Ͱ͢ɻ

Slide 23

Slide 23 text

ೝূ΍ೝՄͷ࢓૊Έ͕࠷ॳ͔Β༻ҙ͞Ε͍ͯ·͢ɻ ΦϓγϣϯʹΑΓ4PDJBMϩάΠϯ΋༻ҙ͞Ε·͢ɻ

Slide 24

Slide 24 text

JO *OUFSOBUJPOBMJ[BUJPO ΋༻ҙ͞Ε͓ͯΓɺ ݴޠλϒʹΑΓදࣔݴޠΛ੾Γସ͑Δ͜ͱ͕ՄೳͰ͢ɻ

Slide 25

Slide 25 text

ΞϓϦέʔγϣϯΛ؅ཧ͢Δҝͷ༷ʑͳػೳ͕༻ҙ͞Ε͍ͯ·͢ɻ ྫ͑͹؅ཧϝτϦΫεΛબ୒͢Δͱɺ+7.ͷঢ়ଶ΍ )551ϦΫΤετ਺ͳͲΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ

Slide 26

Slide 26 text

؅ཧϔϧενΣοΫΛબ୒͢Δͱɺ σʔλϕʔε΍σΟεΫεϖʔεͷঢ়ଶΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ

Slide 27

Slide 27 text

؅ཧઃఆΛબ୒͢Δͱɺ 4QSJOHDPOpHVSBUJPO΍TZTUFN&OWJSPONFOUͳͲɺ ֤छΞϓϦέʔγϣϯ؀ڥઃఆΛදࣔͰ͖·͢ɻ

Slide 28

Slide 28 text

؅ཧϩάΛબ୒͢Δͱɺϩάઃఆͷ֬ೝ΍มߋ͕Ͱ͖·͢ɻ

Slide 29

Slide 29 text

؅ཧ"1*Λબ୒͢Δͱɺ4XBHHFS6*ʹΑΔ8FC"1*ͷυΩϡϝϯτ ΛදࣔͰ͖·͢ɻ

Slide 30

Slide 30 text

։ൃϞʔυͰىಈͨ͠৔߹͸ɺ؅ཧσʔλϕʔε͕બ୒Ͱ͖·͢ɻ ͜ΕΛબ୒͢Δͱɺ઀ଓ͍ͯ͠Δσʔλϕʔεͷ؅ཧը໘ΛදࣔͰ͖·͢ɻ

Slide 31

Slide 31 text

σʔλϕʔεʹϩάΠϯ͢Δ͜ͱͰɺσʔλϕʔεͷ಺༰Λ֬ೝͰ͖·͢ɻ

Slide 32

Slide 32 text

શ͕ͯ࠷ॳ͔Β8FC"QQMJDBUJPOʹ༻ҙʂʂ

Slide 33

Slide 33 text

+)JQTUFSͰѹ౗త੒ޭʂ

Slide 34

Slide 34 text

"HFOEB (FUUJOH4UBSU +)JQTUFSͱ͸ -FBSOXJUI+)JQTUFS ·ͱΊ

Slide 35

Slide 35 text

)PXUPJOTUBMM

Slide 36

Slide 36 text

ϩʔΧϧΠϯετʔϧ 7BHSBOUͰͷΠϯετʔϧ %PDLFSͰͷΠϯετʔϧ +)JQTUFS͸ϩʔΧϧΠϯετʔϧͷଞɺ7BHSBOU΍%PDLFSΛ࢖ͬͨ Πϯετʔϧ͕ՄೳͰ͢

Slide 37

Slide 37 text

ϩʔΧϧΠϯετʔϧ 7BHSBOUͰͷΠϯετʔϧ %PDLFSͰͷΠϯετʔϧ ࠓճ͸ɺϩʔΧϧΠϯετʔϧΛ঺հ͠·͢

Slide 38

Slide 38 text

+BWBΛ0SBDMFͷ8FCαΠτ͔ΒΠϯετʔϧ Ϗϧυπʔϧ͸.BWFO͔(SBEMFΛબ୒Մೳ ˞͜ΕΒ͸8SBQQFSͰࣗಈతʹΠϯετʔϧ͞ΕΔͷͰɺ༻ҙ͠ͳͯ͘΋0, HJUTDNDPN͔Β(JUΛΠϯετʔϧ /PEFKTͷ8FCαΠτ͔Β/PEFKTΛΠϯετʔϧ ҰॹʹΠϯετʔϧ͞ΕΔOQNΛ࢖༻ͯ͠ +)JQTUFSʹඞཁͳOQNύοέʔδΛΠϯετʔϧ

Slide 39

Slide 39 text

OQNJOTUBMMHZP OQNJOTUBMMHCPXFS OQNJOTUBMMHHVMQDMJ OQNJOTUBMMHHFOFSBUPSKIJQTUFS :FPNBOͷΠϯετʔϧ #PXFSͷΠϯετʔϧ (VMQͷΠϯετʔϧ +)JQTUFSͷΠϯετʔϧ ^ 0OMZGPS "OHVMBS+4

Slide 40

Slide 40 text

)PXUPDSFBUFBQQ

Slide 41

Slide 41 text

্هίϚϯυΛ࣮ߦ͢Δͱɺ+)JQTUFSͷΞϓϦέʔγϣϯ࡞੒͕࢝·Γ·͢ɻ NLEJSKKVH@DDD DEKKVH@DDD ZPKIJQTUFS

Slide 42

Slide 42 text

+)JQTUFSͰ͸.POPMJUIJDͳΞϓϦέʔγϣϯ ΋͘͠͸ɺϚΠΫϩαʔϏεΞϓϦέʔγϣϯΛબ୒Ͱ͖·͢ɻ ██╗ ██╗ ██╗ ████████╗ ███████╗ ██████╗ ████████╗ ████████╗ ███████╗ ██║ ██║ ██║ ╚══██╔══╝ ██╔═══██╗ ██╔════╝ ╚══██╔══╝ ██╔═════╝ ██╔═══██╗ ██║ ████████║ ██║ ███████╔╝ ╚█████╗ ██║ ██████╗ ███████╔╝ ██╗ ██║ ██╔═══██║ ██║ ██╔════╝ ╚═══██╗ ██║ ██╔═══╝ ██╔══██║ ╚██████╔╝ ██║ ██║ ████████╗ ██║ ██████╔╝ ██║ ████████╗ ██║ ╚██╗ ╚═════╝ ╚═╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══════╝ ╚═╝ ╚═╝ https://jhipster.github.io Welcome to the JHipster Generator v4.4.1 Documentation for creating an application: https://jhipster.github.io/creating-an-app/ Application files will be generated in folder: /Users/s_kozake/develop/jhipsterApp/hogeHipster ? (1/16) Which *type* of application would you like to create? (Use arrow keys) ❯ Monolithic application (recommended for simple projects) Microservice application Microservice gateway [BETA] JHipster UAA server (for microservice OAuth2 authentication)

Slide 43

Slide 43 text

+)JQTUFSΛ༻͍Δͱɺ্هྫͷΑ͏ͳϚΠΫϩαʔϏεΞϓϦέʔγϣϯߏ੒΋ खܰʹߏஙͰ͖·͢ɻ

Slide 44

Slide 44 text

্هͷ੺࿮͕KIJQTUFSHFOFSBUPSͰ࡞੒ՄೳͰ͢ɻ

Slide 45

Slide 45 text

͍͔ͭ͘ͷ࣭໰ʹ౴͑Δͱ ύοέʔδ໊͸ʁ σʔλϕʔε͸ʁ ϓϩμΫτ͸ʁ ΞϓϦ໊͸ʁ ։ൃ͸ʁ .BWFO PS (SBEMF ೝূํࣜ͸ʁ "OHVMBS+4 PS "OHVMBS FUDFUD

Slide 46

Slide 46 text

Server application generated successfully. Client application generated successfully. ϓϩδΣΫτͷ४උ͕Ͱ͖·ͨ͠ʂ

Slide 47

Slide 47 text

)PXUPSVO

Slide 48

Slide 48 text

Ϗϧυπʔϧʹ(SBEMFΛબ୒ͨ͠৔߹ɺ্هίϚϯυΛ࣮ߦ͢Δͱɺ ϙʔτͰ8FCΞϓϦέʔγϣϯ͕ىಈ͠·͢ɻ ϏϧτΠϯ5PNDBU͕ىಈ͠·͢ʂ HSBEMFXCPPUSVO

Slide 49

Slide 49 text

ϒϥ΢βͰMPDBMIPTUͷϙʔτʹ઀ଓ͢Δͱɺ ը໘͕දࣔ͞Ε·͢ɻ

Slide 50

Slide 50 text

ΞΧ΢ϯτೝূΛબ୒ͯ͠ϩάΠϯ͠·͢ɻ BENJOͱVTFSͷΞΧ΢ϯτ͕σϑΥϧτͰ༻ҙ͞Ε͍ͯ·͢ɻ ॳظύεϫʔυ͸ΞΧ΢ϯτ໊ͱಉ͡Ͱ͢ɻ

Slide 51

Slide 51 text

BENJOΞΧ΢ϯτͰϩάΠϯ͢ΔͱɺΤϯςΟςΟ΍؅ཧ͕ φϏήʔγϣϯλϒʹදࣔ͞Ε·͢ɻ

Slide 52

Slide 52 text

$SFBUFFOUJUZ

Slide 53

Slide 53 text

+)JQTUFSͷΤϯςΟςΟαϒδΣωϨʔλΛ༻͍ͯɺ ্ͷΑ͏ͳ&OUJUZͱͦΕΛฤू͢Δ$36%ը໘Λੜ੒͠·͢ɻ

Slide 54

Slide 54 text

ZPKIJQTUFSFOUJUZBVUIPS ্هίϚϯυΛ࣮ߦͯ͠ɺ"VUIPS&OUJUZΛੜ੒͠·͢ɻ

Slide 55

Slide 55 text

͍͔ͭ͘ͷ࣭໰ʹ౴͑Δͱ ϑΟʔϧυͷܕ͸ʁ %50͸ ผʹͭ͘Δʁ ϑΟʔϧυ໊͸ʁ ϦϨʔγϣϯ͸ʁ όϦσʔγϣϯ ํ๏͸ʁ αʔϏεͷ ࡞Γํ͸ʁ FUDFUD

Slide 56

Slide 56 text

Everything is configured, generating the entity... ΤϯςΟςΟ͕࡞੒͞Ε·͢ʂ

Slide 57

Slide 57 text

ಉ༷ʹɺ#PPL&OUJUZΛੜ੒͠·͢ɻ ZPKIJQTUFSFOUJUZCPPL

Slide 58

Slide 58 text

ϩάΠϯ͢ΔͱɺΤϯςΟςΟʹ"VUIPSͱ#PPL͕௥Ճ͞Ε͍ͯ·͢ɻ

Slide 59

Slide 59 text

ΤϯςΟςΟ#PPLΛબ୒͢Δͱɺ$36%ը໘͕දࣔͰ͖·͢ɻ

Slide 60

Slide 60 text

ΤϯςΟςΟ#PPLͷදࣔը໘ɻ

Slide 61

Slide 61 text

ΤϯςΟςΟ#PPLͷฤूը໘ɻ

Slide 62

Slide 62 text

ΤϯςΟςΟ#PPLͷ࡟আ֬ೝμΠΞϩάɻ

Slide 63

Slide 63 text

ΤϯςΟςΟαϒδΣωϨʔλͷ୅ΘΓʹɺ+%-4UVEJPΛ༻͍Δ͜ͱ΋ग़དྷ·͢ɻ +%-4UVEJP͸ϒϥ΢βϕʔεͷ(6*πʔϧͰ͢ɻ +)JQTUFS%PNBJO-BOHVBHF +%- Λ༻͍ͯɺΤϯςΟςΟઃܭ͕Ͱ͖·͢ɻ

Slide 64

Slide 64 text

ZPKIJQTUFSJNQPSUKEMdKIJQTUFSKEMKI +%-4UVEJPͰ࡞੒ͨ͠ϑΝΠϧΛɺ্هίϚϯυͰಡΈࠐΉ͜ͱͰ ಉ༷ͷ͜ͱ͕Ͱ͖·͢ʂ

Slide 65

Slide 65 text

"HFOEB (FUUJOH4UBSU +)JQTUFSͱ͸ -FBSOXJUI+)JQTUFS ·ͱΊ

Slide 66

Slide 66 text

? ? αʔόαΠυ։ൃͱͻͱ͜ͱͰݴͬͯ΋ɺߟ͑Δ͜ͱ͸ͨ͘͞Μ͋Γ·͢ɻ ͍͟։ൃ͢ΔͱͳΔͱɺʮ͜Ε͸Ͳ͏͢Ε͹ʁʯͱ໎͏͜ͱ΋ଟ͍Ͱ͢ɻ ϩάग़ྗ ೝূ ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒

Slide 67

Slide 67 text

ͦ͜Ͱɺ+)JQTUFS͕ग़ྗ͢ΔιʔείʔυΛࢀߟʹͯ͠Έͯ͸೗ԿͰ͠ΐ͏ʂ ચ࿅͞Ε࣮ͨ૷ͷώϯτ͕ࢄΒ͹͍ͬͯΔͱࢥ͍·͢ʂ ϩάग़ྗ ೝূ ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒ !

Slide 68

Slide 68 text

+)JQTUFSͰ ֶͿʂ 4QSJOHʹΑΔαʔόαΠυ։ൃख๏

Slide 69

Slide 69 text

+)JQTUFSͰ ֶͿʂ 4QSJOH։ൃͷϕετϓϥΫςΟε ͔ͯύΫΔ ΅ͦ

Slide 70

Slide 70 text

? ? ΞϓϦέʔγϣϯߏ੒ͬͯͲ͏͢Ε͹͍͍Ͱ͠ΐ͏͔ʁ ύοέʔδߏ੒ؚΊͯ໎͏͜ͱଟ͍Ͱ͢ΑͶɻ ϩάग़ྗ ೝূ ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒

Slide 71

Slide 71 text

ΞϓϦέʔγϣϯߏ੒ 9GD 鱙鯮鱷鱝 鱭鲅鱈鲗 鲎鲁鱜鱬鲎 *QIG 4GUQWTEG *QIG 5GTXKEG *QIG&61 *QIG 4GRQUKVQT[ *QIG 鱟鱑鲉鲎鱪鱇崎⹻#12 .QIIKPI #URGEV 5GEWTKV[ %QPHKIWTCVKQP &QOCKP7UGT &GVCKN5GTXKEG

Slide 72

Slide 72 text

[packageName] │ ├── aop - AOP関連 ├── config - JavaConfig関連 ├── domain - ドメイン層のBean定義 ├── repository - リポジトリ層のBean定義 ├── security - セキュリティ関連 ├── service - サービス層のBean定義 └── web - プレゼンテーション層 └── rest - Spring MVC RESTコントローラの定義 ύοέʔδߏ੒ ύοέʔδߏ੒΋ΞϓϦέʔγϣϯߏ੒ʹԊͬͨ΋ͷͱͳ͍ͬͯΔͨΊɺ Ͳ͜ʹԿ͕͋Δͷ͔͕େมΘ͔Γ΍͍͢Ͱ͢ɻ

Slide 73

Slide 73 text

ϩάग़ྗ͸Ͳ͏͢Ε͹͍͍ͷͰ͠ΐ͏Ͷʁ $PNNPOT-PHHJOH -PH+ -PHCBDL 4-'+ +6- -PH4UBTIͱͷ࿈ܞ +BWBϓϥοτϑΥʔϜͰͷϩάग़ྗ͸ɺ৭ʑͱબ୒ࢶ͕͋Γ͗ͯ͢೰Έ·͢ɻ ? ? ೝূ ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒ ϩάग़ྗ

Slide 74

Slide 74 text

dependencies {
 :
 compile "org.springframework.boot:spring-boot-starter-logging" :
 } CVJMEHSBEMF 4QSJOH#PPUʹ͸$PNNPOT-PHHJOH"1*Λআ͍ͯඞਢͷϩΪϯάґଘؔ܎͸͋Γ·ͤΜɻ ྫ͑͹-PHCBDLΛ࢖༻͢Δ৔߹ɺຊདྷ͸༷ʑͳઃఆΛ௥Ճ͢Δඞཁ͕͋Γ·͢ɻ ʮTQSJOHCPPUTUBSUFSMPHHJOHʯΛґଘʹ૊ΈࠐΉ͜ͱͰɺΫϥεύεʹج͍ͮͯ ϩΪϯάΛઃఆΛͯ͘͠Ε·͢ɻ -PHCBDL͕༗ޮͳΒ͹ͦΕ͕࠷ॳʹ࠾༻͞Ε·͢ɻ +)JQTUFSͰ΋ɺʮTQSJOHCPPUTUBSUFSMPHHJOHʯΛґଘʹ૊ΈࠐΜͰ͍·͢ɻ ϩάग़ྗ

Slide 75

Slide 75 text

ϩάग़ྗ ΫϥεύεͷϧʔτʹMPHCBDLTQSJOHYNM͕͋Ε͹ɺͦͷઃఆ͕࠾༻͞Ε·͢ɻ 4QSJOH#PPU͸JODMVEFՄೳͳσϑΥϧτઃఆΛఏڙ͍ͯ͠·͢ɻ ͜ͷઃఆΛมߋ͢Δ͜ͱͰɺϩάϨϕϧͳͲͷมߋ΍৽ͨͳ௥Ճ͕ՄೳͰ͢ɻ 
 
 
 
 :
 
 
 
 :
 
 
 
 
 SFTPVSDFTMPHCBDLTQSJOHYNM σϑΥϧτઃఆ

Slide 76

Slide 76 text

ϩάग़ྗ @Pointcut("within(jjug_ccc.repository..*) "
 + "|| within(jjug_ccc.service..*) "
 + "|| within(jjug_ccc.web.rest..*)")
 public void loggingPointcut() { }
 @AfterThrowing(pointcut = "loggingPointcut()", throwing = "e")
 public void logAfterThrowing( JoinPoint joinPoint, Throwable e) {
 :
 }
 @Around("loggingPointcut()")
 public Object logAround(
 ProceedingJoinPoint joinPoint) throws Throwable {
 :
 }
 BPQMPHHJOH-PHHJOH"TQFDU +)JQTUFSͰ͸ϩάग़ྗʹ"01Λ׆༻͍ͯ͠·͢ɻ MPHHJOH1PJOUDVUͰϩάग़ྗ͢ΔൣғΛࢦఆͯ͠ɺϝιουͷ։࢝ɾऴྃ΍ྫ֎ൃੜ࣌ ͷϩάग़ྗ͕Ͱ͖ΔΑ͏ʹͳ͍ͬͯ·͢ɻ ϩάग़ྗ ൣғͷࢦఆ ϝιουͷ ։࢝ɾऴྃ ྫ֎ൃੜ࣌

Slide 77

Slide 77 text

ϩάग़ྗ @Configuration
 @EnableAspectJAutoProxy
 public class LoggingAspectConfiguration {
 
 @Bean
 @Profile(JHipsterConstants.SPRING_PROFILE_DEVELOPMENT)
 public LoggingAspect loggingAspect(Environment env) {
 return new LoggingAspect(env);
 }
 }
 DPOpH-PHHJOH"TQFDU$POpHVSBUJPO "01Λར༻ͯ͠ग़ྗ͢Δϩά͸ɺ։ൃϞʔυ͚ͩͰ༗ޮͱͳΔઃఆʹͳ͍ͬͯ·͢ɻ 1SPpMFΞϊʔςʔγϣϯΛ༻͍Δ͜ͱͰɺಛఆͷ؀ڥԼͰͷΈ#FBOఆٛΛ༗ޮʹ͢Δ͜ͱ͕ ՄೳͱͳΓ·͢ɻ ։ൃ࣌ͷΈ༗ޮ

Slide 78

Slide 78 text

ϩάग़ྗ @GetMapping("/logs")
 @Timed
 public List getList() {
 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
 return context.getLoggerList()
 .stream()
 .map(LoggerVM::new)
 .collect(Collectors.toList());
 }
 XFCSFTU-PHT3FTPVSDF ·ͨɺϩάઃఆΛฦ͢8FC"1*͕+)JQTUFSͰ࠷ॳ͔Β༻ҙ͞Ε͍ͯ·͢ɻ ্ͷίʔυ͸ɺϩάઃఆΛฦ͢8FCϋϯυϥʔͰ͢ɻ

Slide 79

Slide 79 text

ϩάग़ྗ @PutMapping("/logs")
 @ResponseStatus(HttpStatus.NO_CONTENT)
 @Timed
 public void changeLevel(@RequestBody LoggerVM jsonLogger) {
 LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
 context.getLogger(jsonLogger.getName()) .setLevel(Level.valueOf(jsonLogger.getLevel()));
 }
 XFCSFTU-PHT3FTPVSDF ͞Βʹ͸ɺϩάϨϕϧΛมߋ͢Δ8FCϋϯυϥʔ΋༻ҙ͍ͯ͠·͢ʂ

Slide 80

Slide 80 text

ϩάग़ྗ ઌ΄Ͳͷ8FC"1*Λ༻͍Δ͜ͱͰɺ؅ཧϩάͷը໘͕࣮ݱ͞Ε͍ͯ·͢ʂ

Slide 81

Slide 81 text

ϩάग़ྗ public LoggingConfiguration(…) {
 :
 if (jHipsterProperties.getLogging() .getLogstash().isEnabled()) {
 addLogstashAppender(context);
 :
 }
 }
 DPOpH-PHHJOH$POpHVSBUJPO +)JQTUFSͰ͸ɺMPHTUBTIͱ࿈ܞ͢Δίʔυ΋༻ҙ͞Ε͍ͯ·͢ɻ ઃఆΛ௥Ճ͢Δ͜ͱͰɺϩά಺༰ΛඇಉظʹMPHTUBTI΁࿈ܞͰ͖·͢ɻ

Slide 82

Slide 82 text

Here!

Slide 83

Slide 83 text

ೝূͬͯͲ͏͢Ε͹͍͍ͷͰ͠ΐ͏ʁ ैདྷͷηογϣϯํࣜͰ͍͍ͷ͔ͳʁ ࠷ۙͰ͸ɺ0"VUIΛ༻͍ͨೝূํࣜͱ͔৭ʑฉ͍ͨΓ΋͠·͕͢ɻ ? ? ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒ ϩάग़ྗ ೝূ

Slide 84

Slide 84 text

ೝূ )5514FTTJPO"VUIFOUJDBUJPO TUBUFGVM EFGBVMU4QSJOH4FDVSJUZNFDIBOJTN 0"VUI"VUIFOUJDBUJPO TUBUFMFTT XJUIBO0"VUITFSWFSJNQMFNFOUBUJPO +85BVUIFOUJDBUJPO TUBUFMFTT XJUIBUPLFO +)JQTUFSͰ͸ɺΞϓϦέʔγϣϯ࡞੒࣌ʹ ैདྷͷ)551ηογϣϯΛ༻͍ͨೝূํࣜͷ΄͔ɺ 0"VUI΍+85Λ༻͍ͨೝূํࣜΛબ୒͢Δ͜ͱ͕ग़དྷ·͢ɻ

Slide 85

Slide 85 text

ೝূ )5514FTTJPO"VUIFOUJDBUJPO ݹయతͳ4QSJOH4FDVSJUZͷೝূϝΧχζϜͰ͢ɻ )551ηογϣϯΛ࢖༻͢ΔͷͰɺεςʔτϑϧɻ ΞϓϦέʔγϣϯΛෳ਺ͷαʔόʔʹεέʔϧ͢Δ৔߹ɺ εςΟοΩʔηογϣϯΛ࣋ͭϩʔυόϥϯα͕ඞཁͰ͢ɻ

Slide 86

Slide 86 text

ೝূ 0"VUI"VUIFOUJDBUJPO εςʔτϨεͳηΩϡϦςΟϝΧχζϜͰ͢ɻ 4QSJOH4FDVSJUZ0"VUIΛ༻͍࣮ͯݱ͍ͯ͠·͢ɻ ηΩϡϦςΟτʔΫϯΛ֨ೲ͢ΔͨΊʹσʔλϕʔεςʔϒϧ͕ඞཁɻ

Slide 87

Slide 87 text

ೝূ 0"VUI"VUIFOUJDBUJPO $MJFOU +)JQTUFS"QQ ೝূαʔό Ϧιʔεαʔό 3FTPVSDF0XOFS 1BTTXPSE$SFEFOUJBMT "DDFTT5PLFO 8FCΞϓϦέʔγϣϯ͕ɺೝূαʔό݉ϦιʔεαʔόʹͳΔΠϝʔδɻ ೝূ͸ʮ3FTPVSDF0XOFS1BTTXPSE$SFEFOUJBMTάϥϯτछผʯͰ࣮ࢪɻ

Slide 88

Slide 88 text

ೝূ +85"VUIFOUJDBUJPO +40/8FCτʔΫϯΛ༻͍ͨεςʔτϨεͳηΩϡϦςΟʔػߏͰ͢ɻ ෳ਺ͷαʔόʔʹΞϓϦέʔγϣϯΛεέʔϧ͍ͨ͠৔߹ʹศརɻ ӬଓԽϝΧχζϜΛඞཁͱ͠ͳ͍ͨΊɺ0"VUIΑΓ΋࢖༻ͱ࣮૷ ͕؆୯ɻ ϩάΠϯ໊ͱݖݶΛอ࣋͢Δ҆શͳτʔΫϯΛ࢖༻ɻ τʔΫϯ͸ॺ໊͞Ε͍ͯΔͨΊɺத਎ΛݟΔ͜ͱ͸Ͱ͖Δ͚Ͳɺ Ϣʔβʔ͕มߋ͢Δ͜ͱ͕Ͱ͖ͳ͍ɻ

Slide 89

Slide 89 text

ೝূ +85BVUIFOUJDBUJPO $MJFOU +)JQTUFS"QQ +85'JMUFS ίϯτϩʔϥ JWT

Slide 90

Slide 90 text

ೝূ +TPO8FC5PLFO FZ+IC(DJ0J+*6[6Y.J+FZ+[E8*J0J+I;(QCJ*T*N'E(HJ0J +45Y'9'&56M0-'+15&7G77/'6J*T*N7D$*.52/5& /K&/OW3H;FY4/UYBH(ORSVN*7HRQ)""#EE&5@L NR-R";X9"49ZMIF%E,L*VXE5&:5[,4%S8STK1 GKH ্ͷจࣈ͸ɺ+)JQTUFSͰੜ੒͞Εͨ8FCΞϓϦέʔγϣϯͷϦΫΤετϔομ Ͱૹ৴͞Ε͍ͯΔ+85Ͱ͢ɻ +85͸)&"%&3ɺ1":-0"%ɺ7&3*':4*(/"563&ͷͭͷ෦෼Ͱߏ੒ ͞Ε͍ͯ·͢ɻ

Slide 91

Slide 91 text

ೝূ +TPO8FC5PLFO FZ+IC(DJ0J+*6[6Y.J+FZ+[E8*J0J+I;(QCJ*T*N'E(HJ0J +45Y'9'&56M0-'+15&7G77/'6J*T*N7D$*.52/5& /K&/OW3H;FY4/UYBH(ORSVN*7HRQ)""#EE&5@L NR-R";X9"49ZMIF%E,L*VXE5&:5[,4%S8STK1 GKH )&"%&3ʹ͸ΞϧΰϦζϜ͕ࣔ͞Ε͓ͯΓɺ \ BMH)4 ^

Slide 92

Slide 92 text

ೝূ +TPO8FC5PLFO FZ+IC(DJ0J+*6[6Y.J+FZ+[E8*J0J+I;(QCJ*T*N'E(HJ0J +45Y'9'&56M0-'+15&7G77/'6J*T*N7D$*.52/5& /K&/OW3H;FY4/UYBH(ORSVN*7HRQ)""#EE&5@L NR-R";X9"49ZMIF%E,L*VXE5&:5[,4%S8STK1 GKH 1":-0"%ʹ͸ೝূσʔλ͕ೖ͍ͬͯ·͢ɻ \ TVCBENJO BVUI30-&@"%.*/ 30-&@64&3 FYQ ^

Slide 93

Slide 93 text

@PostMapping("/authenticate")
 public ResponseEntity authorize(...) {
 : boolean rememberMe = (loginVM.isRememberMe() == null) ? false : loginVM.isRememberMe();
 String jwt = tokenProvider.createToken( authentication, rememberMe);
 response.addHeader(JWTConfigurer.AUTHORIZATION_HEADER, "Bearer " + jwt);
 return ResponseEntity.ok(new JWTToken(jwt));
 :
 TFDVSJUZKXU+85'JMUFS ೝূ ্ͷίʔυ͸+85Λ༻͍ͨೝূ෦෼Ͱ͢ɻ ೝূ0,ͷ৔߹ɺ+85τʔΫϯΛ࡞੒ͯ͠ɺ)551Ϩεϙϯεͱͯ͠ฦ٫͍ͯ͠·͢ɻ +85ੜ੒ )551Ϩεϙϯεͱͯ͠ฦ٫

Slide 94

Slide 94 text

@Override
 public void doFilter(…) throws … {
 : String jwt = resolveToken(httpServletRequest);
 if (StringUtils.hasText(jwt) && this.tokenProvider.validateToken(jwt)) {
 Authentication authentication = this.tokenProvider.getAuthentication(jwt);
 SecurityContextHolder.getContext() .setAuthentication(authentication);
 }
 filterChain.doFilter(servletRequest, servletResponse);
 : TFDVSJUZKXU+85'JMUFS ೝূ ্ͷίʔυ͸+85'JMUFSͷ࣮૷Ͱ͢ɻ )551ϦΫΤετϔομͷτʔΫϯΛݕূͯ͠ɺೝূ͢ΔγϯϓϧͳίʔυͰ͢ɻ ϦΫΤετ͔Β KXUऔಘ KXU͕༗ޮͳΒ KXU͔Β ೝূ࡞੒

Slide 95

Slide 95 text

ೝূ )5514FTTJPO"VUIFOUJDBUJPO TUBUFGVM EFGBVMU4QSJOH4FDVSJUZNFDIBOJTN 0"VUI"VUIFOUJDBUJPO TUBUFMFTT XJUIBO0"VUITFSWFSJNQMFNFOUBUJPO +85BVUIFOUJDBUJPO TUBUFMFTT XJUIBUPLFO ݸਓతʹ͸ɺ 440ͱ͔Λߟ͑ͳ͚Ε͹ʣγϯϓϧͳ+85Λ༻͍ͨೝূํ͕ࣜ޷ΈͰ͢ɻ

Slide 96

Slide 96 text

4QSJOH4FDVSJUZɺઃఆ͕େมͰ͢ΑͶʁ ݁ہɺͳʹΛͲ͏ઃఆ͢Ε͹͍͍ΜͰ͚ͨͬ͠ʁ ͱ೰Ή͜ͱ΋͋Γ·͢ɻ ? ? ؂ࠪূ੻ 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ηΩϡϦςΟ

Slide 97

Slide 97 text

ηΩϡϦςΟ +)JQTUFSͰ͸ɺ"OHVMBS4QSJOHͷߏ੒ʹదͨ͠ηΩϡϦςΟઃఆ͕ɺ ࣍ͷ+BWB$POpHͱͯ͠༻ҙ͞ΕΔͷͰศརͰ͢ʂ ɹɾ4FDVSJUZ$POpHVSBUJPO ɹɾ8FC$POpHVSFS ͦͷத͔Βɺز͔ͭͷηΩϡϦςΟઃఆΛ঺հ͠·͢ɻ

Slide 98

Slide 98 text

@Override
 protected void configure(HttpSecurity http) throws Exception {
 http
 .csrf()
 .csrfTokenRepository( CookieCsrfTokenRepository.withHttpOnlyFalse()) :
 } DPOpH4FDVSJUZ$POpHVSBUJPO ηΩϡϦςΟ $43'ରࡦͷઃఆͰ͢ɻ +)JQTUFSͰ͸ɺϑϩϯτΤϯυͷ"OHVMBSʹదͨ͠$43'ઃఆ͕͞Ε͍ͯ·͢ɻ 0"VIU΍+85Λೝূํࣜʹબ୒ͨ͠৔߹ɺ$43'ରࡦ͸ແޮͱͳΓ·͢ɻ

Slide 99

Slide 99 text

ೝূ $MJFOU +)JQTUFS"QQ <)551ϔομ> 9943'50,&/$43'τʔΫϯ 4FU$PPLJF 943'50,&/$43'τʔΫϯ "OHVMBSͷྲّྀʹԊͬͯɺ$43'τʔΫϯ͸$PPLJFͷʮ943'50,&/ʯʹઃఆͯ͠ฦ͠ɺ ϦΫΤετϔομͷʮ9943'50,&/ʯͰड͚औΓ·͢ɻ +BWB4DSJQU͔Β$PPLJFΛࢀর͢Δඞཁ͕͋ΔͨΊɺ$PPLJFͷ)UUQ0OMZଐੑΛGBMTFʹ ઃఆ͍ͯ͠·͢ɻ

Slide 100

Slide 100 text

@Override
 protected void configure(HttpSecurity http) throws Exception {
 http
 :
 .and()
 .addFilterBefore( corsFilter, UsernamePasswordAuthenticationFilter.class)
 :
 } DPOpH4FDVSJUZ$POpHVSBUJPO ηΩϡϦςΟ $034 $SPTT0SJHJO3FTPVSDF4IBSJOH ͷઃఆ΋ͯ͘͠Ε͍ͯ·͢ʂ 6TFSOBNF1BTTXPSE"VUIFOUJDBUJPO'JMUFSͷલʹDPST'JMUFSΛ௥Ճ͍ͯ͠·͢ɻ

Slide 101

Slide 101 text

@Bean
 public CorsFilter corsFilter() {
 UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
 CorsConfiguration config = jHipsterProperties.getCors();
 if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) {
 source.registerCorsConfiguration("/api/**", config);
 source.registerCorsConfiguration("/v2/api-docs", config);
 }
 return new CorsFilter(source);
 }
 DPOpH8FC$POpHVSBUJPO ηΩϡϦςΟ ϓϩύςΟʹ$034ͷઃఆ͕͋Δ৔߹ɺ$034ઃఆ͕༗ޮʹͳΓ·͢ɻ ͳ͓ɺσϑΥϧτͰ͸։ൃϞʔυͷΈɻ͢΂ͯͷ0SJHJO͕ڐՄͰઃఆ͞Ε͍ͯ·͢ɻ $034ઃఆ͕ ༗ޮͳ৔߹

Slide 102

Slide 102 text

@Override
 protected void configure(HttpSecurity http) throws Exception {
 http
 :
 .and()
 :
 .exceptionHandling()
 .authenticationEntryPoint( http401UnauthorizedEntryPoint() )
 :
 } DPOpH4FDVSJUZ$POpHVSBUJPO ηΩϡϦςΟ ೝূΤϥʔ͕ൃੜͨ͠৔߹ʹͷεςʔλείʔυΛฦ͢ઃఆΛ͍ͯ͠·͢ɻ ͜ͷઃఆΛ͠ͳ͍ͱɺ-PHJO6SM"VUIFOUJDBUJPO&OUSZ1PJOU͕༗ޮʹͳͬͯ ೝূΤϥʔ࣌ʹϩάΠϯϖʔδ͕දࣔ͞Ε·͢ɻ Λฦ͢ઃఆ

Slide 103

Slide 103 text

@Override
 public void configure(WebSecurity web) throws Exception {
 web.ignoring()
 .antMatchers(HttpMethod.OPTIONS, "/**")
 .antMatchers("/app/**/*.{js,html}")
 .antMatchers("/bower_components/**")
 .antMatchers("/i18n/**")
 .antMatchers("/content/**")
 .antMatchers("/swagger-ui/index.html")
 .antMatchers("/test/**")
 .antMatchers("/h2-console/**");
 }
 DPOpH4FDVSJUZ$POpHVSBUJPO ηΩϡϦςΟ 4QSJOH4FDVSJUZͷର৅֎ͱ͢Δ63-΋ઃఆ͞Ε͍ͯΔͷͰศརͰ͢ɻ ৽͘͠ର৅֎ͱ͢Δ63-Λ௥Ճ͢Δ৔߹ɺ͜͜ͷઃఆʹ௥Ճ͢Ε͹େৎ෉Ͱ͢ɻ

Slide 104

Slide 104 text

؂ࠪূ੻ΛͱΔΑ͏ʹ͓٬͞ΜʹݴΘΕ͚ͨͲɺɺ Ͳ͏͢Δͷ͕Ұ൪͍͍ͷͰ͠ΐ͏Ͷʁ ? ? 3&45GVM"1* Τϥʔॲཧ ϖʔδϯά ޮ཰ྑ͍։ൃ ӡ༻ ηΩϡϦςΟ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ؂ࠪূ੻

Slide 105

Slide 105 text

dependencies {
 :
 compile "org.springframework.boot:spring-boot-actuator"
 :
 } CVJMEHSBEMF 4QSJOH#PPU"DUVBUPS͸ɺ؂ࠪূ੻ͷػೳΛఏڙͯ͘͠Ε·͢ʂ ؂ࠪূ੻

Slide 106

Slide 106 text

public interface AuditEventRepository {
 void add(AuditEvent event);
 List find(Date after);
 List find(String principal, Date after);
 List find(String principal, Date after, String type);
 
 }
 PSHTQSJOHGSBNFXPSLCPPUBDUVBUFBVEJU"VEJU&WFOU3FQPTJUPSZ ؂ࠪূ੻ 4QSJOH#PPU"DUVBUPSʹ༻ҙ͞Εͨ"VEJU&WFOU3FQPTJUPSZΠϯλϑΣʔεΛ࣮૷͢Δ͜ͱͰɺ ؂ࠪূ੻ͷΠϕϯτΛऔಘͰ͖·͢ɻ

Slide 107

Slide 107 text

/**
 * An implementation of Spring Boot's AuditEventRepository.
 */
 @Repository
 public class CustomAuditEventRepository implements AuditEventRepository {
 
 private final PersistenceAuditEventRepository persistenceAuditEventRepository;
 
 private final AuditEventConverter auditEventConverter;
 :
 } PSHTQSJOHGSBNFXPSLCPPUBDUVBUFBVEJU"VEJU&WFOU3FQPTJUPSZ ؂ࠪূ੻ +)JQTUFSͰ͸ɺ"VEJU&WFOU3FQPTJUPSZΠϯλϑΣʔεΛ࣮૷ͨ͠ɺ $VTUPN"VEJU&WFOU3FQPTJUPSZ͕༻ҙ͞Ε͍ͯ·͢ɻ

Slide 108

Slide 108 text

؂ࠪূ੻ $VTUPN "VEJU&WFOU3FQPTJUPSZ 1FSTJTUFODF "VEJU&WFOU3FQPTJUPSZ +)*@1&34*45&/5@"6%*5@&7&/5 +)*@1&34*45&/5@"6%*5@&75@%"5" $VTUPN"VEJU&WFOU3FQPTJUPSZ͕1FSTJTUFODF"VEJU&WFOU3FQPTJUPSZΛݺͼग़͢͜ͱͰɺ σʔλϕʔεʹ؂ࠪূ੻Λอଘ͠·͢ɻ

Slide 109

Slide 109 text

؂ࠪূ੻

Slide 110

Slide 110 text

؂ࠪূ੻ ؂ࠪূ੻͸ɺ؅ཧ؂ࠪͷը໘Ͱࢀর͢Δ͜ͱ͕ग़དྷ·͢ɻ

Slide 111

Slide 111 text

+40/Λฦ͢8FC"1*ͰϖʔδωʔγϣϯΛ࣮૷͢Δ৔߹ɺલʗޙϖʔδ΍ ࠷ॳʗ࠷ޙͷϖʔδͷΑ͏ͳ৘ใΛͲ͏ฦ٫͢Ε͹͍͍ͷͰ͠ΐ͏ʁ +40/ͷதʢϨεϙϯεͷϘσΟʣ৘ใΛೖΕΔʁ ϨεϙϯεϔομʹೖΕΔʁ ? ? ؂ࠪূ੻ ޮ཰ྑ͍։ൃ ӡ༻ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ηΩϡϦςΟ 3&45GVM"1* ϖʔδϯά Τϥʔॲཧ

Slide 112

Slide 112 text

@RestController
 @RequestMapping("/management/audits")
 public class AuditResource {
 
 @GetMapping
 public ResponseEntity> getAll( @ApiParam Pageable pageable) {
 Page page = auditEventService.findAll(pageable);
 HttpHeaders headers = PaginationUtil .generatePaginationHttpHeaders( page, "/management/audits");
 return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
 }
 }
 XFCSFTU"VEJU3FTPVSDF 3&45ϖʔδϯά +)JQTUFSͰ͸ɺϖʔδϯάͷ৘ใ͸)551ϔομʹઃఆͯ͠ฦ͍ͯ͠·͢ɻ

Slide 113

Slide 113 text

3&45ϖʔδϯά 3'$ -JOLIFBEFS Ϩεϙϯεϔομʹϖʔδϯά৘ใΛೖΕΔํ๏ΛఏҊ͍ͯ͠Δ )551ϔομʹઃఆ͢Δϖʔδϯά৘ใ͸ɺ3'$ʹैͬͨ࢓༷Λ࠾༻͍ͯ͠·͢ɻ NBOBHFNFOUBVEJUT QBHFTJ[FSFMlMBTU NBOBHFNFOUBVEJUT QBHFTJ[FSFMpSTU

Slide 114

Slide 114 text

ΤϥʔϋϯυϦϯά͸Ͳ͏ͨ͠Β͍͍ͷͰ͠ΐ͏ʁ 'JMUFS "01Λ࢖༻ͨ͠ྫ֎ิ଍ &YDFQUJPO)BOEMFS ? ? ؂ࠪূ੻ ޮ཰ྑ͍։ൃ ӡ༻ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ηΩϡϦςΟ 3&45GVM"1* ϖʔδϯά Τϥʔॲཧ

Slide 115

Slide 115 text

3&45Τϥʔॲཧ +)JQTUFSͰ͸ɺ!$POUSPMMFS"EWJDFΛ࢖ͬͯ ΤϥʔϋϯυϦϯάΛ͍ͯ͠·͢ɻ $POUSPMMFS"EWJDFΞϊςʔγϣϯΛ༻͍Δ͜ͱͰɺ $POUSPMMFSΛԣஅͯ͠ྫ֎ΛϋϯυϦϯά͢Δ͜ͱ͕ ՄೳͱͳΓ·͢ɻ

Slide 116

Slide 116 text

@ControllerAdvice
 public class ExceptionTranslator {
 
 @ExceptionHandler(ConcurrencyFailureException.class)
 @ResponseStatus(HttpStatus.CONFLICT)
 @ResponseBody
 public ErrorVM processConcurrencyError( ConcurrencyFailureException ex) {
 return new ErrorVM( ErrorConstants.ERR_CONCURRENCY_FAILURE);
 }
 :
 } SFTUFSSPST&YDFQUJPO5SBOTMBUPS 3&45Τϥʔॲཧ &YDFQUJPO5SBOTMBUPSΫϥεͷͳ͔ͰҰ௨ΓͷΤϥʔॲཧ͕ఆٛ͞Ε͍ͯ·͢ͷͰɺ ৽ͨʹΞϓϦέʔγϣϯಠࣗͷΤϥʔϋϯυϦϯάΛ௥Ճ͍ͨ͠৔߹ɺ ͜͜ʹ௥Ճ͢Ε͹͍͍͚ͩͰ͢ɻͱͯ΋ศརͰ͢ɻ ഉଞϩοΫʹ ࣦഊͨ͠৔߹ $POqJDU Λฦ͢ɻ

Slide 117

Slide 117 text

։ൃޮ཰Λ͋͛Δʹ͸Ͳ͏ͨ͠Β͍͍ͩΖ͏ʁ ͳΜ͔͍͍πʔϧͳ͍͔ͳʙʁͱ͔೰Έ·͢ΑͶɻ ? ? ؂ࠪূ੻ ӡ༻ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ηΩϡϦςΟ 3&45GVM"1* ϖʔδϯά Τϥʔॲཧ ޮ཰ྑ͍։ൃ

Slide 118

Slide 118 text

:
 dependencies {
 compile "org.springframework.boot:spring-boot-devtools"
 }
 :
 QSPpMF@EFWHSBEMF ޮ཰ྑ͍։ൃ 4QSJOH#PPU%FWUPPMTΛ༻͍Δ͜ͱʹΑΓɺΞϓϦέʔγϣϯΛlIPUSFTUBSUzͰ͖·͢ɻ ϓϩδΣΫτͷΫϥε͕ίϯύΠϧ͞ΕΔͱɺมߋΛݕ஌ͯ͠ΞϓϦΛ࠶ىಈ͠·͢ɻ +)JQTUFSͰ͸ɺ։ൃϞʔυͰىಈ͚ͨ࣌ͩ͜͠ͷػೳ͕༗ޮʹͳΔΑ͏ʹઃఆ͞Ε͍ͯ·͢ɻ :
 if (project.hasProperty('prod')) {
 apply from: 'gradle/profile_prod.gradle'
 } else {
 apply from: 'gradle/profile_dev.gradle'
 }
 : CVJMEHSBEMF

Slide 119

Slide 119 text

ޮ཰ྑ͍։ൃ σϑΥϧτઃఆͰ͸ɺ*OUFMMJ+*%&"͸ΞϓϦέʔγϣϯ࣮ߦதʹ ࣗಈίϯύΠϧ͠·ͤΜɻ ʮอଘ࣌ʹίϯύΠϧʯػೳΛ༗ޮʹ͢Δʹ͸ɺ *OUFMMJ+*%&"1SFGFSFODFT#VJME &YFDVUJPO %FQMPZNFOU$PNQJMFS Λબ୒ͯ͠ɺl.BLFQSPKFDUBVUPNBUJDBMMZzΛ༗ޮʹ͍ͯͩ͘͠͞ɻ ͦͷޙɺҎԼͷΩʔͰ"DUJPOXJOEPXΛ։͍ͯɺ -JOVY$53-4)*'5" .BD0494)*'5$0.."/%" 8JOEPXT$53-"-54)*'5 ʮ3FHJTUSZʯͱೖྗ͠ɺzDPNQJMFSBVUPNBLFBMMPXXIFOBQQSVOOJOHzΛ ༗ޮʹ͍ͯͩ͘͠͞ɻ

Slide 120

Slide 120 text

+)JQTUFS͸։ൃऀ͕͙͢ʹ։ൃ͕Ͱ͖Δ؀ڥ͕੔͍ͬͯ·͢ɻ wϓϩδΣΫτͷHJU؅ཧͷͨΊͷHJUJHOPSF΍HJUBUUSJCVUFTϑΝΠϧ w։ൃ͔ΒϓϩμΫτ·ͰΛҙࣝͨ͠Ϗϧυఆٛ w&DMJQTFΛ*%&Ͱ࢖༻͢Δ৔߹ͷϓϩδΣΫτઃఆ w։ൃऀ͕͞·͟·ͳΤσΟλ΍*%&ͰҰ؏ͨ͠ίʔσΟϯάελΠϧΛఆٛ͠ɺ ҡ࣋͢ΔͨΊͷ&EJUPS$POpHઃఆ ͳͲͰ͢ɻ ޮ཰ྑ͍։ൃ

Slide 121

Slide 121 text

ӡ༻Λߟྀͨ͠ػೳΛ૊ΈࠐΈ͍ͨͷ͚ͩͲɺͲ͏͍͏͜ͱͨ͠Β͍͍ͩΖ͏ʁ ? ? ؂ࠪূ੻ ΞϓϦߏ੒ ϩάग़ྗ ೝূ ηΩϡϦςΟ 3&45GVM"1* ϖʔδϯά Τϥʔॲཧ ޮ཰ྑ͍։ൃ ӡ༻

Slide 122

Slide 122 text

ӡ༻ dependencies {
 :
 compile "org.springframework.boot:spring-boot-actuator"
 :
 } CVJMEHSBEMF 4QSJOH#PPU"DUVBUPS͸ɺΞϓϦέʔγϣϯӡ༻Λָʹͯ͘͠ΕΔػೳΛఏڙͯ͘͠Ε·͢ɻ ɾ)551ΤϯυϙΠϯτͷ௥Ճ ɾϔϧενΣοΫ ɾϝτϦΫε ɾ؂ࠪূ੻

Slide 123

Slide 123 text

ӡ༻ ΤϯυϙΠϯτ આ໌ (&5BVUPDPOpH "VUP$POpHVSFͰ༗ޮʹͳ͍ͬͯΔ΋ͷɺແޮʹͳ͍ͬͯΔ΋ͷΛදࣔ͢Δ (&5CFBOT %*ίϯςφʹ؅ཧ͞Ε͍ͯΔ#FBOͷҰཡΛදࣔ͢Δ (&5FWO ؀ڥม਺ɺγεςϜϓϩύςΟͷҰཡΛදࣔ͢Δ (&5DPOpHQSPQT !$POpHVSBUJPO1SPQFSUJFTͷ෇͍ͨϓϩύςΟ஋ͷҰཡΛදࣔ͢Δ (&5EVNQ εϨουμϯϓΛදࣔ͢Δ (&5IFBMUI ϔϧενΣοΫͷ݁ՌΛදࣔ͢Δ (&5JOGP JOGP͔Β࢝·ΔϓϩύςΟ஋ͷҰཡͳͲͷΞϓϦέʔγϣϯ৘ใΛදࣔ͢Δ (&5MPHpMF ϩάϑΝΠϧΛදࣔ͢Δ (&5NFUSJDT ϝτϦΫεΛදࣔ͢Δ (&5TIVUEPXO ΞϓϦέʔγϣϯΛఀࢭ͢Δ (&5USBDF )551ϦΫΤετͷϩάΛදࣔ͢Δ (&5qZXBZɺ (&5MJRVJCBTF 'MBXBZ·ͨ͸-JRVJCBTFͷσʔλϕʔεϚΠάϨʔγϣϯ৘ใΛදࣔ͢Δ (Spring徹底入門 p.624より) 4QSJOH#PPU"DUVBUPSʹΑΓ্هͷΑ͏ͳ)551ΤϯυϙΠϯτ͕௥Ճ͞Ε·͢ɻ +)JQTUFSͰ͸ɺ͜ΕΒͷػೳΛ׆༻ͨ͠؅ཧػೳ͕ॆ࣮͍ͯ͠·͢ɻ

Slide 124

Slide 124 text

ӡ༻ DPOpHQSPQT΍FWOΛ༻͍ͨઃఆը໘

Slide 125

Slide 125 text

ӡ༻ IFBMUIΛ༻͍ͨϔϧενΣοΫը໘

Slide 126

Slide 126 text

ӡ༻ NFUSJDTΛ༻͍ͨΞϓϦέʔγϣϯϝτϦΫεը໘

Slide 127

Slide 127 text

ӡ༻ ը໘͕༻ҙ͞Ε͍ͯͳ͍΋ͷʹ͍ͭͯ΋ɺBENJOϢʔβͰ௚઀(&5Λୟ͘͜ͱͰɺ ৘ใΛදࣔͰ͖·͢ɻ CFBOT΍BVUPDPOpHͳͲͷ৘ใ͸։ൃʹ΋໾ཱͪ·͢ʂ

Slide 128

Slide 128 text

"HFOEB (FUUJOH4UBSU +)JQTUFSͱ͸ -FBSOXJUI+)JQTUFS ·ͱΊ

Slide 129

Slide 129 text

·ͱΊ +)JQTUFSΛ࢖͏͜ͱͰɺ͙͢ʹ࣮ӡ༻ʹ଱͑ΕΔ 8FCΞϓϦͷ਽ܗΛ༻ҙͰ͖·͢ʂ +)JQTUFS͕ग़ྗ͢Διʔείʔυʹ͸ ચ࿅͞Ε࣮ͨ૷ͷώϯτ͕ࢄΒ͹͍ͬͯ·͢ʂ

Slide 130

Slide 130 text

(SFBU4QSJOH 'VO+)JQTUFS ʘ͢͝ʔ͍ʂͨͷ͠ʔʂʗ

Slide 131

Slide 131 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ P ƅ˜ƅ P