Spring

[Spring + Thymeleaf] λ ˆμ΄μ•„μ›ƒ ꡬ쑰 μ‰½κ²Œ 작기

🌟 Sean 🌟 2025. 6. 20. 17:32

 

 

μ›Ή ν”Œλž«νΌμ— 접속해보면, μ‚¬μ΄λ“œ 메뉴와 상단 ν—€λ”λŠ” κ³ μ •λœ μ±„λ‘œ κ°€μš΄λ°μ˜ μ½˜ν…μΈ  μ˜μ—­λ§Œ λ°”λ€ŒλŠ” ꡬ쑰λ₯Ό 자주 λ³Ό 수 μžˆλ‹€

 

이처럼 λ ˆμ΄μ•„μ›ƒμ˜ 일관성을 μœ μ§€ν•˜λ©΄μ„œλ„ 각 νŽ˜μ΄μ§€μ˜ μ½˜ν…μΈ λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜λ €λ©΄, 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> νƒœκ·Έλ₯Ό 포함할 경우, λΆ€λͺ¨ λ ˆμ΄μ•„μ›ƒκ³Ό μ€‘λ³΅λ˜μ–΄ 좩돌이 λ°œμƒν•  수 μžˆμœΌλ―€λ‘œ ꢌμž₯ν•˜μ§€ μ•ŠμŒ