-
[Spring] ๊น์ํ ์คํ๋ง ์ ๋ฌธ <์น์ 1.ํ๋ก์ ํธ ํ๊ฒฝ์ค์ > ์ ๋ฆฌ
2023. 10. 1.
๊ฐ์ ์๊ฐ
์ค๋ฌด์์ ๋์ํ๋ ์น ์ดํ๋ฆฌ์ผ์ด์
์น MVC ์ค์ํ๋ค
Database ์ ์ ์ฅ→ db์ ์ ๊ทผํ๋ ๊ธฐ์
์คํ๋ง ๋ถํธ
์น์ 1
ํ๋ก์ ํธ ํ๊ฒฝ์ค์
์ฌ์ ์ค์น
- ๊ฐ์๋ด์ฉ Java11์ค์น → ๋ณธ์ธ์ ์คํ๋ง 3.0 ์ด์ ์ฌ์ฉ ์ํด 17 ์ค์น
- IDE: IntelliJ ๋๋ Eclipse ์ค์น
๋ค์ด๋ฒ, ์นด์นด์ค, ์ฟ ํก, ๋ฐฐ๋ฏผ ๋ฑ ์๋ฒ ๊ฐ๋ฐ์ ์ดํด๋ฆฝ์ค ๋๋ถ๋ถ ์ฌ์ฉxx
์์ฆ์ ๋ค ์คํ๋ง ๋ถํธ๋ฅผ ์ด์ฉํด์ ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ฑ
ํ๋ก์ ํธ ์์ฑ
- ํ๋ก์ ํธ ์ ํ
- Project: Gradle - Groovy Project
- Maven vs Gradle๊ณผ๊ฑฐ์๋ Maven → ์์ฆ์๋ ์ค๋ฌด์์ ๊ฑฐ์ Gradle๋ก ๋์ด์ค๋ ์ถ์ธ
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๊ฒจ์ ์ค๊ณ , ๋น๋ํ๋ ๋ผ์ดํ ์ฌ์ดํ๊น์ง ๊ด๋ฆฌํด์ฃผ๋ ํด
- Spring Boot: 2.3.x (Snapshot ์์ง ๋ง๋ค๊ณ ์๋ ๋ฒ์ M๋ถ์ ๊ฒ๋ค๋ ์ ์ ๋ฆด๋ฆฌ์ฆ๋ ๋ฒ์ x) → 3.1.4
- Language: Java
- Packaging: Jar
- Java: 11 → 17์ผ๋ก
- Project Metadata # ํ๋ก์ ํธ ์ ๋ณด ๊ธฐ์
- groupId: hello #๋ณดํต ๊ธฐ์ ๋ช ๊ฐ์ ๊ฒ์ ์ ์
- artifactId: hello-spring # ํ๋ก์ ํธ๋ช
๊ฐ์ ๊ฒ
- Dependencies: Spring Web, Thymeleaf(html์ ๋ง๋ค์ด์ฃผ๋ ํ ํ๋ฆฟ ์์ง) #์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก๊ฒจ์ ์ฌ์ฉํ ์ง
→ Generate
→ ๋ค์ด ๋ฐ์ ์์ถ ํ์ผ์ ์ํ๋ ํด๋์ ๋ฃ์ ํ ์์ถ ํด์
→ ์ธํ ๋ฆฌ์ ์ด์์ open or import
→ build.gradle์ ์ ํ ํ open as a project
ํ๋ก์ ํธ ๊ตฌ์ฑ
- .idea ์ธํ ๋ฆฌ์ ์ด๊ฐ ์ฌ์ฉํ๋ ์ค์ ํ์ผ
- gradle
- src
- main #์๋ฐ ๊ด๋ จ ์ค์ ํจํค์ง, ์์ค ํ์ผ๋ค
- resources #์๋ฐ ์ฝ๋ ํ์ผ์ ์ ์ธํ xml, properties, ์ค์ ํ์ผ ๋ฑ ์๋ฐ ํ์ผ์ ์ ์ธํ ๋๋จธ์ง๋ค ์ ๋ถ
- test #ํ ์คํธ ์ฝ๋์ ๊ด๋ จ๋ ์์ค๋ค → ์์ฆ ๊ฐ๋ฐ ํธ๋ ๋์์ ํ ์คํธ ์ฝ๋๊ฐ ๋งค์ฐ ์ค์
- build.gradle #spring boot๊ฐ ์ ๊ณต ๋ฒ์ ์ค์ ํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ก๊ฒจ์จ๊ฑฐ
- mavenCentral() - ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๋ MavenCentral ์ฌ์ดํธ
- dependencies ์ฐ๋ฆฌ๊ฐ ๋ก๊ฒจ์จ thymeleaf, springweb ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ด์๋ test๋ผ์ด๋ธ๋ฌ๋ฆฌ
- .gitignore #์์ค์ฝ๋ ๊ด๋ฆฌ ๊น์๋ ์์ค ์ฝ๋ ํ์ผ๋ง ์ฌ๋ผ๊ฐ๊ณ ๋น๋๋ ๊ฒฐ๊ณผ๋ฌผ ์ฌ๋ผ๊ฐ๋ฉด ์ ๋๋๋ฐ ์ด๋ฐ ๊ฒ์ ๊ด๋ฆฌ
- gradlew
- gradlew.bat
- settings.gradle #์ฐ์ ๋์ด๊ฐ~
- main #์๋ฐ ๊ด๋ จ ์ค์ ํจํค์ง, ์์ค ํ์ผ๋ค
ํ๋ก์ ํธ ์คํํ๊ธฐ
src→main→java→HelloSpringApplication
compact middle packages ํด๋ ๋๊ณ ์ํด๋ ๋๊ณ ~
์๋ฐ๋ ๋ฉ์ธ ๋ฉ์๋๋ก๋ถํฐ ๋ชจ๋ ํ๋ก์ ํธ๊ฐ ์์ → ๋ฉ์ธ ๋ฉ์๋๋ฅผ ์คํ
ํฐ๋ฏธ๋ ๋ฉ์ธ์ง Tomcat started on port(s): 8080 (http) with context path → localhost 8080 ํฌํธ๋ก ๋ฌด์์ด ์์ฑ๋จ
์น ๋ธ๋ผ์ฐ์ ๋ก localhost:8080 → ์๋ฌ ํ์ด์ง ๋จ๋ฉด ์ฑ๊ณต!
- Springboot๋ ํฐ์บฃ์ด๋ผ๋ ์น์๋ฒ๋ฅผ ๋ด์ฅ
- @SpringBootApplication ์ด๋ ธํ ์ด์ → ์คํ๋ง๋ถํธ๊ฐ ํฐ์บฃ ์น์๋ฒ๋ฅผ ์์ฒด์ ์ผ๋ก ๋์ฐ๋ฉด์ ์คํ๋ง๋ถํธ๊ฐ ๊ฐ์ด ์ฌ๋ผ์ด
IntelliJ Gradle ๋์ ์ ์๋ฐ ์ง์ ์คํ
- ์ต๊ทผ IntelliJ ๋ฒ์ ์ Gradle์ ํตํด์ ์คํ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ์ค์ ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์คํ์๋๊ฐ ๋๋ฆฌ๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ๋ฉด ์๋ฐ๋ก ๋ฐ๋ก ์คํํด์ ์คํ์๋๊ฐ ๋ ๋น ๋ฅด๋ค.
- IntelliJ IDEA→ Settings→ Gradle ๊ฒ์ → Build and run using & Run test using Gradle์ด ์๋ ์ธํ ๋ฆฌ์ ์ด๋ก ๋ณ๊ฒฝ (์คํ์๋ ๋น ๋ฅด๊ฒ)
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ
- Gradle, Maven๊ฐ์ tool๋ค์ด ์์กด๊ด๊ณ๋ฅผ ๋ค ๊ด๋ฆฌ
- SpringBootStarterWeb์ ์ฃผ์ ํ๋ฉด ์ด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ด์ ์์กด๊ด๊ณ์ ์๋ ํ์ํ tomcat, web ๋ฑ์ gradle์ด ๋ค ๊ฐ์ ธ์ด
์ผ์ชฝ ๋ฐ์ ์ด์ง ๋๋ฅด๋ฉด gradle ๊ฑฐ๋ถ์ด๊ฐ ๋ธ
External Libraries
- ์ด์ ์ ๊ฐ๋ฐ ๋ฐฉ์) ์น์๋ฒ๋ฅผ ์ง์ ์ค์น → ๊ฑฐ๊ธฐ์ ์๋ฐ์ฝ๋๋ฅผ ๋ฐ์ด๋ฃ๋ ๋ฐฉ์์ผ๋ก ์น์๋ฒ์ ๊ฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ตฌ๋ถ๋์ด ์๋ ๋ฐฉ์ (ํ๋ ์์ )
- ์์ฆ์ ๊ฐ๋ฐ ๋ฐฉ์) ์ค์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์น ์๋ฒ ์์ฒด๋ฅผ ๋ด์ฅ(embeded) ์๋ฐ ๋ฉ์ธ ๋ฉ์๋๋ง ์คํํด๋ ์น์๋ฒ๋ฅผ ๋์์ค
์คํ๋ง ๋ถํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- 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
- ์ค๋ฌด์์๋ system.out์ผ๋ก ์ถ๋ ฅx log๋ฅผ ํตํด ์ถ๋ ฅ(์๋ฌ ๊ด๋ฆฌ, ๋ก๊ทธ ํ์ผ ๊ด๋ฆฌ๋ฅผ ์ํจ)
- logback, slf4j (๋ ์กฐํฉ์ ๋ง์ด ์ฌ์ฉ)
- logging(๋ก๊น )์ด๋?๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ข ๋ฅ๋ก log4j์ logback์ด ์กด์ฌ
- ๋ก๊ทธ(log)๋ฅผ ์์ฑํ๋๋ก ์์คํ ์ ์์ฑํ๋ ํ๋
- logback vs slf4jlogback ์ค์ ๋ก๊ทธ๋ฅผ ์ด๋ค ๊ตฌํ์ฒด๋ก ์ถ๋ ฅํ ์ง
- slf4j ๋ก๊น ํ๋ ์ ์ํฌ์ ๋ํ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-boot
ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-boot-starter-test
- junit: ํ ์คํธ ํ๋ ์์ํฌ (ํ ์คํธํ ๋ ์๋ฐ๋ ๋๋ถ๋ถ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ 5๋ฅผ ๋ง์ด ์ฐ๋ ์ถ์ธ)
- mockito: ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- assertj: ํ ์คํธ ์ฝ๋๋ฅผ ์ข ๋ ํธํ๊ฒ ์์ฑํ๊ฒ ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- spring-test: ์คํ๋ง ํตํฉ ํ ์คํธ ์ง์
assertj, mockito ํ ์คํธ ํธ๋ฆฌํ๊ฒ ๋์์ฃผ๋ ๋๊ตฌ
view ํ๊ฒฝ์ค์
(1) ์ ์ ํ์ด์ง → ์น ์๋ฒ๊ฐ ํ์ผ์ ๊ทธ๋๋ก ์น ์๋ฒ์ ๋์ฐ๋ ๊ฒ
- spring boot →src/resources/static ํด๋์ ์๋ index.html์ ๋จผ์ ์ฐพ๋๋ค ๋ชป ์ฐพ์ผ๋ฉด ์ธ๋ฑ์ค ํ ํ๋ฆฟ์ ์ฐพ๋ ์์ผ๋ก ๋์
- ์ผ์ข ์ welcome page๊ฐ ๋จ
- https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot- features.html#boot-features-spring-mvc-welcome-page
- ๋ฉ๋ด์ผ์์ ์ง์ ๊ฒ์ํ๋ฉด์ ๊ณต๋ถํด๋ณด๊ธฐ
(2) thymeleaf ํ ํ๋ฆฟ ์์ง ์ฌ์ฉ→ ๋ณํ๋ฅผ ์ค ์ ์์
- thymeleaf ๊ณต์ ์ฌ์ดํธ: https://www.thymeleaf.org/
- ์คํ๋ง ๊ณต์ ํํ ๋ฆฌ์ผ: https://spring.io/guides/gs/serving-web-content/ ์คํ๋ง๋ถํธ ๋ฉ๋ด์ผ: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/ html/spring-boot-features.html#boot-features-spring-mvc-template-engines
- ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒซ๋ฒ์งธ ์ง์ ์ ์ด ์ปจํธ๋กค๋ฌ
package hello.hellospring.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class HelloController { @GetMapping("hello") public String hello(Model model){ model.addAttribute("data","hello!!"); return "hello"; //hello.html์ผ๋ก ๊ฐ์ ํ๋ฉด์ ์คํ์์ผ๋ผ } }
- ์น ๋ธ๋ผ์ฐ์ ์์ hello → ๋ด์ฅ๋์ด์๋ ํฐ์บฃ ์๋ฒ๊ฐ ์คํ๋งํํ ๋์ง → ์คํ๋ง์ helloController์์ addAttribute๊ฐ ์คํ → return “hello” resources/templates/hello.html์ ์คํํ๋ค๋ ๋ป
- ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํด ๊ฐ์ผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ( viewResolver )๊ฐ ํ๋ฉด์ ์ฐพ์์ ์ฒ๋ฆฌํ๋ค.
- ์คํ๋ง ๋ถํธ ํ ํ๋ฆฟ์์ง ๊ธฐ๋ณธ viewName ๋งคํ #viewName=hello
- resources:templates/ +{ViewName}+ .html
๋น๋ํ๊ณ ์คํํ๊ธฐ
์ฝ์๋ก ์ด๋
- ./gradlew build
- cd build/libs
- java -jar hello-spring-0.0.1-SNAPSHOT.jar ⇒ ์๋ฒ ๋ฐฐํฌ์์๋ ์ด .jar ํ์ผ๋ง ๋ณต์ฌํด์ ์๋ฒ์ ๋ฃ๊ณ Java -jar.exe๋ฅผ ์คํํ๋ฉด ๋จ (์๋ฒ์์ ์คํ๋ง์ด ๋์)
- ์คํํ์ธ
http get ๋ฉ์๋ post method
./gradlew clean build → build ํด๋ ์์ฒด๊ฐ ์์ ํ ์ง์์ง๊ณ ๋ค์ ๋น๋
'๐ญ Study > : Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ