[TIL] Thymeleaf์ ๊ดํ ๊ฒ
1.Thymeleaf ๋?
Thymeleaf๋ HTML, XML, JavaScript, CSS ๋ฐ ์ผ๋ฐ ํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋
์น ๋ฐ ๋ ๋ฆฝ ์คํํ ํ๊ฒฝ ๋ชจ๋๋ฅผ ์ํ ์ต์ *์๋ฒ ์ธก Java ํ ํ๋ฆฟ ์์ง์ ๋๋ค.
Thymeleaf๋ spring MVC์์ ๋ทฐ(View)๋ฅผ ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํํ ๋ทฐ ํ ๋ธ๋ฆฟ(view template)์ผ๋ก ๋ถ๋ฆฝ๋๋ค.
- > ๋ทฐ ํ ํ๋ฆฟ์ ์ปจํธ๋กค๋ฌ๊ฐ ์ ๋ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ์ฌ ๋์ ์ผ๋ก ํ๋ฉด์ ๊ตฌ์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
์ฆ, Thymeleaf๋ htmlํ์ผ์ ๊ฐ์ ธ์์ ํ์ฑํด์ ๋ถ์ํ
์ ํด์ง ์์น์ ๋ฐ์ดํฐ๋ฅผ ์นํํด์ ์น ํ์ด์ง๋ฅผ ์์ฑํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
Thymeleaf๋ ์๋ฒ๋ฅผ ๊ฐ๋ํ์ง ์์ผ๋ฉด ์์ HTML์,
์๋ฒ๋ฅผ ๊ตฌ๋ํ๋ฉด ๋ทฐ ํ ํ๋ฆฟ์ ๊ฑฐ์ณ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ HTML์ ํ์ธํ ์ ์์ต๋๋ค.
JSP๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ฒ๋ฅผ ๊ตฌ๋ํ์ง ์๊ณ ํด๋น ํ์ผ์ ์ด๊ฒ ๋๋ฉด
-> JSP ์์ค์ฝ๋์ HTML์ด ์์ฌ์์ด์ ์ ์์ ์ธ ํ์ธ์ด ๋ถ๊ฐ๋ฅํ์ต๋๋ค.
์ฆ ์ค์ง ์๋ฒ๋ฅผ ํตํด์ JSP์ ์ด์ด์ผ JSP ํ์ผ์ ํ์ธํ ์ ์์์ต๋๋ค.
๋ฐ๋ฉด์ ํ์๋ฆฌํ๋ ํ๋ฉด ๊ตฌ์ฑ์ ์๋ฒ ๊ฐ๋์์ด ์ฝ๊ฒ ํ์ ํ ์ ์์ด
๊ฐ๋ฐ์ ์์ ํ ๋๋ง๋ค ์๋ฒ ์ฌ๊ฐ๋์ด ํ์ ์์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์ฉ์ดํด์ง๋๋ค.
์ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด ํ์๋ฆฌํ๋ ์์ HTMLํ์ผ์ ์ ์งํ๊ธฐ ๋๋ฌธ์
์น๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํด๋น ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ ฅํ๋ฉด ํ๋ฉด์ด ์ ๋์จ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์ JSP๋ ํ๋ฉด์ด ์๋ ๊ทธ๋ฅ ์ฝ๋๊ฐ ๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋ค.
์ ? ๊ทธ๋ด๊น์?
์๋ฒ ๊ฐ๋์์ด ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํด ํด๋น ํ์ผ์ ์ด๊ฒ ๋๋ฉด ?
-> ์น ๋ธ๋ผ์ฐ์ ๋ ํ์๋ฆฌํ๊ฐ ์ฌ์ฉํ๋ ์์ฑ์ธ th:์์ฑ์ ์์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ! HTML๋ก๋ง ํด์ํ ์ ์์ฃ ,
๋ฐ๋ผ์, ์์ ์ถ๊ฐํด์ค ํ์๋ฆฌํ ์์ฑ์ ์ ์ธํ ์์ HTML ์์ฑ์ผ๋ก ํ๋ฉด์ ๊ตฌ์ฑํ์ฌ
-> ์์ HTMLํ์ผ์ ์ ์งํ ์ ์์ต๋๋ค. ๊ทธ๋์ ์ ๋ณด์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ฒ๊ฐ ๊ฐ๋์ด ๋์ด ํ์๋ฆฌํ ๋ทฐ ํ ํ๋ฆฟ ์์ง์ ์ด์ฉํ๊ฒ ๋๋ฉด
์๋ฒ ์ฌ์ด๋์์ ๋ ๋๋ง ๋์ด ๊ธฐ์กด HTML์ ์์ฑ์ด ์๋ ํ์๋ฆฌํ์ ์์ฑ์ผ๋ก ๋์ฒด๋์ด
๋์ HTML ํ์ผ์ ์ ๊ณตํ ์ ์๊ฒ๋ฉ๋๋ค.
Thymeleaf์ด์ธ์ jsp๋ผ๋ HTML ์ฝ๋์ JAVA์ฝ๋๋ฅผ ๋ฃ์ด ๋์ ์นํ์ด์ง๋ฅผ ๋ง๋๋
์น์ดํ๋ฆฌ์ผ์ด์ ๋๊ตฌ๊ฐ ์์์๋ ๋ถ๊ตฌํ๊ณ
spring boot๋ Thymeleaf์ ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
2.Thymeleaf ์ ์ฃผ์ ๋ชฉํ๋?
-> ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฌ์ด ํ ํ๋ฆฟ ์์ฑ ๋ฐฉ๋ฒ์ ์ ๊ณต
-> ์ด๋ฅผ ์ํด *Natural Templates ์ ๊ฐ๋ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
-> ์ด๋ฅผ ํตํด ๋์์ธ ์ปค๋ฎค๋์ผ์ด์ ์ด ํฅ์๋๊ณ , ๋์์ธ ํ๊ณผ ๊ฐ๋ฐ ํ ๊ฐ์ ๊ฒฉ์ฐจ๊ฐ ํด์๋ฉ๋๋ค !
*์๋ฒ ์ธก Java ํ ํ๋ฆฟ ์์ง
์๋ฒ์์ DB ํน์ API์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์๋ ํ ํ๋ฆฟ(Template)์ ๋ฃ์ด
HTML ๋ฌธ์๋ฅผ ๋ง๋ค์ด ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ฆ, HTML ์ฝ๋์์ ๊ณ ์ ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ถ๋ถ์ ํ ํ๋ฆฟ์ผ๋ก ๋ง๋ค์ด๋๊ณ
๋์ ์ผ๋ก ์์ฑ๋๋ ๋ถ๋ถ๋ง ํ ํ๋ฆฟ์ ํน์ ๋ถ๋ถ์ ๋ผ์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
*Natural Templates
HTML ์ฒ๋ผ ๋ณด์ด๊ณ HTML ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค !
๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๋ฉด, Thymeleaf์ ๊ถ๊ทน์ ์ธ ๋ชฉ์ ์
'๊ฐ๋ฐ์ workflow๋ฅผ natural templates๋ก ๊ฐ์ง๊ณ ์ฌ ์ ์๋ค'๋ ๊ฒ์ ๋๋ค.
Thymeleaf ๋ฌธ๋ฒ์ผ๋ก ์ฐ์ฌ์ง HTML templates๋ ํญ์ ๋งํฌ์ ์ธ์ด ์์ชฝ์
์์ฑ์ผ๋ก ์ฐ์ฌ์ง๊ธฐ ๋๋ฌธ์ HTML ํ์ด์ง์ฒ๋ผ ๋ณด์ด๊ณ
์ค์ ๋ก ๋์ํ๋๋ฐ ๊ทธ๊ฒ์ natural templates๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ฆ, ์๋ฒ๋ฅผ ๊ตฌ๋ํ์ง ์์ผ๋ฉด ์์ HTML์,
์๋ฒ๋ฅผ ๊ตฌ๋ํ๋ฉด ๋์ ์ผ๋ก HTML์ด ์์ฑ๋๋ค๊ณ ํ๋๋ฐ,
-> ํ์๋ฆฌํ๋ ์์ HTML์ ์ ์งํ๊ธฐ ๋๋ฌธ์ natural templates์ผ๋ก๋ ๋ถ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
3.Thymeleaf ์ ์ฃผ์ ์ฅ์ ์?
-> ํธ๋ฆฌํจ !
ํ
ํ๋ฆฟ ์ฝ๋ ์์ฒด๊ฐ ๊ทธ๋ฅ html ์ด๊ธฐ ๋๋ฌธ์ ๋ทฐ ํ์ผ์ was ์์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๋์๋ณผ ์ ์์ต๋๋ค.๊ธฐ์กด์ ํ
ํ๋ฆฟ์ผ๋ก๋ ํญ์ ์๋ฒ๋ฅผ ๊ตฌ๋์์ผ ๊ฒฐ๊ณผ๋ฌผ์ ํ์ธํด์ผ ํ์ต๋๋ค๋ง,
ํ์๋ฆฌํ์ ๊ฒฝ์ฐ static ํ์ผ์ ์ฌ์ฉํ๋ฏ ํด๋น ๋ด์ฉ์ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก ํ์ธํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
-> ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ํ์๋ฆฌํ๊ฐ HTML์ ์์ฑ(Attribute)์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์
๊ธฐ์กด์ HTML๊ตฌ์กฐ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
4.Thymeleaf๋ฅผ ํ๋ก์ ํธ์ ์ ์ฉํ๊ธฐ!
ํ๋ก์ ํธ์ ์ ์ฉํ๊ธฐ
ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋,,
thymeleaf ๋ํ๋์ ์ถ๊ฐ
1) build.gradle์ ํด๋น ์ค์ ์ ๋ ฅํฉ๋๋ค.
2) html_ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ๋ html ํ์ผ์๋ ํ์๋ฆฌํ๋ฅผ ์ฐ๊ฒ ๋ค๊ณ ์์ฑ์ผ๋ก ์จ์ค์ผ ํฉ๋๋ค.
-> ํ์๋ฆฌํ๊ฐ HTML์ ์์ฑ(Attribute)์ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ฉ๋๋ค. ๋๋ถ์, ๊ธฐ์กด์ HTML๊ตฌ์กฐ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ฃ ๐
5.Thymeleaf ๋ฌธ๋ฒ
๋๋ถ๋ถ์ HTML ์์ฑ์ ํ์๋ฆฌํ์ ์์ฑ์ผ๋ก ์ฐ์ด๋ th:html ์์ฑ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
@{ URL ๋งํฌ } - URL ๋งํฌ ํํ์
- @{ URL ๋งํฌ } : ํ์๋ฆฌํ๋ URL ๋งํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ @{...}๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์์)
th:href="@{/css/bootstrap.min.css}"
| ๋ฆฌํฐ๋ด | - ๋ฆฌํฐ๋ด ๋์ฒด
- ํ์๋ฆฌํ์์ ๋ฌธ์์ ํํ์ ๋ฑ์ ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๋ฆฌํฐ๋ด ๋์ฒด ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด, ๋ํ๊ธฐ ์์ด ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค !
- ์์)
<span th:text="'welcome to our application, ' + ${user.name} + '!' ">
<span th:text="|welcome to our application, ${user.name}!|">
${ ๋ณ์๋ช } - ๋ณ์ ํํ์
- ๋ชจ๋ธ์ ํฌํจ๋ ๊ฐ์ด๋, ํ์๋ฆฌํ ๋ณ์๋ก ์ ์ธํ ๊ฐ์ ์กฐํํ ์ ์์ต๋๋ค.
- ํ๋กํผํฐ ์ ๊ทผ๋ฒ์ ์ฌ์ฉ ( item.getPrice() -> item.price )
- ์์)
<td th:text="${item.price}">10000</td> ( 10000 ๋์ item.price ๊ฐ์ด ๋ค์ด๊ฐ๋ค. )
#{ ๋ณ์๋ช } - ์ธ๋ถ ์์ ๋ณ์ ํํ์
- ๋ฉ์์ง, properties์ ๊ฐ์ ์ธ๋ถ ์์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ
- ์์)
th:text="#{member.register}"
์ฐธ๊ณ ๋ธ๋ก๊ทธ :
Thymeleaf
Thymeleaf๋ spring MVC์์ ๋ทฐ(View)๋ฅผ ๋ด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํํ ๋ทฐ ํ ๋ธ๋ฆฟ(view template)์ผ๋ก ๋ถ๋ฆฐ๋ค.
velog.io
Spring MVC - ํ์๋ฆฌํ(Thymeleaf)์ ๋ํ ๊ฐ๋จํ ์ ๋ฆฌ
๋๋ณด๊ธฐ ํ์๋ฆฌํ ๋ฉ๋ด์ผ ๊ธฐ๋ณธ ๋ฉ๋ด์ผ https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html Tutorial: Using Thymeleaf 1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web a
jddng.tistory.com