Thymeleaf ๊ธฐ๋ฅ - ํ ํ๋ฆฟ ์กฐ๊ฐ, ํ ํ๋ฆฟ ๋ ์ด์์
by rlaehddnd0422์น ํ์ด์ง๋ฅผ ๊ฐ๋ฐํ ๋๋ ๊ณตํต ์์ญ์ด ๋ง์ด ์์ต๋๋ค.
์๋ฅผ๋ค์ด์ ์นํ์ด์ง์ ์๋จ ์์ญ์ด๋ ํ๋จ ์์ญ, ์ข์ธก ์นดํ ๊ณ ๋ฆฌ ๋ฑ๋ฑ ์ฌ๋ฌ ํ์ด์ง์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์์ญ๋ค์ด ์์ด์.
์ด๋ฐ ๋ถ๋ถ์ ์ฝ๋๋ฅผ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ค๋ฉด ๋ณ๊ฒฝ์ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๋ค ์์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋นํ ๋นํจ์จ์ ์ ๋๋ค. ํ์๋ฆฌํ๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ ํ๋ฆฟ ์กฐ๊ฐ๊ณผ ๋ ์ด์์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
ํ ํ๋ฆฟ ์กฐ๊ฐ
@Controller
@RequestMapping("/template")
public class TemplateController {
@GetMapping("/fragment")
public String template()
{
return "template/fragment/fragmentMain";
}
footer.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<footer th:fragment="copy">
ํธํฐ ์๋ฆฌ ์
๋๋ค.
</footer>
<footer th:fragment="copyParam (param1, param2)">
<p>ํ๋ผ๋ฏธํฐ ์๋ฆฌ ์
๋๋ค.</p>
<p th:text="${param1}"></p> <p th:text="${param2}"></p>
</footer>
</body>
</html>
fragmentMain.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>๋ถ๋ถ ํฌํจ</h1>
<h2>๋ถ๋ถ ํฌํจ insert</h2>
<div th:insert="~{template/fragment/footer :: copy}"></div>
<h2>๋ถ๋ถ ํฌํจ replace</h2>
<div th:replace="~{template/fragment/footer :: copy}"></div>
<h2>๋ถ๋ถ ํฌํจ ๋จ์ ํํ์</h2>
<div th:replace="template/fragment/footer :: copy"></div>
<h1>ํ๋ผ๋ฏธํฐ ์ฌ์ฉ</h1>
<div th:insert="~{template/fragment/footer :: copyParam ('์นด์นด', '๋ผ๋ชจ์ค')}">ํ์ด์</div>
<div th:replace="~{template/fragment/footer :: copyParam ('๋ฐ์ดํฐ1', '๋ฐ์ดํฐ 2')}"></div>
</body>
</html>
th:fragment๊ฐ ์๋ ํ๊ทธ๋ ๋ค๋ฅธ ๊ณณ์ ํฌํจ๋๋ ์ฝ๋ ์กฐ๊ฐ์ผ๋ก ์ดํดํ๋ฉด ๋ฉ๋๋ค.
- th:insert="~{.../footer :: copy}
- footer.html์ th:fragment="copy" ๋ก ์ง์ ๋ ๋ถ๋ถ์ ํ์ฌ ํ๊ทธ๋ฅผ ํฌํจํด์ ์ฌ์ฉํฉ๋๋ค.
- th.replce = "~{.../footer :: copy}
- footer.html์ th:fragmet="copy" ๋ก ์ง์ ๋ ๋ถ๋ถ์ ํ์ฌ ํ๊ทธ๋ฅผ ๋์ฒดํด์ ์ฌ์ฉํฉ๋๋ค. ( ์ ๊ฒฝ์ฐ <div> </div> ๊ฐ <footer> </footer> ๋ก ๋์ฒด )
- ๋ถ๋ถ ํฌํจ ๋จ์ ํํ์
- <div th:replace="template/fragment/footer :: copy"></div>
- ~์ ์ฌ์ฉํ๋๊ฒ ์์น์ด์ง๋ง ํ ํ๋ฆฟ ์กฐ๊ฐ์ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ๋จ์ํ๋ฉด ~์ ์๋ตํ ์ ์์ต๋๋ค.
- <div th:replace="template/fragment/footer :: copy"></div>
- ํ๋ผ๋ฏธํฐ ์ฌ์ฉ
- <div th:insert(replace) = "~{template/fragment/footer :: copyParam('๋ฐ์ดํฐ1','๋ฐ์ดํฐ2')}"></div>
- ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ ๋ํ ๋ ๋๋งํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- <div th:insert(replace) = "~{template/fragment/footer :: copyParam('๋ฐ์ดํฐ1','๋ฐ์ดํฐ2')}"></div>
<footer th:fragment="copyParam (param1, param2)">
<p>ํ๋ผ๋ฏธํฐ ์๋ฆฌ ์
๋๋ค.</p>
<p th:text="${param1}"></p> <p th:text="${param2}"></p>
</footer>
โ footer.html
์ต์ข ๋ทฐ ํ ํ๋ฆฟ ์์ค์ฝ๋
ํ ํ๋ฆฟ ๋ ์ด์์
์ด์ ์๋ ์ผ๋ถ ์ฝ๋ ์กฐ๊ฐ์ ๊ฐ์ง๊ณ ์์ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ฒ์๋ ๊ฐ๋ ์ ๋ ํ์ฅํด์ ์ฝ๋ ์กฐ๊ฐ์ ๋ ์ด์์์ ๋๊ฒจ์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด <head> ์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ css, javascript ๊ฐ์ ์ ๋ณด๋ค์ด ์๋๋ฐ, ์ด๋ฌํ ๊ณตํต์ ๋ณด๋ค์ ํ ๊ณณ์ ๋ชจ์๋๊ณ ๊ณตํต์ผ๋ก ์ฌ์ฉํ์ง๋ง, ๊ฐ ํ์ด์ง๋ง๋ค ํ์ํ ์ ๋ณด๋ฅผ ๋ ์ถ๊ฐํด์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
@GetMapping("/layout")
public String layout()
{
return "template/layout/layoutMain";
}
base.html
<html xmlns:th="http://www.thymeleaf.org">
<head th:fragment="common_header(title,links)">
<title th:replace="${title}">๋ ์ด์์ ํ์ดํ</title>
<!-- ๊ณตํต -->
<link rel="stylesheet" type="text/css" media="all" th:href="@{/css/awesomeapp.css}">
<link rel="shortcut icon" th:href="@{/images/favicon.ico}">
<script type="text/javascript" th:src="@{/sh/scripts/codebase.js}"></script>
<!-- ์ถ๊ฐ -->
<th:block th:replace="${links}" />
</head>
layoutMain.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="template/layout/base :: common_header(~{::title},~{::link})">
<title>๋ฉ์ธ ํ์ดํ</title>
<link rel="stylesheet" th:href="@{/css/bootstrap.min.css}">
<link rel="stylesheet" th:href="@{/themes/smoothness/jquery-ui.css}">
</head>
<body>
๋ฉ์ธ ์ปจํ
์ธ
</body>
</html>
common_header(~{::title},~{::link}) ์ด ๋ถ๋ถ์ด ํต์ฌ์ ๋๋ค.
- ::title์ ํ์ฌ ํ์ด์ง์ title ํ๊ทธ๋ค์ ์ ๋ฌํฉ๋๋ค.
- ::link๋ ํ์ฌ ํ์ด์ง์ link ํ๊ทธ๋ค์ ์ ๋ฌํฉ๋๋ค.
1. layoutMain ๋ทฐ ํ ํ๋ฆฟ์ head๋ถ๋ถ์ด base.html์ common_header์ ํ์ดํ๊ณผ ๋งํฌ๋ก ๋์ฒด๋์ด ์์ต๋๋ค.
๋ฐ๋ผ์ <title>์ด ๋ถ์ ๋ฉ์ธ ํ์ดํ ์๋ฆฌ์ base์ ๋ ์ด์์ ํ์ดํ์ด ๋ค์ด๊ฐ๊ณ <link> ๊ฐ ๋ถ์ ๋ถ๋ถ์๋ base์ ๊ณตํต ์ฃผ์ ๋งํฌ๊ฐ ๋ค์ด๊ฐ๋๋ค.
์์ค์ฝ๋๋ฅผ ๋ณด๋ฉด
1. layoutMain์ ํธ์ถํ๋๋ template/layout/base ์ common_header์ title๊ณผ link๋ฅผ ์ ๋ฌํด์ฃผ๊ณ ๋ฆฌํด๋ ๊ฒฐ๊ณผ๋ฅผ <head> ํ๊ทธ์ ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค.
2. ๋๊ฒจ ์ฃผ๋ฉด "๋ ์ด์์ ํ์ดํ" -> "๋ฉ์ธ ํ์ดํ" ๋ก ๋ณ๊ฒฝ๋๊ณ ์ค๊ฐ์ ๊ณตํต ๋ถ๋ถ์ ๊ทธ๋๋ก, links๋ก ์ ๋ฌ๋ฐ์ ๋ถ๋ถ์ link๋ก ์ ๋ฌ๋ ๋ถ๋ถ์ผ๋ก ๋์ฒด๋ ๊ฒฐ๊ณผ๊ฐ layoutMain์ head ํ๊ทธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด๋ฒ์๋ <head> ์์ <html>๊น์ง ํ์ฅํด๋ณด๊ฒ ์ต๋๋ค.
@GetMapping("/layoutExtend")
public String layoutExtends()
{
return "template/layoutExtend/layoutExtendMain";
}
layoutExtendMain.html
<!DOCTYPE html>
<html th:replace="~{template/layoutExtend/layoutFile :: layout(~{::title}, ~{::section})}"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>๋ฉ์ธ ํ์ด์ง ํ์ดํ</title> </head>
<body>
<section>
<p>๋ฉ์ธ ํ์ด์ง ์ปจํ
์ธ </p>
<div>๋ฉ์ธ ํ์ด์ง ํฌํจ ๋ด์ฉ</div>
</section>
</body>
</html>
layoutFile.html
<!DOCTYPE html>
<html th:fragment="layout (title, content)" xmlns:th="http://www.thymeleaf.org">
<head>
<title th:replace="${title}">๋ ์ด์์ ํ์ดํ</title> </head>
<body>
<h1>๋ ์ด์์ H1</h1>
<div th:replace="${content}"> <p>๋ ์ด์์ ์ปจํ
์ธ </p>
</div>
<footer>
๋ ์ด์์ ํธํฐ
</footer>
</body>
</html>
๋์ ์๋ฆฌ
1. <html> ๋ ๋ฒจ์์ ๋ด๋ถ title๊ณผ sectionํ๊ทธ๋ฅผ layoutfile์ ์ ๋ฌํด์ค๋๋ค.
2. ์ ๋ฌ๋ฐ์ layoutFile์ title, content ํ๊ทธ๋ฅผ ์ ๋ฌ๋ฐ์ title๊ณผ sectionํ๊ทธ๋ก ๋ณ๊ฒฝํด์ค๋๋ค.
3. <html> ๋ ๋ฒจ์ ๋ค์ layoutExtendMain์ ์ ๋ฌํด์ค๋๋ค.
'๐ Backend > Thymeleaf Template' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thymeleaf - ์คํ๋ง ํตํฉ ๊ธฐ๋ฅ (0) | 2023.03.19 |
---|---|
Thymeleaf ๊ธฐ๋ฅ - ๊ธฐ๋ณธ (0) | 2023.03.17 |
Spring MVC - ์น ํ์ด์ง ๋ง๋ค๊ธฐ with Thymeleaf (0) | 2023.03.15 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422