Bibi's DevLog ๐ค๐
mustache(ํ ํ๋ฆฟ์์ง), ๋์ HTML, MVC์ ๊ฐ๋ , formํ๊ทธ, GET/POST ์ฐจ์ด ๋ณธ๋ฌธ
mustache(ํ ํ๋ฆฟ์์ง), ๋์ HTML, MVC์ ๊ฐ๋ , formํ๊ทธ, GET/POST ์ฐจ์ด
๋น๋น bibi 2021. 3. 9. 01:05mustache๋ฅผ ํ์ฉํ ๋์ ์ธ HTML๊ณผ MVC ์ค๋ช
์ปจํธ๋กค๋ฌ์์ mustache๋ผ๋ ํ ํ๋ฆฟ์์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด, ๋์ ์ธ HTML์ ๋ง๋ค์ด๋ด๋ ๋ฒ์ ๋ฐฐ์ด๋ค.
MVC์ ๊ฐ๋
MVC๋ ํ ๊ณณ์์ ๋ง์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋์ , ๊ฐ ์ฝ๋์ ์ญํ ์ ๋ถ๋ดํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
- Controller : ์ต์ด ์ง์ ์ง์ . ์ฌ์ฉ์์ ์ ๋ ฅ ๊ฐ์ด ์ ํจํ ์ง๋ฅผ ๊ฒ์ฆํ๊ณ , ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ Model์ ์ ๋ฌํ๊ณ , Model์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ด๋ํ View๋ฅผ ๊ฒฐ์ ํ๋ ์ญํ
- Model : ์ค์ง์ ์ธ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๋ ์ญํ ์ ๋ด๋นํจ. ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ DB์ ์ ์ฅํ๊ณ ์กฐํํ๋ ์ญํ . ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ง์ด๋ผ ํ ์ ์์.
- View : Controller์ ์ํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ์ถ๋ ฅํ๋ ์ญํ
ํ ํ๋ฆฟ ์์ง์ด๋?
: ์ง์ ๋ ํ ํ๋ฆฟ ์์๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ HTML๋ฌธ์๋ฅผ ์ถ๋ ฅํ๋ ์ํํธ์จ์ด.
- ์๋ฒ ํ
ํ๋ฆฟ์์ง : JSP, Freemarker ..
- ์๋ฒ์์ Java์ฝ๋๋ก ๋ฌธ์์ด์ ๋ง๋ ๋ค, ๋ฌธ์์ด์ HTML๋ก ๋ณํํด ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌํจ
- ํด๋ผ์ด์ธํธ ํ ํ๋ฆฟ์์ง : Viewํ์ผ(๋ฆฌ์กํธ ๋ฑ)
์๋ฐ์์๋ ๋ค์ํ ์๋ฒ ํ ํ๋ฆฟ ์์ง์ด ์กด์ฌํจ.
- JSP, Velocity, Freemarker, Thymeleaf, Mustache .. ๊ฐ ์์
- ๊ถ์ฅ : Mustache, Thymeleaf
- Mustache(๋ฌธ๋ฒ์ด ์ฌํ. JS์ Java ๋ชจ๋ ์ง์. ์ธํ ๋ฆฌ์ ์ด ๋ฌด๋ฃ๋ฒ์ ์์๋ ํ๋ฌ๊ทธ์ธ ์ง์)
- Thymeleaf(์คํ๋ง์ด ์ ๊ทน ์ง์ but ๋ฌธ๋ฒ์ด ์ด๋ ค์. JSํ๋ ์์ํฌ์ ๋น์ท)
mustache(๋จธ์คํ์)
: ์๋ง์ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฐ์ฅ ์ฌํํ ํ ํ๋ฆฟ์์ง.
์๋ฐ์์ ์ฌ์ฉ๋ ๋๋ ์๋ฒ ํ ํ๋ฆฟ ์์ง์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ.
Mustache ํ ํ๋ฆฟ ํ์ผ์ ํธ์ถํ๋ ค๋ฉด ๋ฐ๋์ ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ํธ์ถํด์ผ ํ๋ค.
๋จธ์คํ์์ ํ์ผ ์์น๋ ๊ธฐ๋ณธ์ ์ผ๋ก
scr/main/resources/templates
์ด๋ค.๋จธ์คํ์์ ํ์ผ ํ์ฅ์๋
.mustache
์ด๋ค. (.html
ํ์ผ ํ์ฅ์๋ฅผ.mustache
๋ก ์์ฑํ๋ฉด ๋๋ค)
์ค์น
์ธํ ๋ฆฌ์ ์ด ํ๋ฌ๊ทธ์ธ - mustache ๊ฒ์ - "Handlebars/Mustache" ์ค์น ํ ์ฌ์์
build.gradle์ mustache ์์กด์ฑ ๋ฑ๋ก (dependencies์ ์ถ๊ฐ) ํ gradle ์ ๋ฐ์ดํธ
compile('org.springframework.boot:spring-boot-starter-mustache')
application.properties์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
(html ์ฝ๋ ์์ ์ ๋งค๋ฒ ์๋ฒ๋ฅผ ์ฌ์์ํ๋ ๋ฒ๊ฑฐ๋ก์์ ํผํ๊ธฐ ์ํ ์์ ์ด๋ค)
spring.mustache.cache=false
์ ์ ์ธ ํ์ด์ง
package com.codessquad.qna.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class WelcomeController {
@GetMapping("/helloworld")
public String welcome() {
return "welcome";
}
}
@Controller
: ์ปจํธ๋กค๋ฌ์์ ๋ช
์ํ๋ ์ด๋
ธํ
์ด์
๋ฉ์๋๋ช ์ ์๋ฌด ์๊ด์ด ์๋ค.
@GetMapping("URL์ฃผ์")
: ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋ URL์ ์ง์ ํจ.
@GetMapping("")
,@PostMapping("")
๋ ๊ฐ์ง๋ฅผ ๋จผ์ ์ฌ์ฉํด ๋ณธ๋ค.
returl "welcome";
- ๋จธ์คํ์ ์คํํฐ๊ฐ ์ปจํธ๋กค๋ฌ์ ๋ฆฌํด๊ฐ(๋ฌธ์์ด)์ ๋ํด ์์ ๊ฒฝ๋ก(
src/main/resources/templates
)์ ๋ค์ ํ์ผ ํ์ฅ์(.mustache
)๋ฅผ ์๋ ์ง์ ํด ์ค๋ค.
ํ์ผ์ ๋ถ๋ฌ์ค๋ ๊ณผ์
- ๋ธ๋ผ์ฐ์ ์์
localhost:8080/helloworld
๋ก ์์ฒญ์ ํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค. - ์ปจํธ๋กค๋ฌ์์
/helloworld
๊ฐ ๋งตํ๋welcome()
๋ฉ์๋๊ฐ ํธ์ถ๋๋ค welcome()
์ ๋ฆฌํด๊ฐ์ธ "welcome"์ ํด๋นํ๋ template๋๋ ํ ๋ฆฌ์ htmlํ์ผ(mustache)์ธwelcome.mustache
๊ฐ ๋ก๋๋๋ค
๋์ ์ธ ํ์ด์ง
์๋ฒ์ ๋์ ์ธ ์์ฒญ ๋ณด๋ด๊ธฐ
: ์์ฒญ URL ๋ค์ ?
์ ๋ถ์ธ ๋ค์, ํค=๊ฐ(๋ณ์๋ช
=๋ณ์์ ๊ฐ) ์ ์ง์ ํ๋ค.
localhost:8080/helloworld?name=bibi
๋ ๊ฐ ์ด์์ ๊ฐ์ ๋ณด๋ผ ๋๋ ํค=๊ฐ ์ฌ์ด์ &
๋ฅผ ์ฌ์ฉํ๋ค.
localhost:8080/helloworld?name=bibi&age=30
์๋ฒ์์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ
: URL์ ์ง์ ๋ ๋ณ์๋ช ์ ๋งตํ๋ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.
์๋ฅผ ๋ค์ด
localhost:8080/helloworld?name=bibi
์ name=bibi๋ฅผ ๋ฐ๊ธฐ ์ํด์๋@GetMapping("/helloworld")
๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ฅผwelcome(String name)
๋ก ๋ฐ์ ์ ์๋ค.๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ MVCํจํด ์ค Model์ ์ฌ์ฉํ๋ค.
WelcomeController.java
package com.codessquad.qna;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class WelcomeController {
@GetMapping("/helloworld")
public String welcome(String name, Model model) {
System.out.println("name : " + name);
model.addAttribute("name", name);
return "welcome";
}
}
Model
: ์ํฌํธํด์ ์ฌ์ฉ (import org.springframework.ui.Model;
)
- ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก
Model
์ ์ง์ ํ๊ณ , addAttribute(ํค, ๊ฐ)
๋ก Model์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฐ์ ๋ฃ์ด ์ ๋ฌํ ์ ์์.- Model์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ "welcome"์ด ๋ฆฌํด๋ ๋ ํจ๊ป ์ ๋ฌ๋๋ค.
์ฆ ํด๋น ๊ณผ์ ์ MVC๋ก ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์๋ค.
: Controller์์ Model์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ํ, welcome.html์ด๋ผ๋ View๋ก ๋ณด๋ด๋ ๊ฒ.
welcome.mustache
<!DOCTYPE HTML>
<html>
<head>
<title>Welcome</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>์คํ๋ง ๋ถํธ๋ก ์์ํ๋ ์น ์๋น์ค</h1>
{{name}}, hello world!
</body>
</html>
{{name}}
{{
,}}
: ๋จธ์คํ์์ ๋ฌธ๋ฒ์ผ๋ก, Model์ ๋ด์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ ์ฌ์ฉํ๋ค.name
: Model์ ๊ฐ์ ๋ด์ ๋(addAttribute(ํค, ๊ฐ)
) ์ฌ์ฉํ ํค๋ฅผ ๋ฑ๋กํ๋ฉด ๊ทธ ๊ฐ์ ๊ฐ์ ธ์ ์ค๋ค.์ฆ ์น ํ์ด์ง์ ๊ฒฐ๊ณผ๋
bibi, hello world!
๊ฐ ๋๋ค.
์น ๊ฐ๋ฐ์ html์ ํ์ฉํ ๋๋ ๊ฑฐ์ ๋์ ์ผ๋ก ์ฌ์ฉํ๋ค.
์ฆ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณต ๋ฐ ์ฒ๋ฆฌํ๊ณ , ๊ฐ์ ๋ฐ๋ผ html์ ๋์ ์ผ๋ก ๋ฐํํด ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
๊ทธ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ํ ํ๋ฆฟ์์ง์ด๋ฉฐ, ํ ํ๋ฆฟ์์ง ์ค ํ๋๊ฐ mustache์ด๋ค.
<form>
์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ <form>
ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
์์ฑ
action
: ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ์ด๋ค URL๋ก ๋ณด๋ผ์ง๋ฅผ ์ง์ ํ ์ ์์.<form action="/create">
: ํด๋น form์ผ๋ก๋ถํฐ/create
๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋
URL์ด ์ถ๊ฐ๋๋ฉด ํญ์ ์์ํ๋ Controller ๋ฐ ๋ฉ์๋๊ฐ ์์ด์ผ ํ๋ค.
- formํ๊ทธ์ ์๋ฌด ์์ฑ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก GET๋ฐฉ์์ผ๋ก ํต์ ํ๋ค.
index.mustache
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Index</title>
</head>
<body>
<form action="/create">
<div>
<label for="userid">์์ด๋</label>
<input type="text" name="userid" placeholder="์์ด๋">
</div>
<div>
<label for="password">๋น๋ฐ๋ฒํธ</label>
<input type="password" name="password" placeholder="๋น๋ฐ๋ฒํธ">
</div>
<div>
<label for="username">์ด๋ฆ</label>
<input type="text" name="username" placeholder="์ด๋ฆ">
</div>
<div>
<label for="useremail">์ด๋ฉ์ผ</label>
<input type="email" name="useremail" placeholder="์ด๋ฉ์ผ">
</div>
<button type="submit">์ ์ถ</button>
</form>
</body>
</html>
์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์๊ณ ์ ์ถํ์ ๋์ URL
: http://localhost:8080/create?userid=&password=&username=&useremail=
UserController.java
package com.codessquad.qna.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class UserController {
@GetMapping("/create")
public String create(String userid, String password, String username, String useremail) {
System.out.println("์์ด๋ : " + userid);
System.out.println("๋น๋ฐ๋ฒํธ : " + password);
System.out.println("์ด๋ฆ : " + username);
System.out.println("์ด๋ฉ์ผ : " + useremail);
return "index";
}
}
์ถ๋ ฅ ๊ฒฐ๊ณผ : ์์ด๋ : a
๋น๋ฐ๋ฒํธ : b
์ด๋ฆ : c
์ด๋ฉ์ผ : d@e
์ฆ, html์์ name์ ํด๋นํ๋ ๊ฐ๋ค (userid
, password
, username
, useremail
)์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค.
๋จ์ : GET๋ฐฉ์์ URL๋ก ๊ฐ์ด ์ ๋ฌ๋์ด ๋น๋ฐ๋ฒํธ ๋ฑ ๋ ธ์ถ์ํ์ด ์๋ค. ์ด๋ด ๋๋
ํด๊ฒฐ : formํ๊ทธ์
method="post"
์์ฑ์ ์ถ๊ฐํ๊ณ , ์ปจํธ๋กค๋ฌ ์ด๋ ธํ ์ด์ ์@PostMapping()
์ผ๋ก ๋ณ๊ฒฝํด POST๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋ฉด ๋๋ค.POST๋ฐฉ์์ ๋ฐ์ดํฐ๋ฅผ URL๋ก ์ ๋ฌํ์ง ์์ ์ ๋ณด๊ฐ ๋ ธ์ถ๋์ง ์๋๋ค.
GET๋ฐฉ์๊ณผ POST๋ฐฉ์
GET ๋ฐฉ์ : ๋ฐ์ดํฐ ์์ฒญ ๋ฐ ์กฐํํ ๋.
POST ๋ฐฉ์ : ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด ์ถ๊ฐ ๋ฐ ์์ ํ ๋.
GET, POST ์ฌ์ฉํ๋ ๊ธฐ์ค์?
- GET์ Select์ ์ธ ์ฑํฅ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. GET์ ์๋ฒ์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ณด์ฌ์ค๋ค๊ฑฐ๋ ํ๋ ์ฉ๋์ด์ง ์๋ฒ์ ๊ฐ์ด๋ ์ํ๋ฑ์ ๋ฐ๊พธ์ง ์์ต๋๋ค. ๊ฒ์ํ์ ๋ฆฌ์คํธ๋ผ๋์ง ๊ธ๋ณด๊ธฐ ๊ธฐ๋ฅ ๊ฐ์ ๊ฒ์ด ์ด์ ํด๋นํ์ฃ .
- POST๋ ์๋ฒ์ ๊ฐ์ด๋ ์ํ๋ฅผ ๋ฐ๊พธ๊ธฐ ์ํด์ ์ฌ์ฉํฉ๋๋ค. ๊ธ์ฐ๊ธฐ๋ฅผ ํ๋ฉด ๊ธ์ ๋ด์ฉ์ด ๋๋น์ ์ ์ฅ์ด ๋๊ณ ์์ ์ ํ๋ฉด ๋๋น๊ฐ์ด ์์ ์ด ๋์ฃ . ์ด๋ด ๊ฒฝ์ฐ์ POST๋ฅผ ์ฌ์ฉํฉ๋๋ค.