Bibi's DevLog ๐ค๐
[Spring] ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ(๊น์ํ ๋) - ๊ฐ์ ์๊ฐ, ํ๋ก์ ํธ ์์ฑ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ, Viewํ๊ฒฝ์ค์ ๋ณธ๋ฌธ
[Spring] ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ(๊น์ํ ๋) - ๊ฐ์ ์๊ฐ, ํ๋ก์ ํธ ์์ฑ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ, Viewํ๊ฒฝ์ค์
๋น๋น bibi 2021. 3. 2. 23:48์ธํ๋ฐ - ์คํ๋ง ์ ๋ฌธ ๊ฐ์
์ด ๊ธ์ ์ธํ๋ฐ ๊น์ํ ๋์ ์คํ๋ง ์ ๋ฌธ ๊ฐ์(๋ฌด๋ฃ) ๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๊ฐ์์๊ฐ
๊ฐ๋จํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํด ๋ณด๋ ๊ฐ์ข์ด๋ค.
- ์คํ๋ง ํ๋ก์ ํธ ์์ฑ
- ์คํ๋ง ๋ถํธ๋ก ์น์๋ฒ ์คํ
- ํ์ ๋๋ฉ์ธ ๊ฐ๋ฐ
- ์น MVC ๊ฐ๋ฐ
- DB์ฐ๋ - JDBC, JPA, ์คํ๋ง๋ฐ์ดํฐ JPA
- ํ ์คํธ ์ผ์ด์ค ์์ฑ
ํฌ์ธํธ
- ์คํ๋ง ๊ธฐ์ ๊ทธ ์์ฒด์ ๋งค๋ชฐ๋๊ธฐ๋ณด๋ค ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง์ ์ด์ ์ ๋ง์ถ๋ค.
- ์ค๋ฌด์์ ๊ฑฐ์ ์ฐ์ง ์๋ ์ค๋๋, ๋ง์ด๋ํ ์คํ๋ง ๊ธฐ์ ์ ์ ์ธํ๋ค.
- ์คํ๋ง์ ๋งค์ฐ ๊ฑฐ๋ํ๊ณ ๊น์ด์๋ ๊ธฐ์ ์ด๊ธฐ ๋๋ฌธ์, ํ์ํ ๊ฒ ๋ถํฐ ๋ฐฐ์ด๋ค.
ํ๋ก์ ํธ ์์ฑ
- java 11
- IntelliJ ๋๋ Eclipse ์ค์น
์คํ๋ง ํ๋ก์ ํธ ์์ฑ
https://start.spring.io/ ์์ ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์คํ๋ง ๋ถํธ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ์ฌ์ดํธ.
- Project : Maven ๋๋ Gradle
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ์ฃผ๊ณ , build ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํด ์ฃผ๋ ํด.
- ๊ณผ๊ฑฐ์๋ ์ฃผ๋ก Maven์, ์์ฆ์ ๊ฑฐ์ Gradle์ ์ด๋ค. ์ฐ๋ฆฌ๋ Gradle์ ์ฐ๋ฉด ๋๋ค
- Language๋ Java์ ํ
- Spring Boot
- (SNAPSHOT), (M2).. : ์์ง ๋ง๋๋ ์ค์ธ ๋ฒ์ ์ด๋ผ๋ ๋ป. ์ด๋ฐ ๊ฒ ๋ถ์ด์์ง ์์ ๋ฒ์ ์ค ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ์ฐ๋ฉด ๋๋ค.
- 21.03.02 ํ์ฌ ๊ธฐ์ค 2.4.3 ๋ฒ์ ๋ค์ด๋ก๋
- Project Metadata
- Group : ๊ทธ๋ฃน์๋ ๋ณดํต ๊ธฐ์ ๋๋ฉ์ธ๋ช ์ ์ ๋๋ค.
- Artifact : ๋น๋๋์ด ๋์จ ๊ฒฐ๊ณผ๋ฌผ์ ๋งํ๋ค. ํ๋ก์ ํธ๋ช ๊ณผ ๋น์ทํ๋ค.
- Dependencies
- ์คํ๋ง ๋ถํธ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋ง ํ๋ก์ ํธ๋ฅผ ์์ํ ๋, ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ์ธ ๊ฒ์ธ์ง ์ค์ ํ๋ ๋ถ๋ถ.
- Spring Web : ์น ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ํ์.
- Tyemeleaf : HTML ํ ํ๋ฆฟ์ ๋ง๋ค์ด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ด๋ ๊ฒ ์ค์ ํ ๋ค Generate๋ฅผ ๋๋ฅด๊ณ , ์ธํ ๋ฆฌJ์์ ์ด์ด ์ค๋ค.
๊ธฐ๋ณธ ํ์ผ ๊ตฌ์กฐ
- .idea : intelliJ๊ฐ ์ฌ์ฉํ๋ ์ค์ ํ์ผ ํด๋
- gradle ๋ฐ wrapper : gradle์ด ์ฌ์ฉํ๋ ์ค์ ํ์ผ ํด๋
- src : main๊ณผ test๋ก ๋๋์ด์ ธ ์๋ค (ํ์ค)
- main
- java : ์ค์ ํจํค์ง์ ์์คํ์ผ์ด ์๋ค.
- resources
- test : ํ ์คํธ์ฝ๋์ ๊ด๋ จ๋ ํ์ผ๋ค์ด ๋ค์ด ์๋ค.
- main
- build.gradle : gradle์ ์ค์ ํ์ผ. ๋ฒ์ ์ค์ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ณด
repositories
: ์๋dependencies
๋ฅผ ๋ค์ด๋ฐ๋ ๊ฒฝ๋ก์ด๋ค.dependencies
(๋ผ์ด๋ธ๋ฌ๋ฆฌ)implementation
: ์์์ ์ค์ ํ Dependencies ํญ๋ชฉ์ด ๋ค์ด ์๋ค.testImplementation
: ํ ์คํธ๋ฅผ ์ํ ํญ๋ชฉ. ๊ธฐ๋ณธ์ผ๋ก ๋ค์ด ์๋ค.
- .gitignore
- ๊น์๋ ์์คํ์ผ๋ง ์ฌ๋ผ๊ฐ๊ณ ๊ฒฐ๊ณผ๋ฌผ ๋ฑ์ ์ฌ๋ผ๊ฐ์ ์ ๋๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก start.spring.io์์ ์ค์ ํด ์ค๋ค
- gradlew, gradlew.bat : ๋์ค์ ์ง๋ ๋๊ฐ๋ฉด์ ์ค๋ช
- settings.gradle : ์ง๊ธ์ ์ค์ํ์ง ์์ผ๋ ๋์ด๊ฐ๋ค.
์คํํ๊ธฐ
์ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ง๋ค์ด์ ธ ์๋ src.main.java ๊ฒฝ๋ก์ ...Application
ํ์ผ์ ์คํํด ๋ณธ๋ค.
Tomcat started on port(s) : 8080 (http) ...
๊ทธ ๋ค์ ์น๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ด localhost:8080
์ผ๋ก ์ ์ํ๋ฉด Whitelabel Error Page๊ฐ ๋ฐ ๊ฒ์ด๋ค -> ๊ทธ๋ฌ๋ฉด ์ฑ๊ณตํ ๊ฒ!
์๋ฆฌ : ์คํํ ํ์ผ์ SpringApplication.run()
์ด ํด๋น ํด๋์ค ํ์ผ์ ์คํํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์ด๋
ธํ
์ด์
์ธ @SprintBootApplication
์ด ์คํ๋๋ฉฐ, ๋ด์ฅ๋ ํฐ์บฃ ๋๋ ์น์๋ฒ๋ฅผ ๋์ฐ๋ฉฐ Spring boot๋ฅผ ์คํํ๋ค.
๊ธฐํ ์ค์
์ธํ ๋ฆฌJ์์ Preference - Build, Execution, Deployment - Build Tools - Gradle ์์
Build and rn using :๊ณผ Run tests using : ์ ๋ ๋ค IntelliJ IDEA๋ก ๋ณ๊ฒฝํ๋ค.
์คํ ์ gradle์ ํตํด์ ํ์ง ์๊ณ ์ธํ ๋ฆฌ์ ์ด์์ ์ง์ ์คํํ๊ฒ ๋๋ฏ๋ก ์คํ์ด ๋ ๋นจ๋ผ์ง๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ดํด๋ณด๊ธฐ
(์ธ์ฐ์ง ๋ง๊ณ ํ๋ฒ ๋ฃ๊ณ ๋์ด๊ฐ๋ ๊ด์ฐฎ๋ค. ์ด์ฐจํผ ๊ณ์ ๋์ค๊ธฐ ๋๋ฌธ)
Gradle์ ์์กด๊ด๊ณ๊ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ๋ค์ด๋ก๋ํ๋ค.
build.gradle
์ ์ด์ด dependencies
๋ ๋ง์ด ์ค์ ํ์ง ์์ง๋ง,
์ค์ ๋ก Expernal Libraries
๋ฅผ ์ด์ด ๋ณด๋ฉด ์์ฒญ๋๊ฒ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค์ด ์๋ค.
์ด๋ ๋ด๊ฐ ์ค์ ํ Spring Web๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋๋ ๋ค๋ฅธ ์๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
gradle, maven๊ฐ์ Build Tool๋ค์ ์ด๋ฌํ ์์กด๊ด๊ณ๋ฅผ ์์์ ๊ด๋ฆฌํด ์ค๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์กด๊ด๊ณ ์กฐํํด ๋ณด๊ธฐ
์ธํ ๋ฆฌ์ ์ด ์ค๋ฅธ์ชฝ ์คํฌ๋กค๋ฐ ์์ ๋ณด๋ฉด Gradle ํญ์ด ์๋ค. (์์ผ๋ฉด ์ธํ ๋ฆฌ์ ์ด ์ผ์ชฝ ๋งจ ์๋ ๋ค๋ชจ ๊ฒน์น ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋์จ๋ค)
Gradle ํญ - ๋ด ํ๋ก์ ํธ - Dependencies๋ฅผ ์ด๋ฉด ๋ด๊ฐ ๊ฐ์ ธ์จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ใ ก์ด์กด๊ด๊ณ๋ฅผ ๋ณผ ์ ์๋ค.
(*)
์ด ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฏธ ์์์ ๊ฐ์ ธ์จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ํ๋ด๋ ํ์์ด๋ค.
ํต์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ด ๋ณธ๋ค.
org.springframework.boot:spring-boot-starter-tomcat:2.4.3
(ํฐ์บฃ)- imbeded (๋ด์ฅ๋) ์น์๋ฒ. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์น์๋ฒ๋ฅผ ๋ด์ฅํ๊ณ ์๋ค.
- ์ค์ ์ด ํ์์์ด ์คํ๋ง ํ๋ฉด ์น ์๋ฒ๋ฅผ ๋์ธ ์ ์๊ฒ ํด ์ค๋ค.
- (๊ณตํต)
org.springframework.boot:spring-boot-starter
(์คํ๋ง ๋ถํธ ์คํํฐ)- ์ฌ๋งํ ์คํ๋ง ๋ถํธ ๊ด๋ จ ํ๋ ์์ํฌ๊ฐ ๋ชจ๋ ์์กดํ๊ณ ์์.
dependencies
,autoconfigure
,logging
,spring-core
..- ์คํ๋ง ๋ถํธ + ์คํ๋ง ์ฝ์ด + ๋ก๊น
๋ก๊ทธ(log) ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๊ฐ์๋ ์ฐ์ต์์๋ System.out.println()
๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์ง๋ง, ํ์
์์๋ ๊ฑฐ์ ์ฐ์ง ์๋๋ค. ๋ฐ๋์ ๋ก๊ทธ๋ก ์ถ๋ ฅ์ ํด์ผ ํ๋ค.
์? ๋ก๊ทธ๋ก ๋จ๊ฒจ์ผ ๊ณผ๊ฑฐ ์ด๋ ฅ์ ๋ณผ ์ ์๊ณ ๋ก๊ทธ ํ์ผ์ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ.
org.springframework.boot:spring-boot-starter
์์ ...spring-boot-starter-logging
์ ํด๋ฆญํ๋ฉด ์๋ ํ์ผ๋ค์ด ๋์จ๋ค.
org.slf4j ...
์ธํฐํ์ด์ค์ ํด๋นํจ.ch.qos.logback ....
๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ๊ตฌํ์ฒด. ์ด ์ชฝ์ด ์ฑ๋ฅ์ด ๋ ์ข๋ค.
๋ก๊ทธ์ ๋ํด ๊ถ๊ธํ๋ฉด slf4j
์ logback
์ ๋ํด ๊ตฌ๊ธ๋งํด ๋ณด๋ฉด ์ข๋ค.
ํ ์คํธ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
testCompileClasspath - org. ... spring-boot-starter-test ์์ ๋ณผ ์ ์๋ค.
org.junit.jupiter:junit-jupiter
(JUnit5)- ์๋ฐ์์ ํ ์คํธ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
.. spring-test
: JUnit๊ณผ ์คํ๋ง์ ํตํฉ ํ ์คํธ๋ฅผ ์ง์ํจ
View ํ๊ฒฝ์ค์
์๋ฌด ๋ด์ฉ ์์ด ์คํ๋ง ์น์๋ฒ๋ฅผ ์คํํ๋ฉด Whitelabel Error Page๋ง ๋ฌ๋ค.
์น ํ์ด์ง์ ๋ด์ฉ์ ๋ฃ์ด๋ณด์.
Welcome Page ๋ง๋ค๊ธฐ
ํ๋ก์ ํธ/src/main/resources/static/index.html
์ด ๊ฒฝ๋ก์ index.html
ํ์ผ์ ๋ง๋ค๋ฉด ํด๋น ํ์ผ์ welcome page๋ก ์ธ์ํ๋ค.
(welcome page = ๋๋ฉ์ธ์ ์ ์ํ๋ฉด ๋ณด์ด๋ ์ฒซ ํ๋ฉด)
index.html
์ ๋ง๋ค๊ณ ํ๋ก์ ํธ ํ์ผ์ ์คํํ ๋ค localhost:8080์ ์ ์ํ๋ฉด ์์ฑํ htmlํ์ผ๋๋ก ๋์จ๋ค.
์คํ๋ง์ ๊ณต๋ถํ ๋๋..
์คํ๋ง : ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ด๋ จ๋ ์ํ๊ณ ์ ๋ฐ์ ๋ชจ๋ ํฌ๊ดํ ๋งํผ ํฌ๋ค.
์คํ๋ง ๋ถํธ : ์คํ๋ง ์ ์ฒด๋ฅผ ๊ฐ์ธ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํจ.
๋ฐ๋ผ์ ์คํ๋ง์ ๊ณต๋ถํ ๋๋ ํ์ํ ๊ฑธ ์ฐพ์ ์ฐ๋ ๋ฅ๋ ฅ์ด ์ค์ํ๋ค.
spring.io
์ ์ ์ํ๋ค.- Projects - Spring Boot์ ์ ์ ํ Learn์ ๋๋ฅธ๋ค
- Reference Documentation์ ๋๋ฅธ๋ค
- ์ํ๋ ๋ด์ฉ์ ์ฐพ์์ ๊ณต๋ถํ๋ค.
์ฒ์์๋ ์คํ๋ง ๊ณต์ ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผํ๋ ๊ฒ๋ ์ข๋ค.
ํ ํ๋ฆฟ ์์ง์ด๋?
- Spring MVC๋ฅผ ํ์ฉํด ๋์ HTML์ ์ ๊ณต .
- Thymeleaf, FreeMaker, JSPs ๋ฑ์ด ์์.
- ์คํ๋ง์ FreeMaker, Tyemeleaf, Groovy, Mustache์ ๋ํด auto-configuration์ ์ ๊ณตํจ.
Controller ์ปจํธ๋กค๋ฌ
MVC๋ชจ๋ธ์ Controller๋ฅผ ๋งํ๋ค.
์ปจํธ๋กค๋ฌ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒซ ๋ฒ์งธ ์ง์ ์ ์ด๋ค.
ํด๋์ค ์ ์ธ๋ถ ์์ @Controller
์ด๋
ธํ
์ด์
์ ์ฌ์ฉํด ์ ์ธํ๋ค.
src/main/java/ํ๋ก์ ํธํ์ผ
์HelloController
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";
}
}
@GetMapping()
: ์น ์ ํ๋ฆฌ์ผ์ด์
์์ /hello
์ฃผ์๋ฅผ ๋ฐ์ผ๋ฉด ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํด ์ค๋ค. (์คํ๋ง์ด ํด ์ค๋ค)
HTTP์ Get, Post ํ ๋ ๊ทธ Get์ด๋ค.
src/main/resources/templates
์hello.html
<!DOCTYPE html>
<html xmlns:th = "http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p th:text="'์๋
ํ์ธ์. ' + ${data}">์๋
ํ์ธ์. ์๋</p>
</body>
</html>
(${data}
๋ถ๋ถ์ ๋นจ๊ฐ ์ค์ด ๋ฐ ์ ์์ง๋ง ์คํํ๋ฉด ์ ๋๋ค)
- ์น ๋ธ๋ผ์ฐ์ ์์
localhost:8080/hello
๋ผ๋ URL์ ์ ๋ ฅ๋ฐ์ผ๋ฉด - (์คํ๋ง ๋ถํธ์ ๋ด์ฅ๋) ํฐ์บฃ ์๋ฒ๊ฐ ์ด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ์ ๋ฌํด ์ค๋ค.
- ์คํ๋ง ์ปจํ
์ด๋๋ ์ปจํธ๋กค๋ฌ(
@Controller
)์์@GetMapping("hello")
๋ฅผ ์ฐพ๋๋ค. - URL์ด ๋งค์นญ๋๋ฉด
@GetMapping("hello")
์๋์ ๋ฉ์๋์ธhello(Model model)
๊ฐ ์คํ๋๋ค.model.addAttribute("data", "hello!!");
- : Model์ ํค๊ฐ data, ๊ฐ์ด hello!!์ธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค.
return "hello";
- : (๊ธฐ๋ณธ์ ์ผ๋ก)
src/main/resources/templates
ํ์์ ์๋ ํด๋น ์ด๋ฆ์ ํ์ผ(hello.html
)์ ์ฐพ์ ๋ ๋๋ง(์ฐ๊ฒฐ)ํ๋ค.
- ์ด ๋ ์คํ๋ง์ Model์ ๋ง๋ค์ด์ ํด๋น ๋ฉ์๋์ ๋ฃ์ด ์ค๋ค. (๋งค๊ฐ๋ณ์)
- ์ฐ๊ฒฐ๋ ํ์ผ์ ์คํํ๋ค. ์ด ๋
${}
๋ก ์ฒ๋ฆฌ๋ ๋ถ๋ถ์ Model์์ ํด๋น ํค์ ๋ง๋ ๊ฐ์ ์ฐพ์ ์นํ๋๋ค.hello.html
์${data}
๋hello(Model model)
์ ๋ชจ๋ธ์ ๋ฃ์ด์ง ํค=data, ๊ฐ=hello!!์ธ ์๋ฃ๋ฅผ ์ฐพ์ ๊ทธ ๊ฐ(hello!!
)์ ๊ฐ์ ธ์จ๋ค.
โ ์ปจํธ๋กค๋ฌ์์ ๋ฆฌํด ๊ฐ์ผ๋ก ๋ฌธ์๋ฅผ ๋ฐํํ๋ฉด, ๋ทฐ ๋ฆฌ์กธ๋ฒ(view resolver)๊ฐ ํ๋ฉด์ ์ฐพ์์ ์ฒ๋ฆฌํ๋ค
- ์คํ๋ง๋ถํธ ํ ํ๋ฆฟ์์ง ๊ธฐ๋ณธ viewName(๋ฆฌํด๊ฐ์ผ๋ก ๋ฐ์ ๋ฌธ์)์ ๋งคํ.
src/main/resources/templates/
+ viewName +.html