Thymeleaf ๊ธฐ๋ฅ - ๊ธฐ๋ณธ
by rlaehddnd0422ํ์๋ฆฌํ ์๊ฐ
ํ์๋ฆฌํ ํน์ง
- SSR - ์๋ฒ ์ฌ์ด๋์์ HTML์ ๋ ๋๋ง ํฉ๋๋ค
- ๋ค์ธ๋ด ํ ํ๋ฆฟ
- ์คํ๋ง ํตํฉ ์ง์
ํ์๋ฆฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ
์ ์ธ : ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ์ ์ธ์ ํ๋ฉด ๋ฉ๋๋ค.
<html xmlns:th="http://www.thymeleaf.org">
๊ธฐ๋ณธ ํํ์
ํ์๋ฆฌํ๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ํํ์๋ค์ ์ ๊ณตํ๋ค. ์ง๊ธ๋ถํฐ ํ๋์ฉ ์์๋ณด๊ฒ ์ต๋๋ค.
- ๊ฐ๋จํ ํํ
1. ๋ณ์ ํํ์ : ${...}
2. ์ ํ ๋ณ์ ํํ์ : *{...}
3. ๋ฉ์์ง ํํ์ : #{...} / 3. ๊ธฐ๋ณธ ๊ฐ์ฒด๋ค์์ ์ฌ์ฉ
4. ๋งํฌ URL ํํ์ : @{...} / 5. URL ๋งํฌ ๊ธฐ๋ฅ์์ ์ฌ์ฉ
5. ์กฐ๊ฐ ํํ์ : ~{...} / 14. ํ ํ๋ฆฟ ์กฐ๊ฐ ๊ธฐ๋ฅ์์ ์ฌ์ฉ
- ๋ฆฌํฐ๋ด
1. ํ ์คํธ : 'one text', 'Another one!'
2. ์ซ์ : 0, 34, 3.0, 12.3 ..
3. ๋ถ์ธ : true, false
4. ๋ : null
5. ๋ฆฌํฐ๋ด ํ ํฐ : one, sometext, main ...
- ๋ฌธ์ ์ฐ์ฐ
1. ํฉ์น๊ธฐ : +
2. ๋ฆฌํฐ๋ด ๋์ฒด : |The name is ${name}|
- ์ฐ์ ์ฐ์ฐ
1. Binary operators : +, -, *, /, %
2. Minus sign (๋จํญ ์ฐ์ฐ): - ex) -1, -2
- ๋ถ๋ฆฐ ์ฐ์ฐ
1. Binary operators : and, or
2. Boolean negation (๋จํญ ์ฐ์ฐ) : !, not
- ๋น๊ต์ ๋๋ฑ
1. ๋น๊ต : > (gt) , < (lt) , >=(ge) , <= (le) (gt,lt,ge,le)
2. ๋๋ฑ ์ฐ์ฐ : ==(eq), !=(ne)
- ์กฐ๊ฑด ์ฐ์ฐ
1. If-then : (if) ? (then)
2. If-then-else : (if) ? (then) : (else)
3. Default : (value) ?: (defaultvalue)
- ํน๋ณํ ํ ํฐ
No operation : _ (๋์ฐ๊ณ ๋ฐ์ค)
์ด์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ํ๋์ฉ ์์๋ณด๊ฒ ์ต๋๋ค.
1. ํ ์คํธ - text, utext
ํ์๋ฆฌํ๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTML ํ ๊ทธ์ ์์ฑ์ ๊ธฐ๋ฅ์ ์ ์ํด์ ๋์ํฉ๋๋ค. HTML์ ์ฝํ ์ธ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋๋ ๋ค์๊ณผ ๊ฐ์ด
th:text๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ex) <span th:text="${data}">HTML ์ฌ์ด๋์์ ๋ ๋๋งํ ํ ์คํธ</span>
๋ง์ฝ HTML ํ ๊ทธ์ ์์ฑ์ด ์๋ HTML ์ปจํ ์ธ ์์ญ์์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด [[...]]์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ex) [[${data}]]
@Controller
@RequestMapping("/basic")
public class BasicController {
@GetMapping("/text-basic")
public String textBasic(Model model) {
model.addAttribute("data", "Hello Spring!");
return "basic/text-basic";
}
View template : basic/text-basic
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>์ปจํ
์ธ ์ ๋ฐ์ดํฐ ์ถ๋ ฅํ๊ธฐ</h1>
<ul>
<li><span th:text="${data}">CSR ํ
์คํธ</span></li>
<li>์ปจํ
์ธ ์์์ ์ง์ ์ถ๋ ฅํ๊ธฐ = [[${data}]]</li>
</ul>
</body>
</html>
CSR(ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง, ์ ๋ ๊ฒฝ๋ก๋ก HTML ํธ์ถ)์์๋ th๊ฐ ๋ถ์ ์์ฑ์ ์ฝ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฌด์ํฉ๋๋ค.
SSR์์๋ th๊ฐ ๋ถ์ ์์ฑ์ ์ฝ์ต๋๋ค.
Escape
HTML ๋ฌธ์๋ <, >๊ฐ์ ํน์ ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ทฐ ํ ํ๋ฆฟ์ผ๋ก HTMLํ๋ฉด์ ์์ฑํ ๋๋ ์ถ๋ ฅํ๋ ๋ฐ์ดํฐ์ ์ด๋ฌํ ํน์๋ฌธ์๊ฐ ์๋ ๊ฒ์ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์์ ๋ง๋ ์์ ์ ๋ฐ์ดํฐ์ธ "Hello Spring!"์ "Hello <b>Spring</b>"๋ก ๋ฐ๊ฟ์ ์คํํด๋ณด๋ฉด
<b>ํ ๊ทธ๊ฐ <b>๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ <๋ฅผ HTML ํ๊ทธ์ ์์์ผ๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ <๋ฅผ ํ ๊ทธ์ ์์์ด ์๋๋ผ ๋ฌธ์๋ก ํํํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ด๊ฒ(<, >)์ HTML ์ํฐํฐ ๋ผ๊ณ ํฉ๋๋ค.
HTML์์ ์ฌ์ฉํ๋ ํน์๋ฌธ์(<,>)๋ฅผ HTML์ํฐํฐ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ด์ค์ผ์ดํ(escape)๋ผ๊ณ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์๋ฆฌํ๊ฐ ์ ๊ณตํ๋ th:text, [[...]]๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด์ค์ผ์ดํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
< โถ๏ธ <
< โถ๏ธ >
์ด์ค์ผ์ดํ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์์ผ๋ ค๋ฉด text ๋์ utext๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ [[...]] ๋์ [(...)]์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@GetMapping("/text-unescaped")
public String textUnescaped(Model model) {
model.addAttribute("data", "Hello <b>Spring!</b>");
return "basic/text-unescaped";
}
View template : basic/text-unescpaed
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Unescaped Text</title>
</head>
<body>
<h1>text vs utext</h1>
<ul>
<li>th:text = <span th:text="${data}"></span></li>
<li>th:utext = <span th:utext="${data}"></span></li>
</ul>
<h1><span th:inline="none">[[...]] vs [(...)]</span></h1>
<ul>
<li><span th:inline="none">[[...]] = </span>[[${data}]]</li>
<li><span th:inline="none">[(...)] = </span>[(${data})]</li>
</ul>
</body>
</html>
th:inline = "none" : ํ์๋ฆฌํ๋ [[...]]์ ํด์ํ๊ธฐ ๋๋ฌธ์, ํ๋ฉด [[...]]์ ๊ธ์๋ฅผ ๋ณด์ฌ์ค ์ ์์ต๋๋ค. ์ด ๋ inline = "none" ์ต์ ์ ์ด ํ๊ทธ์์์ ํ์๋ฆฌํ๊ฐ ํด์ํ์ง ์๋๋ก ํด์ฃผ๋ ์ต์ ์ ๋๋ค.
โ๏ธ์ค์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด escape๋ฅผ ์ฌ์ฉํ์ง ์์์ HTML์ด ์ ์ ๋ ๋๋ง ๋์ง ์๋ ์๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
escape๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ , ๊ผญ ํ์ํ ๋๋ง unescape๋ฅผ ์ฌ์ฉํ๋๋ก ํฉ์๋ค.
2. ๋ณ์ - SpringEL
๋ณ์ ํํ์ ${...} ์๋ ์คํ๋ง EL์ด๋ผ๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ํํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@Data
static class User {
private String username;
private int age;
public User(String username, int age) {
this.username = username;
this.age = age;
}
}
@GetMapping("/variable")
public String variable(Model model) {
User userA = new User("DongwoongKim", 25);
List<User> list = new ArrayList<>();
list.add(userA);
Map<String, User> map = new HashMap<>();
map.put("userA", userA);
model.addAttribute("user", userA);
model.addAttribute("users", list);
model.addAttribute("userMap", map);
return "basic/variable";
}
View template - basic/variable
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>SpringEL ํํ์</h1> <ul>Object
<li>${user.username} = <span th:text="${user.username}"></span></li>
<li>${user['username']} = <span th:text="${user['username']}"></span></li>
<li>${user.getUsername()} = <span th:text="${user.getUsername()}"></span></li>
</ul>
<h1>์ง์ญ ๋ณ์ - (th:with)</h1>
<div th:with="first=${users[0]}">
<p>์ฒ์ ์ฌ๋์ ์ด๋ฆ์ <span th:text="${first.username}"></span></p> </div>
<ul>List
<li>${users[0].username} = <span th:text="${users[0].username}"></span></li>
<li>${users[0]['username']} = <span th:text="${users[0]['username']}"></span></li>
<li>${users[0].getUsername()} = <span th:text="${users[0].getUsername()}"></span></li>
</ul>
<ul>Map
<li>${userMap['userA'].username} = <span th:text="${userMap['userA'].username}"></span></li>
<li>${userMap['userA']['username']} = <span th:text="${userMap['userA']['username']}"></span></li>
<li>${userMap['userA'].getUsername()} = <span th:text="${userMap['userA'].getUsername()}"></span></li>
</ul>
</body>
</html>
th:with๋ฅผ ์ฌ์ฉํ๋ฉด ์ง์ญ ๋ณ์๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์ ์ธ ํ๊ทธ ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
ex) <div th:with="first=${user[0]}">
<p>์ฒ์ ์ฌ๋์ ์ด๋ฆ์ <span th:text="${first.username}"><span></p>
</div>
first๋ div ํ๊ทธ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ.
SpringEL ๋ค์ํ ํํ์ ์ฌ์ฉ
1. Object
- user.username : user์ username์ ํ๋กํผํฐ๋ก ์ ๊ทผ (user.getUsername())
- user['username'] : ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋กํผํฐ๋ก ์ ๊ทผ
- user.getUsername() : user์ getUsername()์ ์ง์ ํธ์ถ
2. List
- users[0].username : List์์ ์ฒซ ๋ฒ์งธ ํ์์ ์ฐพ๊ณ username ํ๋กํผํฐ ์ ๊ทผ
- users[0]['username'] : ์์ ๊ฐ์
- users[0].getUsername() : List์์ ์ฒซ ๋ฒ์งธ ํ์์ ์ฐพ๊ณ ๋ฉ์๋ ์ง์ ํธ์ถ
3. Map
- userMap['userA'].username : ๋งต์์ userA๋ฅผ ์ฐพ๊ณ username ํ๋กํผํฐ ์ ๊ทผ
- userMap['userA']['username'] : ์์ ๊ฐ์
- userMap['userA'].getUsername() : ๋งต์์ userA๋ฅผ ์ฐพ๊ณ ๋ฉ์๋ ์ง์ ํธ์ถ
3. ๊ธฐ๋ณธ ๊ฐ์ฒด๋ค
ํ์๋ฆฌํ๊ฐ ์ ๊ณตํ๋ ๊ฐ์ฒด๋ค์ด ์์ต๋๋ค.
1. ${#request}
2. ${#response}
3. ${#session}
4. ${#servletContext}
5. ${#locale}
(1,2,3,4๋ ์คํ๋ง 3.0๋ถํฐ๋ ์ ๊ณตํ์ง ์์)
๊ทธ๋ฐ๋ฐ #request๋ HttpServletRequest ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ค๋ฉด request.getParameter("data")์ฒ๋ผ ๋ถํธํ๊ฒ ์ ๊ทผํด์ผ ํ๋๋ฐ ์ด๋ฐ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ํธ์ ๊ฐ์ฒด๋ ์ ๊ณตํฉ๋๋ค.
HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ ์ ๊ทผ : param.ํ๋ผ๋ฏธํฐ์ด๋ฆ
ex) "${param.paramData}"
HTTP ์ธ์ ์ ๊ทผ : session.์ธ์ ์ด๋ฆ
ex) "${session.sessionData}"
์คํ๋ง ๋น ์ ๊ทผ : @
ex) "${@hellobean.hello('Spring!')}"
@GetMapping("/basic-objects")
public String basicObjects(HttpSession session)
{
session.setAttribute("sessionData", "Hello Session!");
return "basic/basic-objects";
}
@Component("helloBean")
static class HelloBean {
public String hello(String data) {
return "Hello " + data;
}
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>์ ๊ธฐ๋ณธ ๊ฐ์ฒด (Expression Basic Objects)</h1> <ul>
<li>request = <span th:text="${#request}"></span></li>
<li>response = <span th:text="${#response}"></span></li>
<li>session = <span th:text="${#session}"></span></li>
<li>servletContext = <span th:text="${#servletContext}"></span></li>
<li>locale = <span th:text="${#locale}"></span></li>
</ul>
<h1>ํธ์ ๊ฐ์ฒด</h1>
<ul>
<li>Request Parameter = <span th:text="${param.paramData}"></span></li>
<li>session = <span th:text="${session.sessionData}"></span></li>
<li>spring bean = <span th:text="${@helloBean.hello('Spring!')}"></span></li>
</ul>
</body>
</html>
4. ์ ํธ๋ฆฌํฐ ๊ฐ์ฒด์ ๋ ์ง
ํ์๋ฆฌํ๋ ๋ฌธ์, ์ซ์, ๋ ์ง, URI ๋ฑ์ ํธ๋ฆฌํ๊ฒ ๋ค๋ฃจ๋ ๋ค์ํ ์ ํธ๋ฆฌํฐ ๊ฐ์ฒด๋ค์ ์ ๊ณตํฉ๋๋ค.
ํ์๋ฆฌํ ์ ํธ๋ฆฌํฐ ๊ฐ์ฒด๋ค
- #message : ๋ฉ์์ง, ๊ตญ์ ํ ์ฒ๋ฆฌ
- #uris : URI ์ด์ค์ผ์ดํ ์ง์
- #dates : java.util.Date ์์ ์ง์
- #calendars : java.util.Calendar ์์ ์ง์
- #temporals : ์๋ฐ8 ๋ ์ง ์์ ์ง์
- #numbers : ์ซ์ ์์ ์ง์
- #strings : ๋ฌธ์ ๊ด๋ จ ํธ์ ๊ธฐ๋ฅ
- #objects : ๊ฐ์ฒด ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต
- #bools : boolean ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต
- #arrays : ๋ฐฐ์ด ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต
- #lists , #sets , #maps : ์ปฌ๋ ์ ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต
- #ids : ์์ด๋ ์ฒ๋ฆฌ ๊ด๋ จ ๊ธฐ๋ฅ ์ ๊ณต, ๋ค์์ ์ค๋ช
๋๋ต ์ด๋ฐ๊ฒ๋ค์ด ์๋ค ์ ๋๋ง ์๊ณ ์์ธํ ํ๋ํ๋ ๋ค ์ ํ์๋ ์์ต๋๋ค.
๊ทธ๋ฅ ํ์ํ ์ํฉ์ด ์๋ค๋ฉด ์ฐพ์์ ์ฌ์ฉํฉ์๋ค.
์ฌ์ฉ ์์๋ก #temporals๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
@GetMapping("/date")
public String date(Model model) {
model.addAttribute("localDateTime", LocalDateTime.now());
return "basic/date";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>LocalDateTime</h1>
<ul>
<li>default = <span th:text="${localDateTime}"></span></li>
<li>yyyy-MM-dd HH:mm:ss = <span th:text="${#temporals.format(localDateTime,
'yyyy-MM-dd HH:mm:ss')}"></span></li>
</ul>
<h1>LocalDateTime - Utils</h1>
<ul>
<li>${#temporals.day(localDateTime)} = <span th:text="${#temporals.day(localDateTime)}"></span></li>
<li>${#temporals.month(localDateTime)} = <span th:text="${#temporals.month(localDateTime)}"></span></li>
<li>${#temporals.monthName(localDateTime)} = <span th:text="${#temporals.monthName(localDateTime)}"></span></li>
<li>${#temporals.monthNameShort(localDateTime)} = <span th:text="${#temporals.monthNameShort(localDateTime)}"></span></li>
<li>${#temporals.year(localDateTime)} = <span th:text="${#temporals.year(localDateTime)}"></span></li>
<li>${#temporals.dayOfWeek(localDateTime)} = <span th:text="${#temporals.dayOfWeek(localDateTime)}"></span></li>
<li>${#temporals.dayOfWeekName(localDateTime)} = <span th:text="${#temporals.dayOfWeekName(localDateTime)}"></span></li>
<li>${#temporals.dayOfWeekNameShort(localDateTime)} = <span th:text="${#temporals.dayOfWeekNameShort(localDateTime)}"></span></li>
<li>${#temporals.hour(localDateTime)} = <span th:text="${#temporals.hour(localDateTime)}"></span></li>
<li>${#temporals.minute(localDateTime)} = <span th:text="${#temporals.minute(localDateTime)}"></span></li>
<li>${#temporals.second(localDateTime)} = <span th:text="${#temporals.second(localDateTime)}"></span></li>
<li>${#temporals.nanosecond(localDateTime)} = <span th:text="${#temporals.nanosecond(localDateTime)}"></span></li>
</ul>
</body>
</html>
5. URL ๋งํฌ
ํ์๋ฆฌํ์์ URL ๋งํฌ๋ฅผ ์์ฑํ ๋๋ @{...} ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@GetMapping("/link")
public String link(Model model)
{
model.addAttribute("param1","data1");
model.addAttribute("param2","data2");
return "basic/link";
}
๋ทฐํ ํ๋ฆฟ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>URL ๋งํฌ</h1>
<ul>
<li><a th:href="@{/hello}">basic url</a></li>
<li><a th:href="@{/hello(param1=${param1}, param2=${param2})}">hello query
param</a></li>
<li><a th:href="@{/hello/{param1}(param1=${param1})}">path variable</a></li>
<li><a th:href="@{/hello/{param1}(param1=${param1}, param2=${param2})}">path variable + query parameter</a></li>
</ul>
</body>
</html>
- ๋จ์ URL : /hello โถ๏ธ @{/hello}
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ : /hello?param1=data1¶m2=data2 โถ๏ธ @{/hello/(param1= ${param1}, param2 = ${param2}) }
- ๊ฒฝ๋ก ๋ณ์ : /hello/data1/data2 โถ๏ธ @{/hello/{param1}/{param2} ( param1 = ${param1}, param2 = ${param2}) }
6. ๋ฆฌํฐ๋ด
๋ฆฌํฐ๋ด์ ์์ค ์ฝ๋ ์์ ๊ณ ์ ๋ ๊ฐ์ ๋งํ๋ ์ฉ์ด์ ๋๋ค.
ex) String a = "hello", int a = 10์์ "hello", 10์ ๋ฆฌํฐ๋ด
- ํ์๋ฆฌํ์๋ ๋ฌธ์, ์ซ์, ๋ถ๋ฆฐ, null ์ด ๋ค๊ฐ์ง ๋ฆฌํฐ๋ด์ด ์์ต๋๋ค.
- ํ์๋ฆฌํ์์๋ ๋ฌธ์ ๋ฆฌํฐ๋ด์ ํญ์ '๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค.
- ex) <span th:text = "'hello'">
- ๊ทธ๋ฐ๋ฐ ๋ฌธ์๋ฅผ '๋ก ๊ฐ์ธ๋ ์ผ์ ๋งค์ฐ ๊ท์ฐฎ์๋ฐ, ๊ณต๋ฐฑ ์์ด ์ญ ์ด์ด์ง๋ค๋ฉด '๋ก ์ ๊ฐ์ธ์ฃผ์ด๋ ๋ฉ๋๋ค.
- ๋ ํธํ ๋ฐฉ๋ฒ์ ๋ฆฌํฐ๋ด ๋์ฒด ๋ฌธ๋ฒ์ธ |์ ์ฌ์ฉํด์ |...|๋ก ๊ฐ์ธ์ฃผ๋ ๋ฐฉ๋ฒ
@GetMapping("/literal")
public String literal(Model model)
{
model.addAttribute("data","Spring!");
return "basic/literal";
}
๋ทฐํ ํ๋ฆฟ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <h1>๋ฆฌํฐ๋ด</h1>
<ul>
<!-- <li>"hello world!" = <span th:text="hello world!"></span></li>-->
<li>'hello' + ' world!' = <span th:text="'hello' + ' world!'"></span></li>
<li>'hello world!' = <span th:text="'hello world!'"></span></li>
<li>'hello ' + ${data} = <span th:text="'hello ' + ${data}"></span></li>
<li> TEST </li>
<li>๋ฆฌํฐ๋ด ๋์ฒด |hello ${data}| = <span th:text="|hello ${data}|"></span></li>
</ul>
</body>
</html>
์ฃผ์ ์ฝ๋ : ์ค๋ฅ ๋ฐ์ / "hello world"์์ ์ค๊ฐ์ ๊ณต๋ฐฑ ๋๋ฌธ์ ํ๋์ ํ ํฐ์ผ๋ก ์ธ์ง x
ํฐ ๋ฐ์ดํ ๋ด๋ถ์ ์์ ๋ฐ์ดํ๋ก ๊ฐ์ธ ์ฃผ๊ฑฐ๋, + ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด์ ํฉ์น๊ฑฐ๋, ๋ฆฌํฐ๋ด ๋์ฒด ๋ฌธ๋ฒ || ์ ์ฌ์ฉํด ๊ฐ์ธ์ฃผ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
7. ์ฐ์ฐ
ํ์๋ฆฌํ ์ฐ์ฐ์ ์๋ฐ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค. HTML ์์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ HTML ์ํฐํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ๋ง ์ฃผ์ํฉ์๋ค.
@GetMapping("/operation")
public String operate(Model model)
{
model.addAttribute("nullData",null);
model.addAttribute("data","Spring!");
return "basic/operation";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
<li> ์ฐ์ ์ฐ์ฐ <ul>
<li>10 + 2 = <span th:text="10 + 2"></span></li>
<li>10 % 2 == 0 = <span th:text="10 % 2 == 0"></span></li>
</ul>
</li>
<li>๋น๊ต ์ฐ์ฐ
<ul>
<li>1 > 10 = <span th:text="1 > 10"></span></li>
<li>1 gt 10 = <span th:text="1 gt 10"></span></li>
<li>1 >= 10 = <span th:text="1 >= 10"></span></li>
<li>1 ge 10 = <span th:text="1 ge 10"></span></li>
<li>1 == 10 = <span th:text="1 == 10"></span></li>
<li>1 != 10 = <span th:text="1 != 10"></span></li>
</ul>
</li>
<li>์กฐ๊ฑด์
<ul>
<li>(10 % 2 == 0)? '์ง์':'ํ์' = <span th:text="(10 % 2 == 0)? '์ง์':'ํ์'"></span></li>
</ul>
</li>
<li>Elvis ์ฐ์ฐ์
<ul>
<li>${data}?: '๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.' = <span th:text="${data}?: '๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.'"></span></li>
<li>${nullData}?: '๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.' = <span th:text="${nullData}?: '๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.'"></span></li>
</ul>
</li>
<li>No-Operation
<ul>
<li>${data}?: _ = <span th:text="${data}?: _">๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค.</span></li>
<li>${nullData}?: _ = <span th:text="${nulldata}?: _">๋ฐ์ดํฐ๊ฐ ์์ต๋๋ค. </span></li>
</ul>
</li>
</ul>
</body>
</html>
- ๋น๊ต์ฐ์ฐ์์ HTML ์ํฐํฐ (<,>, >=, <=, !, ==, != )๋ฅผ ์ฌ์ฉํ๋ ๋ถ๋ถ๋ง ์ฃผ์ํฉ์๋ค.
- ์กฐ๊ฑด์ : ์๋ฐ์ ๋์ผ
- Elvis ์ฐ์ฐ์ : ์กฐ๊ฑด์์ ํธ์ ๋ฒ์
- ์๋น์ค ์ฐ์ฐ์๋ ?:๋ก ํํํ๋ฉฐ, ?:์ ์ผ์ชฝ ๊ฐ์ฒด๊ฐ non-null์ด๋ฉด ๊ทธ ๊ฐ์ฒด์ ๊ฐ์ด ๋ฆฌํด๋๊ณ , null์ด๋ผ๋ฉด ?:์ ์ค๋ฅธ์ชฝ ๊ฐ์ ๋ฆฌํดํฉ๋๋ค. )
- No operation : _์ธ ๊ฒฝ์ฐ์๋ ๋ง์น ํ์๋ฆฌํ๊ฐ ์คํ๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ ๋ฐ ์ด๊ฒ์ ์ ํ์ฉํ๋ฉด HTML์ ๋ด์ฉ ๊ทธ๋๋ก ๋ ๋๋ง ํ ์ ์๋ค.
8. ์์ฑ ๊ฐ ์ค์
ํ์๋ฆฌํ๋ ์ฃผ๋ก HTML ํ๊ทธ์ th:* ์์ฑ์ ์ง์ ํ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
@GetMapping("/attribute")
public String attribute()
{
return "basic/attribute";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>์์ฑ ์ค์ </h1>
<input type="text" name="mock" th:name="userA"/>
<h1>์์ฑ ์ถ๊ฐ</h1>
- th:attrappend = <input type="text" class="text" th:attrappend="class=' large'" /><br/>
- th:attrprepend = <input type="text" class="text" th:attrprepend="class='large '" /><br/>
- th:classappend = <input type="text" class="text" th:classappend="large" /><br/>
<h1>checked ์ฒ๋ฆฌ</h1>
- checked o <input type="checkbox" name="active" th:checked="true" /><br/>
- checked x <input type="checkbox" name="active" th:checked="false" /><br/>
- checked=false <input type="checkbox" name="active" checked="false" /><br/>
</body>
</html>
์์ฑ ์ค์
th:* ๋ก ์์ฑ์ ์ง์ ํ๋ฉด ํ์๋ฆฌํ๋ ๊ธฐ์กด ์์ฑ์ th:* ๋ก ์ง์ ํ ์์ฑ์ผ๋ก ์ ์ฉํฉ๋๋ค. ๋ง์ฝ ๊ธฐ์กด ์์ฑ์ด ์์ผ๋ฉด ์๋ก ๋ง๋ญ๋๋ค.
ex) <span name="KIM" th:name = "userA"> ์์ ํ์๋ฆฌํ๋ก ๋์ํ๋ฉด th:name์ด ๋ ๋๋ง ๋ฉ๋๋ค.
์์ฑ ์ถ๊ฐ
- th:attrappend : ์์ฑ ๊ฐ์ ๋ค์ ๊ฐ์ ์ถ๊ฐ (์์ ๋น์นธ)
- th:attrprepend : ์์ฑ ๊ฐ์ ์์ ๊ฐ์ ์ถ๊ฐ (๋ค์ ๋น์นธ)
- th:classappend : class ์์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ์ถ๊ฐ (๋น์นธ์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฉ๋๋ค)
Checked ์ฒ๋ฆฌ
์์ฃผ ์ฌ์ฉ๋๋ input ํ๊ทธ์ checkbox ์์ฑ์๋ chekced ์์ฑ ์ด๋ฆ๋ง ์์ผ๋ฉด ๋ชจ์กฐ๋ฆฌ ์ฒดํฌ๋๋ ์ฌ์์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
ํ์๋ฆฌํ์์๋ th:checked๋ผ๋ ์์ฑ์ ์ ๊ณตํ๋๋ฐ ์ฌ๊ธฐ์ true, false๊ฐ์ ์ง์ ํด์ default ์ฒดํฌ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
9. ๋ฐ๋ณต - each
ํ์๋ฆฌํ์์๋ th:each๋ฅผ ์ฌ์ฉํด์ ๋ฐ๋ณต์ ํ ์ ์์ต๋๋ค.
์ถ๊ฐ๋ก ๋ฐ๋ณต์์ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ์ํ ๊ฐ์ ์ง์ํฉ๋๋ค.
@GetMapping("/each")
public String each(Model model)
{
addUsers(model);
return "basic/each";
}
private void addUsers(Model model)
{
List<User> list = new ArrayList<>();
list.add(new User("userA",10));
list.add(new User("userB",20));
list.add(new User("userC",30));
model.addAttribute("users",list);
}
๋ทฐ ํ ํ๋ฆฟ
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>๊ธฐ๋ณธ ํ
์ด๋ธ</h1>
<table border="1">
<tr>
<th>username</th>
<th>age</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.username}">username</td>
<td th:text="${user.age}">0</td>
</tr>
</table>
<h1>๋ฐ๋ณต ์ํ ์ ์ง</h1>
<table border="1">
<tr>
<th>count</th>
<th>username</th>
<th>age</th>
<th>etc</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${userStat.count}">username</td>
<td th:text="${user.username}">username</td>
<td th:text="${user.age}">0</td>
<td>
index = <span th:text="${userStat.index}"></span>
count = <span th:text="${userStat.count}"></span>
size = <span th:text="${userStat.size}"></span>
even? = <span th:text="${userStat.even}"></span>
odd? = <span th:text="${userStat.odd}"></span>
first? = <span th:text="${userStat.first}"></span>
last? = <span th:text="${userStat.last}"></span>
current = <span th:text="${userStat.current}"></span>
</td>
</tr>
</table>
</body>
</html>
th:each๊ฐ ํฌํจ๋ ํ๊ทธ๋ฅผ ํฌํจํด์ iterator ํฉ๋๋ค.
- <tr th:each = "user, userStat : ${users}">
- ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ userStat ๋ ์๋ต ๊ฐ๋ฅ, ์๋ตํ๋ฉด ์ง์ ํ ๋ณ์๋ช (user) + Stat์ด ๋ฉ๋๋ค.
- ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋ฐ๋ณต ์ํ๋ฅผ ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ฅ : index, count, size, even/odd, first/last, current
10. ์กฐ๊ฑด๋ถ ํ๊ฐ
ํ์๋ฆฌํ์ ์กฐ๊ฑด์
if, unless
private void addUsers(Model model)
{
List<User> list = new ArrayList<>();
list.add(new User("userA",10));
list.add(new User("userB",20));
list.add(new User("userC",30));
model.addAttribute("users",list);
}
@GetMapping("condition")
public String condition(Model model)
{
addUsers(model);
return "basic/condition";
}
๋ทฐ ํ ํ๋ฆฟ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>if, unless</h1>
<table border="1">
<tr>
<th>count</th>
<th>username</th>
<th>age</th>
</tr>
<tr th:each="user, userStat : ${users}">
<td th:text="${userStat.count}">1</td>
<td th:text="${user.username}">username</td>
<td>
<span th:text="${user.age}">0</span>
<span th:text="'๋ฏธ์ฑ๋
์'" th:if="${user.age lt 20}"></span>
<span th:text="'๋ฏธ์ฑ๋
์'" th:unless="${user.age ge 20}"></span>
</td> </tr>
</table>
<h1>switch</h1>
<table border="1">
<tr>
<th>count</th>
<th>username</th>
<th>age</th>
</tr>
<tr th:each="user, userStat : ${users}">
<td th:text="${userStat.count}">1</td>
<td th:text="${user.username}">username</td>
<td th:switch="${user.age}">
<span th:case="10">10์ด</span>
<span th:case="20">20์ด</span>
<span th:case="*">๊ธฐํ</span>
</td> </tr>
</table>
</body>
</html>
if, unless (th:if, th:unless
- <span th:text="'๋ฏธ์ฑ๋ ์'" th:if="${user.age lt 20}"></span> ์์ if์กฐ๊ฑด์ด ๋ง์กฑํ์ง ์๋๋ค๋ฉด ํ๊ทธ ์์ฒด๋ฅผ ๋ ๋๋ง ํ์ง ์์ต๋๋ค.
- <span th:text="'๋ฏธ์ฑ๋ ์'" th:if="${user.age lt 20}"></span> ์์ unless(if not) ์กฐ๊ฑด์ด ๋ง์กฑํ์ง ์๋๋ค๋ฉด ํ๊ทธ ์์ฒด๋ฅผ ๋ ๋๋ง ํ์ง ์์ต๋๋ค.
switch (th:switch=${๋ณ์๋ช }
- ์๋ฐ switch-case๋ฌธ๊ณผ ๋์ผ
- *์ ๋ง์กฑํ๋ ์กฐ๊ฑด์ด ์์ ๋ ์ฌ์ฉํ๋ ๋ํดํธ
11. ์ฃผ์
@GetMapping("/comments")
public String comments(Model model)
{
model.addAttribute("data","Spring!");
return "basic/comments";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>์์</h1>
<span th:text="${data}">html data</span>
<h1>1. ํ์ค HTML ์ฃผ์</h1>
<!--<span th:text="${data}">html data</span> -->
<h1>2. ํ์๋ฆฌํ ํ์ ์ฃผ์</h1>
<!--/* [[${data}]] */-->
<!--/*-->
<span th:text="${data}">html data</span>
<!--*/-->
<h1>3. ํ์๋ฆฌํ ํ๋กํ ํ์
์ฃผ์</h1>
<!--/*/
<span th:text="${data}">html data</span>
/*/-->
</body>
</html>
- ํ์ค HTML ์ฃผ์ <!-- ~~~~ -->
- ์ผ๋ฐ์ ์ธ HTML ์ฃผ์์ผ๋ก CSR์์๋ ๋ ๋๋งํ์ง ์์ต๋๋ค.
- ํ์๋ฆฌํ ํ์ ์ฃผ์ <!--/* */-->
- ์ผ๋ฐ์ ์ธ ํ์๋ฆฌํ ์ฒ๋ฆฌ ์ฃผ์ (๋ ๋๋ง ํ์ง ์์ต๋๋ค)
- ํ์๋ฆฌํ ํ๋กํ ํ์ ์ฃผ์ <!--/*/ ~~~~~ /*/ -->
- HTML ํ์ผ์ ์น๋ธ๋ผ์ฐ์ ์์ ๊ทธ๋๋ก ์ด์ด๋ณด๋ฉด HTML ์ฃผ์์ด๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ด ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง ํ์ง ์์ง๋ง, ํ์๋ฆฌํ ๋ ๋๋ง์ ํ ๊ฒฝ์ฐ์๋ ๋ณด์ด๋ ๊ธฐ๋ฅ์ ๋๋ค.
12. ๋ธ๋ก
<th:block> ์ HTML ํ๊ทธ๊ฐ ์๋ ์ ์ผํ ํ์๋ฆฌํ์ ์์ฒด ํ๊ทธ์ ๋๋ค.
@GetMapping("/block")
public String block(Model model)
{
addUsers(model);
return "basic/block";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<th:block th:each="user : ${users}">
<div>
์ฌ์ฉ์ ์ด๋ฆ1 <span th:text="${user.username}"></span>
์ฌ์ฉ์ ๋์ด1 <span th:text="${user.age}"></span>
</div>
<div>
์์ฝ <span th:text="${user.username} + ' / ' + ${user.age}"></span>
</div>
</th:block>
</body>
</html>
์์ ๊ฐ์ด (์ฌ์ฉ์์ด๋ฆ, ๋์ด)๊ฐ ํ๋์ div ํ๊ทธ์ (์์ฝ)์ด ํ๋์ divํ๊ทธ์ ๋ด๊ฒจ์์ต๋๋ค.
th:block์ ๋ง ๊ทธ๋๋ก ํ๋์ ๋ธ๋ก์ฒ๋ฆฌ๋ฅผ ํ์ฌ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๊ฒ ํด์ค์ผ๋ก์จ (์ฌ์ฉ์ ์ด๋ฆ, ๋์ด, ์์ฝ) ์ด ํ ๋ธ๋ก์์ ๋์ค๊ฒ ๋ฉ๋๋ค.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<span th:each="user : ${users}">
<div>
์ฌ์ฉ์ ์ด๋ฆ1 <span th:text="${user.username}"></span>
์ฌ์ฉ์ ๋์ด1 <span th:text="${user.age}"></span>
</div>
</span>
<span th:each="user : ${users}">
<div>
์์ฝ <span th:text="${user.username} + ' / ' + ${user.age}"></span>
</div>
</span>
</body>
</html>
์ด๋ ๊ฒ ๋๋ ์ง ๋ฐ๋ณต๋ฌธ์ th:block์ ์ฌ์ฉํ๋ฉด ์ํ์ ๋๋ฆด ์ ์์ต๋๋ค.
13. ์๋ฐ ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ
ํ์๋ฆฌํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์๋ฆฌํ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
@GetMapping("/javascript")
public String javascript(Model model) {
model.addAttribute("user", new User("userA", 10));
addUsers(model);
return "basic/javascript";
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ์ฌ์ฉ ์ -->
<script>
var username = [[${user.username}]];
var age = [[${user.age}]];
//์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ถ๋ด ํ
ํ๋ฆฟ
var username2 = /*[[${user.username}]]*/ "test username";
//๊ฐ์ฒด
var user = [[${user}]];
</script>
<!-- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ์ฌ์ฉ ํ -->
<script th:inline="javascript">
var username = [[${user.username}]];
var age = [[${user.age}]];
//์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ถ๋ด ํ
ํ๋ฆฟ
var username2 = /*[[${user.username}]]*/ "test username";
//๊ฐ์ฒด
var user = [[${user}]];
</script>
<!-- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ์ฌ์ฉ ํ -->
<script th:inline="javascript">
[# th:each="user : ${users}"]
var user[[${userStat.count}]] = [[${user}]];
[/]
</script>
</body>
</html>
ํ ์คํธ ๋ ๋๋ง
- var username = [[${user.username}]];
- ์ธ๋ผ์ธ ์ฌ์ฉ ์ : var username = userA;
- ์ธ๋ผ์ธ ์ฌ์ฉ ํ : var username = "userA";
๊ฒฐ๊ณผ์ ์ผ๋ก ์ธ๋ผ์ธ์ ์ฌ์ฉํ์ง ์์ผ๋ฉด userA๊ฐ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉ๋์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฅ๊ฐ ๋ฐ์.
age์ ๊ฒฝ์ฐ๋ ์ซ์๊ธฐ ๋๋ฌธ์ ์ ์ ๋ ๋๋ง์ด ๋ฉ๋๋ค.
์ธ๋ผ์ธ์ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ๊ฒฐ๊ณผ์ ๋ฌธ์ ํ์ ์ธ ๊ฒฝ์ฐ "๋ฅผ ํฌํจํด์ค๋๋ค. ์ถ๊ฐ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ๋ฌธ์๊ฐ ํฌํจ๋์ด์์ผ๋ฉด ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ ํด์ค๋๋ค. ex) " -> \"
์๋ฐ์คํฌ๋ฆฝํธ ๋ด์ธ๋ด ํ ํ๋ฆฟ
ํ์๋ฆฌํ๋ HTML ํ์ผ์ ์ง์ ์ด์ด๋ ๋์ํ๋ ๋ด์ธ๋ด ํ ํ๋ฆฟ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์ฃผ์์ ํ์ฉํด ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ธ๋ผ์ธ ์ฌ์ฉ ์ : var username2 = /*userA*/ "test username";
- ์ธ๋ผ์ธ ์ฌ์ฉ ํ : var username2 = "userA";
๊ฐ์ฒด
๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ์๋์ผ๋ก ๋ณํํด์ค๋๋ค.
- var user = [[${user}]];
- ์ธ๋ผ์ธ ์ฌ์ฉ ์ : var user = BasicController.User(username=userA, age=10);
- ์ธ๋ผ์ธ ์ฌ์ฉ ํ : var user = {"username":"userA", "age":10};
์ธ๋ผ์ธ์์๋ each๋ฅผ ์ง์ํฉ๋๋ค.
<!-- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ๋ผ์ธ ์ฌ์ฉ ํ -->
<script th:inline="javascript">
[# th:each="user : ${users}"]
var user[[${userStat.count}]] = [[${user}]];
[/]
</script>
</body>
๊ฒฐ๊ณผ
<script>
var user1 = {"username":"userA","age":10};
var user2 = {"username":"userB","age":20};
var user3 = {"username":"userC","age":30};
</script>
[# th:each="user : ${users}"] ~~ [/]
'๐ Backend > Thymeleaf Template' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thymeleaf - ์คํ๋ง ํตํฉ ๊ธฐ๋ฅ (0) | 2023.03.19 |
---|---|
Thymeleaf ๊ธฐ๋ฅ - ํ ํ๋ฆฟ ์กฐ๊ฐ, ํ ํ๋ฆฟ ๋ ์ด์์ (0) | 2023.03.17 |
Spring MVC - ์น ํ์ด์ง ๋ง๋ค๊ธฐ with Thymeleaf (0) | 2023.03.15 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422