๐ก
1. Mustache์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
2. Mustache ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ํ์ธํด ๋ณด์.
Mustache๋ ๊ฑฐ์ ๋ก์ง์ด ์๋ ํ ํ๋ฆฟ ์์ง์ผ๋ก, ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๊ฐ๋จํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ํ ํ๋ฆฟ์ ๋ง๋๋ ๋ฐ์ ์ ์ฉํฉ๋๋ค. Spring Boot์ Mustache๋ฅผ ๊ฒฐํฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋ฐฑ์๋ ๋ก์ง๊ณผ ํ๋ก ํธ์๋ ํํ์ ๋ถ๋ฆฌํ์ฌ ๋ ํจ์จ์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
Mustache์ ์ฃผ์ ํน์ง
- ๋ก์ง์ ์ต์ํํ ํ ํ๋ฆฟ(Logic-less templates): Mustache ํ ํ๋ฆฟ์ ๋ณต์กํ ๋ก์ง์ ์ต์ํํ์ฌ, ํ ํ๋ฆฟ ๋ด์์ ๊ฐ๋จํ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ง์ํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ๋ฐ์ ์ง์คํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
{{#users}}...{{/users}}๋ users ๋ชฉ๋ก์ ๋ํ ๋ฐ๋ณต์, {{^users}}...{{/users}}๋ users๊ฐ ๋น์ด ์์ ๋์ ์ฒ๋ฆฌ๋ฅผ ๋ํ๋ ๋๋ค.
if๋ฌธ ์ฌ์ฉX
- ์ธ์ด ๋ ๋ฆฝ์ฑ(Language agnostic): Mustache๋ JavaScript, Java, Python ๋ฑ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ฐ๋จํจ(Simplicity): ํ ํ๋ฆฟ์ ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
Spring Boot์ Mustache ์ ์ฌ์ฉ
Spring Boot์์ Mustache๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด, ๋จผ์ spring-boot-starter-mustache ์์กด์ฑ์ ํ๋ก์ ํธ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ด ์คํํฐ๋ Mustache ํ ํ๋ฆฟ ์์ง๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ํ์ํ ์์กด์ฑ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ ํ, src/main/resources/templates ๋๋ ํ ๋ฆฌ์ Mustache ํ ํ๋ฆฟ ํ์ผ์ ์์น์ํค๊ณ , Spring MVC ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ ํ ํ๋ฆฟ์ ์ ๋ฌํ์ฌ ๋์ ์ธ ์น ํ์ด์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
application-dev.yml ์ถ๊ฐ
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mustache'
// ...
}
SampleController
package com.example.demo._domain.blog.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SampleController {
// ์ฃผ์ ์ค๊ณ : http://localhost:8080/ (GET) ์์ฒญ
@GetMapping("/")
public String home(Model model) {
// ๋ทฐ ๋ฆฌ์กธ๋ธ ๋์
// hello --> src/main/resources/templates/hello.mustache
model.addAttribute("name", "ํ๊ธ ์ค์ ");
return "hello";
}
}
hello.mustache ํ ํ๋ฆฟ ํ์ผ์ src/main/resources/templates ๋๋ ํ ๋ฆฌ์ ์์นํด์ผ ํ๋ฉฐ, ์ด ํ์ผ์ Mustache ํ ํ๋ฆฟ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค. ๊ฐ๋จํ "Hello, World!" ์์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ hello.mustache ํ์ผ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
hello.mustache
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello, {{name}}</h1>
</body>
</html>
(.html -> .mustache)
์คํ ํ๋ฉด______
Model ๋ง๊ณ ์ธ ์ ์๋ ๊ฒ ์์๊น?
package com.example.demo._domain.blog.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import jakarta.servlet.http.HttpServletRequest;
@Controller
public class SampleController {
// ์ฃผ์ ์ค๊ณ : http://localhost:8080/ (GET) ์์ฒญ
@GetMapping("/")
public String home(HttpServletRequest request) {
// ๋ทฐ ๋ฆฌ์กธ๋ธ ๋์
request.setAttribute("name", "๋ฐ๊ฐ์");
// hello --> src/main/resources/templates/hello.mustache
// model.addAttribute("name", "ํ๊ธ ์ค์ ");
return "hello";
}
}
โก๏ธ request๋ก ํ ์ ์๋ค.
spring:
mustache:
servlet:
expose-session-attributes: true # Mustache ํ
ํ๋ฆฟ์์ ์ธ์
์์ฑ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉ
expose-request-attributes: true # Mustache ํ
ํ๋ฆฟ์์ ์์ฒญ ์์ฑ์ ์ ๊ทผํ ์ ์๋๋ก ํ์ฉ
์คํ ํ๋ฉด____