ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Skill/html js css

thymeleaf

์ง„์—ด์‚ฌ๋ž‘ 2025. 8. 19. 21:48

๐Ÿ”น Thymeleaf (ํƒ€์ž„๋ฆฌํ”„)

1. ๊ฐœ์š”

  • Thymeleaf๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ์ž๋ฐ” ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ, HTML, XML, JavaScript, CSS, ํ…์ŠคํŠธ ๋“ฑ์„ ํ…œํ”Œ๋ฆฟ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ๋กœ Spring MVC / Spring Boot์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๋ฉฐ, JSP๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ๋งŽ์ด ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

2. ํ•ต์‹ฌ ์ฒ ํ•™

๐ŸŸข Natural Template

  • ์ˆœ์ˆ˜ HTML ํŒŒ์ผ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ ค๋„ ์ •์ƒ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, JSP๋Š” <%= %> ๊ฐ™์€ ์ฝ”๋“œ ๋•Œ๋ฌธ์— ๋””์ž์ด๋„ˆ๊ฐ€ HTML์„ ์ง์ ‘ ์—ด์–ด๋ณด๋ฉด ๊นจ์ง€์ง€๋งŒ, Thymeleaf๋Š” th:text, th:if ๊ฐ™์€ ์†์„ฑ๋งŒ ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ์—ฌ์ „ํžˆ HTML๋กœ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    → ์ฆ‰, ๊ฐœ๋ฐœ์ž + ๋””์ž์ด๋„ˆ ํ˜‘์—…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

3. ์ฃผ์š” ๊ธฐ๋Šฅ

(1) ํ‘œํ˜„์‹(Expressions)

  • ๋ณ€์ˆ˜ ํ‘œํ˜„: ${...}
  • ์„ ํƒ ํ‘œํ˜„: *{...} (ํ˜„์žฌ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ ‘๊ทผ)
  • URL ๋งํฌ ํ‘œํ˜„: @{...}

์˜ˆ:

<p th:text="${user.name}">ํ™๊ธธ๋™</p>
<a th:href="@{/user/{id}(id=${user.id})}">์ƒ์„ธ๋ณด๊ธฐ</a>

(2) ์กฐ๊ฑด ์ฒ˜๋ฆฌ

<p th:if="${user.active}">ํ™œ์„ฑ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.</p>
<p th:unless="${user.active}">๋น„ํ™œ์„ฑ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค.</p>

(3) ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ

<ul>
  <li th:each="item : ${items}" th:text="${item}">์•„์ดํ…œ</li>
</ul>

(4) ์†์„ฑ ์น˜ํ™˜

HTML ํƒœ๊ทธ ์†์„ฑ๋„ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<img th:src="@{${user.profileImage}}" alt="ํ”„๋กœํ•„"/>

(5) Fragment (๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ)

ํ—ค๋”/ํ‘ธํ„ฐ ๊ฐ™์€ ๊ณตํ†ต UI๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- header.html -->
<div th:fragment="header">
  <h1>์‚ฌ์ดํŠธ ํ—ค๋”</h1>
</div>

<!-- main.html -->
<html xmlns:th="http://www.thymeleaf.org">
  <body>
    <div th:replace="header :: header"></div>
    <p>๋ฉ”์ธ ํŽ˜์ด์ง€ ๋‚ด์šฉ</p>
  </body>
</html>

์‚ฌ์ดํŠธ ํ—ค๋”


 

๋ฉ”์ธ ํŽ˜์ด์ง€ ๋‚ด์šฉ

  


4. Spring Boot์™€์˜ ํ†ตํ•ฉ

  • spring-boot-starter-thymeleaf ์˜์กด์„ฑ ์ถ”๊ฐ€:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  • ๊ธฐ๋ณธ์ ์œผ๋กœ src/main/resources/templates ํด๋”์— ์žˆ๋Š” .html ํŒŒ์ผ์„ View๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Controller ์˜ˆ์‹œ:

@Controller
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("name", "ํ™๊ธธ๋™");
        return "hello"; // → templates/hello.html ๋ Œ๋”๋ง
    }
}

5. ์žฅ์ ๊ณผ ๋‹จ์ 

โœ… ์žฅ์ 

  • ์ž์—ฐ์Šค๋Ÿฌ์šด HTML → ํ˜‘์—… ํšจ์œจ์„ฑ ↑
  • Spring๊ณผ ๊ฐ•๋ ฅํ•œ ํ†ตํ•ฉ → Model ๋ฐ์ดํ„ฐ ๋ฐ”๋กœ ๋ Œ๋”๋ง
  • JSP ๋Œ€๋น„ ๋Ÿฌ๋‹์ปค๋ธŒ ๋‚ฎ์Œ
  • ๋‹ค์–‘ํ•œ ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ (๋ฐ˜๋ณต, ์กฐ๊ฑด, ๋ ˆ์ด์•„์›ƒ ๋“ฑ)

โŒ ๋‹จ์ 

  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์ด๋ฏ€๋กœ, SPA(React/Vue)์™€ ๊ฐ™์€ ๋™์ ์ธ ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง์— ๋น„ํ•ด ์œ ์—ฐ์„ฑ์€ ๋–จ์–ด์ง
  • ํ™”๋ฉด์ด ๋งŽ์€ ๋Œ€ํ˜• ์„œ๋น„์Šค์—์„œ๋Š” ํ…œํ”Œ๋ฆฟ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์Œ

6. ์š”์•ฝ

  • Thymeleaf๋Š” ์„œ๋ฒ„์—์„œ HTML์„ ๋งŒ๋“ค์–ด ๋ณด๋‚ด๋Š” SSR ํ…œํ”Œ๋ฆฟ ์—”์ง„
  • JSP๋ณด๋‹ค ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํ˜‘์—…์— ์ข‹์Œ
  • Spring Boot์™€ ๊ฒฐํ•ฉ ์‹œ Model → HTML ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋ง ๊ตฌ์กฐ๋กœ ๋™์ž‘
  • ์ค‘์†Œ ๊ทœ๋ชจ์˜ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ๊ธฐ์—… ๋‚ด๋ถ€ ์‹œ์Šคํ…œ, ์ „ํ†ต์ ์ธ ์›น ์„œ๋น„์Šค์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ

 

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2026/01   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ