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
Springで始めるWebApplication / Start Spring Web App...
Search
yachiy
November 20, 2019
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Springで始めるWebApplication / Start Spring Web Application
yachiy
November 20, 2019
More Decks by yachiy
See All by yachiy
同人プロダクトのリプレース案件における技術的負債解消への取り組み / Addressing Technical Debt in the Revamp of Doujin Products
yachiy
0
24
AWS事始め / Introduction AWS
yachiy
1
76
RDRAとDDDを実践していく上でのCleanArchitectureの同異点 / RDRA and Clean Architecture differences
yachiy
0
140
Springで始める3層アーキテクチャ / start three layer architecture with spring
yachiy
0
110
議事録のとり方 / how to write proceeding
yachiy
0
170
値オブジェクトの悩みポイントとどう付き合っていくか
yachiy
1
3k
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
420
Agile that works and the tools we love
rasmusluckow
331
22k
Become a Pro
speakerdeck
PRO
31
6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
650
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Done Done
chrislema
186
16k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Testing 201, or: Great Expectations
jmmastey
46
8.2k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Transcript
4QSJOHͰ࢝ΊΔ 8FCΞϓϦέʔγϣϯ
·ͣॳΊͱΓ͋͑ͣ৮ͬͯಈ͔͢
IUUQTTUBSUTQSJOHJP 4QSJOHΞϓϦέʔγϣϯΛ࢝ΊΔʹ͋ͨͬͯ؆୯ʹܗ Λ࡞Δ͜ͱ͕Ͱ͖Δެࣜ
(SBEMFͷϓϩδΣΫτͱͯ͠࡞ ˞(SBEMFʹ͍ͭͯޙड़ ݴޠ+BWBΛ༻ 4QSJOH#PPUͷόʔδϣϯΛ༻ ύοέʔδ໊ʹͳΔ ΞϓϦέʔγϣϯ໊
4QSJOH8FCΛ͍͍ͨͷͰݕࡧ ϘοΫεʹʮ8FCʯͱ͍Εɺ 4QSJOH8FCΛબ ԡԼ͢Δͱμϯϩʔυ͕࢝·Δ ʢΞϓϦέʔγϣϯ໊[JQʣ
ల։͢Δͱ͜Μͳײ͡
࣮͏ಈ͔ͤΔ
HSBEMFXCPPU3VO ల։ͨ͠σΟϨΫτϦ·ͰλʔϛφϧͰҠಈͯ͠ Λ࣮ߦ
͜Ε͕ग़͍ͯΕ0, (SBEMFͷϓϩάϨεόʔతͳͷˋͰࢭ·Δ͜ͱ͋Δ͔ʜ
IUUQMPDBMIPTU
Τϥʔϖʔδ͕දࣔ͞ΕΔ ˠԿઃఆ͍ͯ͠ͳ͍ͷͰવͷਖ਼͍͠ڍಈ ͋Θͯͳͯ͘0,
λϒʹͪΌΜͱ4QSJOHͷGBWJDPO͕දࣔ͞Ε͍ͯΔͣ
ͪͳΈʹCPPU3VO͍ͯ͠ͳ͍ঢ়ଶͰIUUQMPDBMIPTU ʹΞΫηεͯ͠ʢ$ISPNFͷ߹ʣ͜͏ͳΔͷͰ4QSJOH ͷΤϥʔϖʔδ͕ग़Δͷ͏·͘ߦͬͯΔূڌ
ಈ͘ಈ͍ͨ
ͰͳΜͰಈ͔͘Α͘Θ͔Βͳ͍
ݸͣͭݟ͍ͯ͘ Ұؾʹදࣔ͞ΕΔͱ಄·ΘΒͳ͘ͳͬͯ Θ͔Βͳ͘ͳΔͷͰ
࠶ܝ
·ͣ͜͜
None
൴ΒϏϧυπʔϧͱ͍͍·͢
ϏϧυπʔϧJTԿ
Ϗϧυʹؔ͢Δ͜ͱΛΑ͠ͳʹͬͯ͘ΕΔ
wίϯύΠϧ wςετ w੩తղੳ wϥΠϒϥϦͷґଘཧ FUDʜ ͠Ϗϧυπʔϧ͕ͳ͔ͬͨΒʜ ϑΝΠϧͣͭखͰKBWBDίϚϯυୟ͍ͯ ίϯύΠϧͨ͠Γςετ࣮ߦͨ͠Γʜ ࣗͰݸͣͭϥΠϒϥϦམͱ͖ͯͯ͠ Ϋϥεύε௨ͨ͠Γʜ
ͪΐͬͱઢ
खಈͰ+BWBϑΝΠϧΛίϯύΠϧ͢Δʹ
)FMMP8PSMEKBWB public class HelloWorld { public static void main(String[] args)
{ System.out.println("Hello World!"); } } ˢͷϑΝΠϧΛAKBWBD)FMMP8PSMEKBWBAͰίϯύΠϧ ˠ)FMMP8PSMEDMBTT͕ੜ͞ΕΔ ˠAKBWB)FMMP8PSMEAΛ࣮ߦ ˠ)FMMP8PSME͕ग़ྗ͞ΕΔ
ݸݸ+BWBϑΝΠϧΛίϯύΠϧͯ͠ΫϥεϑΝΠϧ Λੜ͢Δͷ͠ΜͲ͍ ·ͱΊͯ໘ݟͯ͘ΕΔϏϧυπʔϧΛར༻͠ͳ͍खͳ͍
ศརͳͷͰੋඇϏϧυπʔϧΛ׆༻͍͖͍ͯͨ͠
͡Ό͋Կ͕ҧ͏ͷ͔ ˠهड़͕ҧ͏ɺͰ͖Δ͜ͱ͕ҧ͏ʢࠩҟׂѪʣɺྺ࢙͕ҧ͏
ޙൃ ˠଞͷϏϧυπʔϧͷ͍͍ͱ ͜ΖΛٵऩͯ͠ੜ
ࠓ͔Β࢝ΊΔͳΒ(SBEMFͰྑ͍ʢݸਓͷײͰ͢ʣ
࣍͜͜
ࠓճ Ͱॻ͚͘Ͳ Ͱ4QSJOHΛར༻Ͱ͖ΔʢࠞࡏՄʣ
࣍͜͜
όʔδϣϯʹΑͬͯαϙʔτ͍ͯ͠Δ w +BWBͷόʔδϣϯ w ґଘ͍ͯ͠ΔϥΠϒϥϦͷόʔδϣϯ ͕ҧͬͨΓ͢Δ IUUQTHJUIVCDPNTQSJOHQSPKFDUTTQSJOHCPPUXJLJ ࡉ͔͍ࠩҟϦϦʔεϊʔτΛࢀর
࣍͜͜
(SPVQ "SUJGBDUˠQBDLBHF DPNZBDIJZTQSJOH JOUSPEVDUJPO DPNZBDIJZTQSJOHJOUSPEVDUJPO ΞϓϦέʔγϣϯͷݖརݩॴଐɺ ཧମ੍ ΞϓϦέʔγϣϯ໊ ԼʹιʔεΛهड़͍ͯ͘͠
࣍͜͜
Α͘͏ґଘؔͱͬ͘͟Γ֓ཁʢओ؍ʣ 4QSJOH8FC 8FCαʔϏεΛͭ͘ΔͨΊʹ༻͍Δجૅత ͳػೳ 4QSJOH%BUB+1" σʔλϕʔεͷଓɺೖग़ྗɺσʔλૢ࡞ ͳͲʹؔ͢Δػೳ -PNCPL (FUUFS 4FUUFSͷهड़ΛΞϊςʔγϣϯΛ
ॻ͘͜ͱͰলུͰ͖Δ
ݱঢ়ʢ࠶ܝʣ
)FMMP8PSME͍ͬͯ͘
ͨΊʹ·ͣ։ൃڥΛ४උ͢Δ
+BWB 4QSJOH (SBEMFͳ։ൃʹ ͕͓͢͢Ί $PNNVOJUZΤσΟγϣϯͳΒແྉ ʢͦͯ͠ී௨ʹ͏ʹࠔΒͳ͍ʣ
ิ͕ϦΞϧλΠϜ ίʔυδΣωϨʔτ͕ॆ࣮͍ͯ͠Δ ϓϥάΠϯ๛ ผͷݴޠͷऔΓѻָ͍ FUDʜɹɹɹ ͓͢͢ΊϙΠϯτʢओ؍ʣ Λଧͬͨͱ͖ʹ͏͜Ε͕ग़ͯΔ
IUUQTXXXKFUCSBJOTDPNJEFBEPXOMPBE ͓͍ͷ04Λબ ͪ͜ΒΛબ
μϯϩʔυ͕ऴΘͬͨΒΠϯετʔϥʹ ैͬͯΠϯετʔϧ
ىಈ
ॳճͳͷͰಛʹJNQPSU͢Δ ઃఆͳ͍ͣ
͏ςʔϚΛબɻ ͨͩഎܠࠇͷ΄͏͕ѹతʹʹ༏͍͠ͷͰͦΕΒΛਪ ˠ͋ͱͣͬͱ/FYU͔Βͷ4UBSUVTJOHJOUFMMJK*%&"Λબ
ͪ͜ΒΛબ 0QFOΛ͓ͨ͠Β4QSJOH*OJUJBMJ[SͰੜͨ͠ ϓϩδΣΫτʢϑΥϧμʣΛબ
͜ͷνΣοΫϘοΫε֎͢ͱ ىಈͷʹग़ͯ͜ͳ͘ͳΔ 5JQT͕ग़͖ͯͨΒோΊͯྑ͍͔ ཁΒͳ͚Ε$MPTF
࠷ॳTZODͱͳ͍ͬͯͯಡΈࠐΈ ऴΘΔͱTVDDFTTGVMʹͳΔ
ᶃ ᶄ ᶅ ൪߸ͷॱ൪Ͱԡ͍ͯ͘͠ ͱCPPU3VO͕Ͱͯ͘Δɻ ͜ΕΛԡ͢ͱίϚϯυ ͰHSBEMFXCPPU3VO͠ ͨͷͱಉ༷ʹΞϓϦέʔ γϣϯΛىಈͰ͖Δ
։ൃڥͷ४උྃ
վΊͯ)FMMP8PSME
IUUQMPDBMIPTUʹΞΫηε͢Δͱ )FMMP8PSMEͱը໘ʹग़ྗ͍ͨ͠
None
!4QSJOH#PPU"QQMJDBUJPO ˠ༩ͨ͠Ϋϥε͕4QSJOH#PPUͷΞϓϦέʔγϣϯͰ͋Δ͜ͱΛද͢
!4QSJOH#PPU"QQMJDBUJPO ˠ༩ͨ͠Ϋϥε͕4QSJOH#PPUͷΞϓϦέʔγϣϯͰ͋Δ͜ͱΛද͢ ˠ!$POpHVSBUJPO !&OBCMF"VUP$POpHVSBUJPO !$PNQPOFOU4DBOͳͲΛ༩ͨ͠ͷͱಉٛ
࣮ࡍத͜Μͳײ͡
ˠ DPOUSPMMFSύοέʔδΛ࡞Δ
$POUSPMMFSˠਓؒͱγεςϜͷڥք
ˠ )FMMP8PSME$POUSPMMFS ΫϥεΛ࡞
Ͱ͖ͨΫϥεʹॲཧΛهड़͍ͯ͘͠
package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/")
public class HelloWorldController { @GetMapping("") public String helloWorld() { return "Hello World"; } } Ͱ͖ͨΒCPPU3VOͯ͠IUUQMPDBMIPTUʹΞΫηε
ղઆ
)FMMP8PSME͕ग़ྗ͞ΕΔ
package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/")
public class HelloWorldController { @GetMapping("") public String helloWorld() { return "Hello World"; } }
!3FTU$POUSPMMFS ˠ8FC"1*༻ʢ+TPOͷσʔλΛฦ͢ʣͷίϯτϩʔϥͰ༻ ˠΓίϯςϯπʢ+TPOͱ͔9.-ͳͲ͕Α͘༻͍ΒΕΔʣ
package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/")
public class HelloWorldController { @GetMapping("") public String helloWorld() { return "Hello World"; } }
!3FRVFTU.BQQJOH ˠ!3FRVFTU.BQQJOHͷҾͷύεʹΞΫηε͞ΕͨΒर͏ ˠϝιουͰͳ͘$POUSPMMFSΫϥεࣗମʹ͚ͭΔ͜ͱͰϝιο υͰͷ.BQQJOHͷهड़Λলུͯ͠ॻ͚Δ
package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/")
public class HelloWorldController { @GetMapping("") public String helloWorld() { return "Hello World"; } }
!(FU.BQQJOH ˠ(FUͰࢦఆ͞ΕͨύεʹΞΫηε͞ΕͨΒर͏ ˠ!3FRVFTU.BQQJOH WBMVFlQBUIz NFUIPE3FRVFTU.FUIPE(&5 Ͱಉ͡
࣮ݧ package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/hello") public class HelloWorldController { @GetMapping("/hello1") public String helloWorld1() { return "Hello World1"; } @GetMapping("/hello2") public String helloWorld2() { return "Hello World2"; } }
ˠ☓ IFMMPˠ☓ IFMMPˠ☓ IFMMPˠ☓ IFMMPIFMMPˠ)FMMP8PSME IFMMPIFMMPˠ)FMMP8PSME ͜͏ͳΔͣʜ
㱻 package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController
@RequestMapping("/hello") public class HelloWorldController { @GetMapping("/hello1") public String helloWorld1() { return "Hello World1"; } @GetMapping("/hello2") public String helloWorld2() { return "Hello World2"; } } package com.yachiy.spring.introduction.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloWorldController { @GetMapping("/hello/hello1") public String helloWorld1() { return "Hello World1"; } @RequestMapping(value = “/hello/hello2”, method = RequestMethod.GET) public String helloWorld2() { return "Hello World2"; } } ಉ͜͡ͱΛ࣮ݱͯ͠Δ ˠͩͬͨΒࠨͷ΄͏͕Θ͔Γ͍͢
)FMMP8PSMEऴΘΓ
࣍ը໘Λฦ͢
plugins { id 'org.springframework.boot' version '2.1.8.RELEASE' id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java' } group = 'com.yachiy.spring' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' testImplementation 'org.springframework.boot:spring-boot-starter-test' } CVJMEHSBEMF ґଘؔͷՃΛ͍ͨ͠߹EFQFOEFODJFTʹՃ͍ͯ͘͠
ˠςϯϓϨʔτΤϯδϯ ˠܗͷ)5.-ʹ4QSJOHଆͷϩδοΫΛຒΊࠐΉͨΊͷͷͱ ࠓཧղ͓͚ͯ͠0, 5IZNFMFBG ৄ͘͠ IUUQTXXXUIZNFMFBGPSHEPDUVUPSJBMTVTJOHUIZNFMFBG@KBIUNM
package com.yachiy.spring.introduction.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public
class HelloWorldController { @GetMapping("/") public String hello(Model model) { model.addAttribute("value", "͜Μʹͪ"); return "hello"; } } )FMMP8PSME$POUSPMMFSKBWB
package com.yachiy.spring.introduction.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public
class HelloWorldController { @GetMapping("/") public String hello(Model model) { model.addAttribute("value", "͜Μʹͪ"); return "hello"; } } )FMMP8PSME$POUSPMMFSKBWB !3FTU$POUSPMMFSˠ!$POUSPMMFS Ҿʹ.PEFMΛड͚औΔ ଐੑʹ,FZͱ7BMVFΛՃ
!$POUSPMMFS ˠը໘Λฦ͢ίϯτϩʔϥͰ༻ ˠΓ7JFXͷભҠઌ ˠࠓճͷ߹IFMMPΛฦ٫͍ͯ͠ΔͷͰ UFNQMBUFTIFMMPIUNM͕ର
ˠը໘ʹΛड͚ͨ͢ΊͷΠϯλʔϑΣʔε ˠNPEFMBUUSJCVUF LFZ WBMVF Λݺͼग़ͯ͠Λड͚͢ ˠଞͷड͚͠ํҎԼͷυΩϡϝϯτࢀর IUUQTEPDTTQSJOHJPTQSJOHEPDTDVSSFOUKBWBEPDBQJ PSHTQSJOHGSBNFXPSLVJ.PEFMIUNM .PEFM
SFTPVSDFTUFNQMBUFTԼʹIFMMPIUNMΛ࡞ ˠSFTPVSDFTUFNQMBUFT͕ςϯϓϨʔτஔ͖ ˠωετՄೳʢྫɿUFNQMBUFTHSPVQ UFNQMBUF/BNFIUNMʣ
<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title>
</head> <body> <h1 th:text="${value}"></h1> </body> </html> IFMMPIUNM
<!doctype html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8" /> <title>Hello Thymeleaf</title>
</head> <body> <h1 th:text="${value}"></h1> </body> </html> \LFZ^ͰWBMVFΛࢀরͰ͖Δ IFMMPIUNM
͜ΕͰCPPU3VOˠMPDBMIPTUʹΞΫηε͢Δͱʜ
ͨ͠จࣈྻ͕ը໘ʹදࣔ͞ΕΔ͜ͱΛ֬ೝ
ը໘ͷදࣔ·ͰͰ͖ͨ
·ͱΊ
4QSJOHΛͬͯ؆୯ͳ8FCΞϓϦέʔγϣϯΛߏஙͨ͠ ˠ࣍ۀΞϓϦέʔγϣϯͷҰൠతͳΞʔΩςΫνϟͰ͋Δ ΞʔΩςΫνϟʹֶ͍ͭͯͿʢͱ͍͍͔ʣ