์น ํ๋ซํผ์ ์ ์ํด๋ณด๋ฉด, ์ฌ์ด๋ ๋ฉ๋ด์ ์๋จ ํค๋๋ ๊ณ ์ ๋ ์ฑ๋ก ๊ฐ์ด๋ฐ์ ์ฝํ ์ธ ์์ญ๋ง ๋ฐ๋๋ ๊ตฌ์กฐ๋ฅผ ์์ฃผ ๋ณผ ์ ์๋ค
์ด์ฒ๋ผ ๋ ์ด์์์ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์๋ ๊ฐ ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด, Spring ํ๋ก์ ํธ์์ Thymeleaf์ ๋ ์ด์์ ๊ธฐ๋ฅ์ ํ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ ์ง๋ณด์์ ํ์ฅ์ฑ ์ธก๋ฉด์์๋ ํฐ ์ฅ์ ์ ๊ฐ๊ณ ์๋ค.
์ค์ ํ๋ซํผ ํ๋ก์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ฉด์ ์ด๋ฌํ ๊ตฌ์กฐ๋ฅผ ์ ์ฉํ ๊ฒฝํ์ด ์์ผ๋ฉฐ, ๊ณผ์ ์ ์ฐ์ต ๊ฒธ ๋น์ทํ ๋ ์ด์์์ ๋ค์ ์ค์ ํด๋ณด๋ ๊ณผ์ ์์ ๋ช ๊ฐ์ง ์ค์ํ์ง๋ง ๋์น๊ธฐ ์ฌ์ด ํฌ์ธํธ๋ค์ ๋ฐ๊ฒฌํ๋ค
์ด ํฌ์คํ ์์๋ ์ ๊ฐ ์ง์ ๊ฒช์ ์ํ์ฐฉ์ค๋ฅผ ๋ฐํ์ผ๋ก, ๋ ์ด์์ ์ค์ ์ ์ฃผ์ํ ์ ๊ณผ ํต์ฌ ๋ด์ฉ์ ๊ณต์ ํ๊ณ ์ ํฉ๋๋ค.
1. Thymeleaf ์์กด์ฑ ์ฃผ์
Thymeleaf๋ Spring Boot์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ ์์ง ์ค ํ๋์ด๋ค. ์ ์ HTML์ ๋์ ์ผ๋ก ๋ ๋๋งํด์ฃผ๋ฉฐ, ๋ทฐ(View)์ ๋ฐ์ดํฐ๋ฅผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐํ ์ ์๋๋ก ๋์์ค๋ค.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}
2. Layout Dialect ์์กด์ฑ ์ถ๊ฐ
Thymeleaf๋ก ๋ ์ด์์ ํ ํ๋ฆฟ์ ์ค์ ํ๋ ค๊ณ layout:decorate๋ฅผ ์ฐ๋๋ฐ ๊ณ์ ์ ์ฉ์ด ์ ๋์๋ค....
์ค์ โ โ โ โ
dependencies {
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:3.0.0'
}
3. ๋ถ๋ชจ ํ ํ๋ฆฟ basic.html ๋ ์ด์์ ์ค์
basic.html์ ๋ชจ๋ ํ์ด์ง์ ๊ณตํต ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ๋ถ๋ชจ ๋ ์ด์์์ด๋ค.
์ฆ, ํค๋์ ์ฌ์ด๋๋ฐ๋ ๊ณ ์ ์ด๊ณ , <main> ๋ถ๋ถ์ ์์ ํ์ด์ง์์ ์ฝ์
๋๋ ๊ตฌ์กฐ๋ก ์ค์ ํ๋ค.
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
<head>
<meta charset="UTF-8">
.
.
<style>
.
.
</style>
</head>
<body>
<!-- ์ข์ธก ์ฌ์ด๋๋ฐ -->
<div class="sidebar p-3">
<ul class="nav flex-column">
<li class="nav-item">
<a class="nav-link" th:href="@{/home}"><i class="bi bi-house"></i> ํ</a>
</li>
<li class="nav-item">
<a class="nav-link" th:href="@{/list}"><i class="bi bi-list-ul"></i> ๊ฒ์ํ</a>
</li>
</ul>
</div>
<!-- ํค๋ ์์ญ -->
<div class="header">
.
.
</div>
<main class="main-content">
<div layout:fragment="home"></div>
<div layout:fragment="content"></div>
</main>
</body>
<div layout:fragment="script"></div>
</html>
4. Thymeleaf ๋ ์ด์์์์ ๊ฐ์ฅ ์ค์ํ ํต์ฌ ํฌ์ธํธ
<main class="main-content">
<div layout:fragment="home"></div>
<div layout:fragment="content"></div>
</main>
layout:fragment๋ ๋ถ๋ชจ ํ
ํ๋ฆฟ์์ ์์ ํ
ํ๋ฆฟ์ด ๋ด์ฉ์ "์ฝ์
ํ ์์น"๋ฅผ ์ ์ํ๋ ํต์ฌ ์ง์ ์ด๋ค.
์ด ์ด๋ฆ๊ณผ ์์ ํ์ด์ง์ layout:fragment ๊ฐ์ด ์ ํํ ๋งค์นญ๋์ด์ผ ์ฝํ
์ธ ๊ฐ ์ ์์ ์ผ๋ก ๋ ๋๋ง๋๋ค.
5. ์์ ํ์ด์ง ๊ตฌ์กฐ
โ ์์ ํ์ด์ง ์ต์๋จ <html> ํ๊ทธ์ ์๋์ ๊ฐ์ด ์ง์ ํ์ฌ ๋ถ๋ชจ ๋ ์ด์์์ ์์ ๋ฐ๋๋ค.
layout:decorate="~{layout/basic}"
โ ์์ ํ์ด์ง์ <body> ํ๊ทธ ์์์ layout:fragment=" fragment ์ด๋ฆ " ์์ฑ์ผ๋ก ์์ญ์ ๊ฐ์ธ๊ณ , ๊ทธ ์์ ํ์ํ ๋ด์ฉ์ ์์ฑํ๋ค.
<div layout:fragment="content">
<!-- ์์ ํ์ด์ง์์ ๋ณด์ฌ์ค ์ค์ ๋ด์ฉ -->
</div>
โ ์ค์ ์ฝ๋ ์์
<!DOCTYPE html>
<html lang="ko"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/basic}">
<head>
<meta charset="UTF-8">
<title>๊ฒ์ํ</title>
<style>
.
.
</style>
</head>
<body>
<div layout:fragment="content">
<-- ๋ณด์ฌ์ค ์ค์ ๋ด์ฉ -->
</div>
</body>
</html>
6. Thymeleaf ๋ ์ด์์ ๊ตฌ์ฑ ์ ์์ ํ์ด์ง ์์ฑ ์ ์ ์์ฌํญ
- ๋ถ๋ชจ ๋ ์ด์์(basic.html)์๋ <html>, <head>, <body> ํ๊ทธ๊ฐ ํฌํจ๋์ด ์์
- ์์ ํ์ด์ง์์๋ ์ฝํ ์ธ ๋ง layout:fragment๋ก ์์ฑํ๋ฉฐ, ๋ณ๋์ <body> ํ๊ทธ ์์ฑ์ ์๋ตํ๋ ๊ฒ์ด ์ผ๋ฐ์
- ์์ ํ์ด์ง์ <body> ํ๊ทธ๋ฅผ ํฌํจํ ๊ฒฝ์ฐ, ๋ถ๋ชจ ๋ ์ด์์๊ณผ ์ค๋ณต๋์ด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ๊ถ์ฅํ์ง ์์
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Boot] start.spring.io ํ๋ก์ ํธ ์์ฑ ํ ์ดํด๋ฆฝ์ค IDE์ import / Run As ๋ฌธ์ ํด๊ฒฐ (1) | 2025.06.17 |
---|---|
[Spring boot] thymeleaf / css ์ ์ฉ ์๋จ ๐ก (0) | 2025.03.04 |