1. ํ๋ก์ ํธ ์์ฑ
Java11 (ํ์ฌ Java17 ์ฌ์ฉ ์ค) ์ค์น
IntelliJ (Eclipse) ์ค์น
* ์คํ๋ง๋ถํธ ์คํํฐ ์ฌ์ดํธ๋ก ์ด๋ํด์ ์คํ๋ง ํ๋ก์ ํธ ์์ฑ *
https://start.spring.io (์คํ๋ง ์ด๋์ ๋ผ์ด์ ๋ก ์ด๋)
์คํ๋ง ๋ถํธ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ฌ์ดํธ์. ์คํ๋ง์์ ์ด์.
Maven / Gradle ) ์ด๊ฒ๋ค์ด ๋ฌด์์ด๋๋ฉด! ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๊ฒจ์ ์ค๊ณ ์ด๊ฒ๋ค์ด ๋น๋๋ฅผ ํ๋ ๋ผ์ดํ ์ฌ์ดํด๋ค๊น์ง ์ ๋ถ ๊ด๋ฆฌํด์ฃผ๋ ํด์. ๊ณผ๊ฑฐ์๋ Maven์ ๋ง์ด ์ฌ์ฉํ์ผ๋ ์ต๊ทผ์๋ Gradle์ ๋ ๋ง์ด ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ Gradle ์ถ์ฒํจ.
Dependencies๋ ์คํ๋ง๋ถํธ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ํ ๊ฑด๋ฐ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ก๊ฒจ์ ์ธ ๊ฒ์ด๋ (๊ตฌ์ฒดํํ๊ธฐ)
<ํ์ผ๋ค ์ดํด๋ณด๊ธฐ>
.idea๋ ์ธํ ๋ฆฌ์ ์ด๊ฐ ์ฌ์ฉํ๋ ์ค์ ํ์ผ
gradle์ gradle์ด ์ฌ์ฉํ๋ ํด๋
src main test ๊ธฐ๋ณธ ํด๋๋ก ๋๋ ์ ธ ์์. ์์ฆ ๊ฐ๋ฐ ํธ๋ ๋์์๋ ํ ์คํธ ์ฝ๋๊ฐ ๋งค์ฐ ์ค์ํจ.
main ๋ฐ์ resources ํด๋๋ ์ค์ ์๋ฐ ์ฝ๋๋ค์ ์ ์ธํ xml์ด๋ properties์ ๊ฐ์ ์ค์ ํ์ผ์ด ๋ค์ด๊ฐ๋ค. (์๋ฐ ํ์ผ์ ์ ์ธํ ๋ชจ๋ ํ์ผ)
- build.gradle
plugins => ์๊น ์ ํํ๋ ๋ฒ์ ๋ค, ์๋ฐ ์ธ์ด ์ ํํ ๊ฒ๋ค
group version sourceCompatibility (์๋ฐ 11 ๋ฒ์ )
dependencies ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ์์
์๊น implementํ๋ thymleaf์ web๋ค์ด ์์.
testimplementation์ ํ ์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ์๋ฏธํจ. junit5๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ธ์ด.
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' }
๊ทธ๋ฌ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ด๋์์ ๊ฐ ๊ฐ์ ธ์์ผ๋๋๋ฐ ๊ทธ๊ฒ์ repositories mavenCentral()์ด๋ผ๋ ์ฌ์ดํธ์์ ๊ฐ์ ธ์๋ผ๋ผ๊ณ ๊ฐํธํ๊ฒ ์ค์ ํด๋ ๊ฒ์. ํ์ํ๋ค๋ฉด ํน์ ์ฌ์ดํธ์ URL์ ๊ธฐ์ ํ ์ ์์.
* ์ง๊ธ์ gradle์ ๋ํด์ ๋๋ฌด ์ฌ๋ ๊น๊ฒ ๊ณต๋ถํ ํ์ ์์! gradle์ ๋ฒ์ ์ค์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ก๊ฒจ์ค๋ ๊ตฌ๋ ์ ๋๋ก๋ง ์ดํดํด์ฃผ๋ฉด ๋จ!
.gitignore์ ๊น์์ ํ์ํ ํ์ผ๋ค๋ง ์ฌ๋ผ๊ฐ ์ ์๋๋ก ํด์ฃผ๋ ํ์ผ
gradlew gradlew.bat (๋ค์ gradle ๋น๋ํ ๋ ๋ณด์ฌ์ฃผ์ ๋ค๊ณ ํจ)
setting.gradle (๋์ค์ ๊ณต๋ถํ ๊ฒ// ๋ณ๋ก ์ ์ค์ํจ)
SpringBasicApplication ๋ค์ด๊ฐ๋ณด๋ฉด ํด๋์ค๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ธ ์๊ณ ์ด๋ ธํ ์ด์ ์ผ๋ก SpringBootApplication์ด ๋ค์ด์ ์๋ ๊ฒ ํ์ธ ๊ฐ๋ฅํจ. (์ ๋ญ๊ฐ ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ๋ฅผ ํ๋ ๊ฒ ๊ฐ๊ตฐ!) ๋ฐ๋ก main ๋ฉ์๋๋ฅผ ์คํํ๋ฉด ๋จ.
Tomcat started on port(s): 8080 (http) with context path '' : ์ผ๋จ์ ๋ญ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง http๋ก 8080ํฌํธ๊ฐ ๋ธ ํ์ธํ ์ ์์. ๋ฐ๋ผ์ ์น ๋ธ๋ผ์ฐ์ ธ๋ฅผ ์ด์ด์ localhost:8080 ๋ค์ด๊ฐ๋ฉด error ํ์ด์ง๊ฐ ๋จ๋๋ฐ ๊ทธ๋ฌ๋ฉด ์ผ๋จ์ ์คํ๋ง์ด ์๋ ๋๋ค๋ ๊ฒ์ด๋ฏ๋ก ์ฑ๊ณต ์๋ฏธํจ! (ํ๋ก์ ํธ ํ๊ฒฝ ์ค์ ์ฑ๊ณตํจ!)
์ด ์ฝ๋๋ค์ ๋ณด๋ฉด ์ด๋ ๊ฒ ์์ฑ๋ง ํ๋ฉด ์คํ๋ง๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ์ด ๋๋ ๊ฒ์! ํฐ์บฃ์ด๋ผ๋ ์น ์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์์.
๋ฒ์ธ๋ก Preference๋ค์ด๊ฐ๋ฉด gradle์ด๋ผ๊ณ ๊ฒ์์ ํ๊ณ build and run using์ด๋ run tests using์ ์ธํ ๋ฆฌ์ ์ด๋ก ์คํ์ด ๋๋ ๊ฒ์. ์ด๋ ๊ฒ ํ๋ฉด gradle์ ๋ค๋ฆฌ์ง ์์์ ํจ์ฌ ๋ ๋น ๋ฅด๊ฒ ์ ์์ด ๋จ.
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ
build.gradle ๋ค์ด๊ฐ์ ๋ณด๋ฉด thymeleaf, web, test 3๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ์ ์์.
external libraries ๊ฐ๋ณด๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฒญ ๋ง์. junit, tomcat, apeache, spring ๋ฑ๋ฑ ์์ฒญ ๋ง์.
gradle์ด๋ maven ๊ฐ์ ํด๋ค์ ์์กด๊ด๊ณ๋ฅผ ์ ๋ถ ๊ด๋ฆฌํด์ค.
์๋ฅผ ๋ค์ด์ starter-web ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๊ธฐ๊ฒ ๋๋ฉด starter-web์ด ํ์ํ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค(์์กด๊ด๊ณ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค)์ ์ ๋ถ ๊ฐ์ ธ์์ค. ๊ทธ๋์ ์๋ก ์์กด๊ด๊ณ๋ฅผ ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์. ๊ทธ๋์ ์ฐ๋ฆฌ๋ starter-web๋ง ํ์ํ์ง๋ง ์ด ๊ฒ์ ์คํ์ํค๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ํ์ํจ. ๊ทธ๋์ gradle์ ์คํ์ํค๊ธฐ ์ํ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ๋ถ ๋ก๊ฒจ์ค๊ฒ ๋จ. ๋์ค์ spring-core๊น์ง ๋ก๊ฒจ ์ค๊ฒ ๋จ.
gradle ์์ ์๋ ๊ฑฐ ๋๋ฌ๋ณด๋ฉด dependencies๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ, ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ์๋ฏธํจ.
(*) ์๋ ๊ฒ๋ค์ ์์ ์ด๋ฏธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฌ์ฉ๋์์์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์ค๋ณต ์ ๊ฑฐ์ฉ์ผ๋ก ๋ค์ ์ฐ์ง ์๊ณ ๋ค์ ๋ณ์ ๋ถ์ฌ์ค๋ค.
spring-boot-starter๋ค์ด๊ฐ๋ณด๋ฉด tomcat์ด ์๋ค๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ์น์๋ฒ๋ฅผ ๋ฐ๋ก ์ค์ ํ ํ์ ์์ด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํด์ ์น ์๋ฒ์ ์ฌ๋ฆฌ๋ฉด ๋๋๋ ๊ฒ์! (์์ฒญ ํธ๋ฆฌํด์ง!) ์์ ์ฒ๋ผ ํฐ์บฃ ์๋ฒ๋ฅผ ๊น๊ณ ํ๋ ๋ฑ์ ์ผ์ ํ์ง ์์! ์๋ ๋ง์ด ๋ฐ๋ใ ใ
spring-boot-starter์ ๋ค์ด๊ฐ๋ณด๋ฉด spring-boot-autoconfigure, spring-boot-dependencies, spring-boot-starter, spring-core ๋ฑ์ด ์์์ ํ์ธํ ์ ์๋ค. spring-boot ์ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๋ฉด spring๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ์ ธ์์ ์ด๋ค๊ณ ์๊ฐํ๋ฉด ๋จ. spring-boot-starter-logging : slf4j๋ logback์ด๋ผ๋ ๊ฒ์ด ์์. ์์ฆ์๋ logback์ ๋ง์ด ์ฌ์ฉํจ.
thymeleaf ๋ฐ์๋ ๋ thymleaf์ ๊ด๋ จ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ์ง๊ณ ์์.
testImplementation ๋ผ์ด๋ธ๋ฌ๋ฆฌ
junit์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํจ. junit5๋ฒ์ ์ ์์ฆ์๋ ๋ง์ด ์ฌ์ฉํจ.
assertj ๋ฑ์ ํ ์คํธ๋ฅผ ๋ ์ฝ๊ณ ์ํํ๊ฒ ํด์ฃผ๋
spring-test ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ spring๊ณผ ํตํฉํด์ ํ ์คํธ ํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์.
ํต์ฌ
spring-boot-starter-web
- spring-boot-starter-tomcat : ํฐ์บฃ(์น์๋ฒ)
- spring-webmvc : ์คํ๋ง ์น MVC
spring-boot-starter-thymeleaf : ํ์๋ฆฌํ ํ ํ๋ฆฟ ์์ง(View)
spring-boot-starter(๊ณตํต) : ์คํ๋ง ๋ถํธ + ์คํ๋ง ์ฝ์ด + ๋ก๊น
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
spring-boot-starter-test
- junit : ํ ์คํธ ํ๋ ์์ํฌ
- mockito : ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- assertj : ํ ์คํธ ์ฝ๋๋ฅผ ์ข ๋ ํธํ๊ฒ ์์ฑํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-test : ์คํ๋ง ํตํฉ ํ ์คํธ ์ง์
3. View ํ๊ฒฝ์ค์
Welcome Page ๋ง๋ค๊ธฐ
resource ํ์ผ์ static ์๋์ file ์๋ก ์์ฑํด์ index.html ํ์ผ ๋ง๋ค๊ธฐ
spring.io์ ๋ค์ด๊ฐ์ project์ springboot ์์ learn ๋ค์ด๊ฐ์ referencedoc ๋ค์ด๊ฐ์ spring boot features ์์ welcome page์ ๋ค์ด๊ฐ์ ์ด๋ป๊ฒ ํ๋์ง ๋ค ์ค๋ช ์ด ๋์์์. ๊ทธ๊ฑฐ ๋ณด๊ณ ํ๋ฉด ๋จ. spring์ ๋๋ฌด๋ ํฐ ์ํ๊ณ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ถ ๋ค ๊ณต๋ถํ ์๋ ์๊ณ ๋ฐ๋ผ์ ํ์ํ ๊ฒ์ ์ ๋๋ก ์ฐพ์ ์ ์๋ ๋ฅ๋ ฅ์ด ๋งค์ฐ ์ค์ํจ. ๋ฐ๋ผ์ ์ด ๋ฉ๋ด์ผ์์ ๊ฒ์์ ์ ํด์ ํ์ํ ์ ๋ณด ์ฐพ๊ณ ์ฌ์ฉํ ์ ์์ด์ผ ๋จ.
๋ฐฉ๊ธํ ๊ฒ์ ์ ์ ํ์ด์ง์.
ํ์ง๋ง thymeleaf๋ผ๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ฉด
๊ณต์ ์ฌ์ดํธ thymeleaf.org ์์ ๋ช๊ฐ์ง ํน์ง๋ค์ด ์์ (์์์ ์ฝ๊ธฐ)
์คํ๋ง ๊ณต์ ํํ ๋ฆฌ์ผ
์คํผ๋ง๋ถํธ ๋ฉ๋ด์ผ template engines ์์ spring boot์ auto-configuration์์๋ ์ด๋ฌํ ๊ธฐ๋ณธ ํ ํ๋ฆฟ๋ค์ ์ ๊ณตํด์ค๋ค. freemarker, groovy, thymeleaf, mustache
web ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒซ ์ง์ ์ ์ด ์ปจํธ๋กค๋ฌ์.
localhost:8080/hello๋ฅผ ๋ค์ด๊ฐ๋ฉด ์คํ๋ง๋ถํธ๋ ํฐ์บฃ์ด๋ผ๋ ์น์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์์. ๊ทธ๋ฌ๋ฉด ์คํ๋งํํ ํฐ์บฃ์ด ๋ฌผ์ด๋ด. helloController์ GetMapping (Get : HTTP) ์ hello๋ผ๋ url๊ณผ ๋งค์นญ์ด ๋์ด์. ๋ฉ์๋ ์คํ์ด ๋๋๋ฐ, model์ ํค๋ data๊ณ ๊ฐ์ hello!! ์. return์ hello๋ก ํจ. ๊ทธ ์๊ธฐ๋ ์ฆ, hello.htmlํํ ๊ฐ์ ๋๋๋งํด๋ผ. ์ด ํ๋ฉด์ ์คํ์์ผ๋ผ. templates ํด๋์ ์๋ hello.html์ ์คํ๋ง์ด ์ฐพ์์ thymeleaf ํ ํ๋ฆฟ ์์ง ์ฒ๋ฆฌ
์ปจํธ๋กค๋ฌ์์ ๋ฆฌํด ๊ฐ์ผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ (viewResolver)๊ฐ ํ๋ฉด์ ์ฐพ์์ ์ฒ๋ฆฌํ๋ค.
- ์คํ๋ง ๋ถํธ ํ ํ๋ฆฟ์์ง ๊ธฐ๋ณธ viewName ๋งคํ
- resources:templates/ + (ViewName) + .html
์ฐธ๊ณ : spring-boot-devtools ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด, 'html'ํ์ผ์ ์ปดํ์ผ๋ง ํด์ฃผ๋ฉด ์๋ฒ ์ฌ์์ ์์ด View ํ์ผ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
4. ๋น๋ํ๊ณ ์คํํ๊ธฐ (๋ค์ ๋ณด๋ฉด์ ์ ๋ฆฌํ๊ธฐ / 3๋ถ์ง๋ฆฌ)