1. with Spring initializr
Metadata
Group : ๊ธฐ์ ์ด๋ฆ, ๋๋ฉ์ธ ๋ช
Artifact : ๋น๋๋์ด ๋์จ ๊ฒฐ๊ณผ๋ฌผ์ ์ด๋ฆ ( ํ๋ก์ ํธ๋ช )
Dependencies : ์คํ๋ง ๋ถํธ ํ๋ก์ ํธ์์ ์ด๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
์น ํ๋ก์ ํธ -> Spring Web
HTML ํ ํ๋ฆฟ ์์ง -> Thymeleaf ๋ฑ
test : ํ ์คํธ์ฝ๋ ๊ด๋ จ๋ด์ฉ
resources : java ํ์ผ์ ์ ์ธํ xml, ์ค์ ํ์ผ ๋ฑ
build.gradle
plugins : ๊ทธ๋๋ค ์ค์
repositories : ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋ URL
dependencies : ๋ผ์ด๋ธ๋ฌ๋ฆฌ
gitignore : ์์ค์ฝ๋ ๊ด๋ฆฌ ( ๊นํ์ ํ์์๋ ์ฝ๋๋ค์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก )
์๋ฐ ํด๋ ์ ํ๋ก์ ํธ ํจํค์ง ์ ๋ฉ์ธ ๋ฉ์๋ + ์๋ฐ ์ฌํ
์๋ฒ๋ฅผ ์ด๋ฉด์..
์คํ๋ง ๋ถํธ ๋ฒ์ ํ์ธ
ํฐ์บฃ ํฌํธ ๋ฒํธ ํ์ธ
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด
dependencies์๋ ์๋ ์ ๋ง์ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ํ๋ก์ ํธ ์์ฑ๊ณผ ํจ๊ป ๋ฐ์์ง๋ค.
Why? ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ ์์กด๊ด๊ณ๊ฐ ๋ค๋ฐฉ๋ฉด์ผ๋ก ์๋ก ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ
Gradle์์..
Dependencies์ ์์กด๊ด๊ณ๊ฐ ์ ๋ฆฌ๋์ด ์๋ค -> Thymeleaf, Spring Web๋ง ๊ฐ์ ธ์๋ ์ ๋ง์ ์ฐ๊ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ฐ์ด ์จ๋ค
+ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ (*) ํ์ : ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋์ผํ ๋ด์ฉ์ ์ด๋ฏธ ๊ฐ์ ธ์์
* tomcat : ์น ์๋ฒ ~ WAS
์คํ๋ง ๋ถํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : auto configure, dependencies, starter-logging, spring core ๋ฑ
๋ก๊ทธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ~ ์ค๋ฌด: Log๋ก ๊ธฐ๋กํด์ผ ์ค๋ฅ๋ฅผ ํ์ธํ๊ณ ํธ๋ฌ๋ธ ์ํ ์ ์ํ ์๋ฃ๋ฅผ ๋ง๋ค ์ ์๋ค
(in ์คํ๋ง ๋ถํธ ์คํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ - ๋ก๊น ) -> ์์ฆ ํ์ค์ธ logback, slf4j ๋ผ์ด๋ธ๋ฌ๋ฆฌ ~ ๊ฒ์ํ๊ธฐ
in spring boot starter test
์คํ๋ง ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Java Junit ๋ผ์ด๋ธ๋ฌ๋ฆฌ
Mockito : ๋ชฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
assertj : ํ ์คํธ ์ฝ๋ ์์ฑ ๋์ฐ๋ฏธ
spring- test : ์คํ๋ง ํตํฉ ํ ์คํธ ์ง์
3. View ์ค์ ๋ฑ
index.html ~ welcome ํ์ด์ง ์์ฑ (์คํ๋ง ๋ถํธ ๊ณต์ ํํ์ด์ง : index.html์ ๊ธฐ๋ณธ ์ค์ ํจ)
์น ํ ํ๋ฆฟ ์์ง์ ํตํด ์ง์ ๋ ํ ํ๋ฆฟ ์์๊ณผ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ ธ์ HTML ๋ฌธ์๋ฅผ ์ถ๋ ฅ
(์๋ฒ ์ฌ์ด๋ ํ ํ๋ฆฟ ์์ง ์ : JSP/ Thymleaf)
์ปจํธ๋กค๋ฌ ํจํค์ง ๋ฐ ์ปจํธ๋กค๋ฌ ๊ตฌํ
templates ํด๋์ ํ ํ๋ฆฟ ์์ง์ด ์ ์ฉ๋๋ HTML ํ์ผ ์์ฑ ~ ๋์ ํ ๋น๋ HTML
* ๊ฐ๋จํ ํธ๋ฌ๋ธ : ๊ฐ์ ํจํค์ง๊ฐ ์๋ controller์ ์์ฒญ์ ์ฒ๋ฆฌ๋์ง ์๋๋ค. ์? ์ ๊ทผ์ ์ด์?
+ Dev-tools ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด HTML ํ์ผ์ ์ปดํ์ผ๋ง ์๋ค๋ฉด ์๋ฒ ์ฌ์์์์ด View ๋ณ๊ฒฝ ๊ฐ๋ฅ
4. ๋ช ๋ น์ด๋ก ๋น๋ํ๊ธฐ
5. ์คํ๋ง ์น๊ฐ๋ฐ ๊ธฐ์ด
์ ์ ์ปจํ ์ธ : ์๋ฒ์ ์์ ์์ด ์์ฒญ์ ์ฆ์ ํ์ผ๋ก ์๋ตํ๋ ์ปจํ ์ธ
MVC์ ํ ํ๋ฆฟ ์์ง : Jsp, Php ๋ฑ html์ ๋์ ์ผ๋ก ๋ณ๊ฒฝํด์ ๋ฐํํ๋ ๋ฐฉ์
API : Json์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๋ฐฉ์, ์๋ฒ ๊ฐ ํต์ ๋ฐฉ๋ฒ(html์ ๋ฐํํ ํ์๊ฐ ์๋ค) ~ React ๋ฑ
MVC vs ์ ์ ์ปจํ ์ธ
- ์ ์ ์ปจํ ์ธ ๋ ์๋ฒ์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋๋ ๋ด์ฉ์ด ์๋ค
์ ์ ์ปจํ ์ธ
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
์ ์ ์ปจํ
์ธ ์
๋๋ค.
</body>
</html>
MVC
View : ํ๋ฉด์ ๋ ๋๋ง ํ๋ ๋ฐ ์ง์ค
MC : ๋ด๋ถ ์ฒ๋ฆฌ์ ์ง์ค
Param ๋ฐฉ์์ผ๋ก ๊ฐ์ ํ ๋นํ๊ธฐ
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
http://localhost:8080/hello-mvc?name=spring!
API
@GetMapping("hello-string")
@ResponseBody // ์๋ฐ ๊ฐ์ฒด๋ฅผ http ์๋ต body๋ก ๋ณํ
public String helloString(@RequestParam("name")String name) {
return "hello" + name; // ํ
ํ๋ฆฟ ์์ง์ ๊ฑฐ์น์ง ์๊ณ ๊ทธ๋๋ก ๋ฐ์ดํฐ ์๋ต
}
// ๋ฌธ์์ ๊ฒฝ์ฐ์ ๊ฐ๋ฅํ ๋ฐฉ์, ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ์ API ๋ฐฉ์์ ์ฌ์ฉํ์
@ResponseBody๋ฅผ ์ฌ์ฉํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉด ๊ฐ์ฒด๊ฐ Json์ผ๋ก ๋ฐํ ~ API๋ฐฉ์
@ResponseBody ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ( viewResolver )๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋์ ์ HTTP์ BODY์ ๋ฌธ์ ๋ด์ฉ์ ์ง์ ๋ฐํ(HTML BODY TAG๋ฅผ ๋งํ๋ ๊ฒ์ด ์๋)
๋ทฐ ๋ฆฌ์กธ๋ฒ ๋์ HttpMessageConverter๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ๊ณ , String์ ๊ฒฝ์ฐ StringConverter, ๊ธฐ๋ณธ ๊ฐ์ฒด๋ JsonConverter(MappingJackson : ์คํ๋ง ๊ธฐ๋ณธ, Gson ๋ฑ)๋ฅผ ํตํด ๋ฐ์ดํฐ๋ก ๋ณํ ํ ์๋ต
+ ๋ด๋ถ ํด๋์ค : ๋ด๋ถ ํด๋์ค์ ์ ๊ทผํ๊ธฐ ์ํด์ ์ข ์๋ ์ธ๋ถ ํด๋์ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ํตํด์๋ง ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ Static ๋ด๋ถ ํด๋์ค์ ๊ฒฝ์ฐ ์ธ๋ถ ํด๋์ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ํตํ์ง ์์๋ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
( ์ ๊ทผ vs ํธ์ถ??)
+ ์๋ฐ ๋น ๊ท์ฝ?
https://dololak.tistory.com/133
+ ํ๋กํผํฐ ์ ๊ทผ ๋ฐฉ์