[Spring + Thymeleaf] ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ์‰ฝ๊ฒŒ ์žก๊ธฐ

2025. 6. 20. 17:32ยทSpring

 

 

์›น ํ”Œ๋žซํผ์— ์ ‘์†ํ•ด๋ณด๋ฉด, ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์™€ ์ƒ๋‹จ ํ—ค๋”๋Š” ๊ณ ์ •๋œ ์ฑ„๋กœ ๊ฐ€์šด๋ฐ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ๋งŒ ๋ฐ”๋€Œ๋Š” ๊ตฌ์กฐ๋ฅผ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

 

์ด์ฒ˜๋Ÿผ ๋ ˆ์ด์•„์›ƒ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๊ฐ ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด, 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
'Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Spring Boot] start.spring.io ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ ์ดํด๋ฆฝ์Šค IDE์— import / Run As ๋ฌธ์ œ ํ•ด๊ฒฐ
  • [Spring boot] thymeleaf / css ์ ์šฉ ์•ˆ๋จ ๐Ÿ˜ก
๐ŸŒŸ Sean ๐ŸŒŸ
๐ŸŒŸ Sean ๐ŸŒŸ
  • ๐ŸŒŸ Sean ๐ŸŒŸ
    Road to Dev
    ๐ŸŒŸ Sean ๐ŸŒŸ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (37)
      • Project (7)
      • Spring (3)
      • Java (7)
      • JSP&Servlet (3)
      • Framework (1)
      • DBMS (3)
        • OracleDB (3)
      • JavaScript (4)
      • HTML+CSS (7)
      • Git&GitHub (1)
      • WEB (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์„œ๋ฒ„๋ฐฐํฌ
    spring boot
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
    java
    ์Šคํ”„๋ง๋ถ€ํŠธ
    JavaScript
    DBMS
    docker
    OracleDB
    jsp
    css
    gradle
    Spring
    servlet
    js
    DB
    ์ž๋ฐ”
    frontend
    Database
    html
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.1
๐ŸŒŸ Sean ๐ŸŒŸ
[Spring + Thymeleaf] ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ ์‰ฝ๊ฒŒ ์žก๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”