본문 바로가기

Back-end & Server/Spring Boot with Kotlin

[Spring Boot] Thymeleaf

728x90
반응형

 

Thymeleaf는 서버 측 Java 템플릿 엔진이다.

HTML, XML, JavaScript, CSS 등의 웹 표준 콘텐츠를 생성하는데 사용되며, Spring MVC와 자연스럽게 통합되어 웹 애플리케이션을 개발하는 데 이용된다.

 

주요 특성은 다음과 같다.

 

1. Natural Templates

  • Thymeleaf의 가장 큰 장점 중 하나
  • 템플릿 파일이 그 자체로 정적인 파일로서 작동하게 만들어준다.
  • 웹 브라우저에서 직접 열어볼 수 있다.
  • 디자이너와 개발자가 동시에 작업할 수 있게 해서 협업을 용이하게 한다.

 

2. Standarad and Spring Standard dialects

  • Thymeleaf는 여러가지 dialects를 지원한다.
  • Standard와 SpringStandard dialects(방언)을 기본적으로 제공한다.
  • SpringStandard dialects은 Spring MVC와 완벽하게 통합되어 있다.

 

3. Integration with Spring

  • Thymeleaf 3.0 부터는 Spring 5와 Reactive Streams을 지원한다.

 

4. Web and non-web environments

  • 웹 및 비웹 환경에서 동일하게 작동한다. 
  • 이를 통해 다양한 출력 형식의 처리를 지원한다.

 

 

Thymeleaf 사용을 위해서 ThymeleafViewResolver을 추가해야한다.

implementation("org.springframework.boot:spring-boot-starter-thymeleaf")

 

그리고 application.properties에 다음과 같이 추가한다.

# Thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html

 

그 다음은 main/resources/templates 폴더에 html 파일을 작성한다.

<!doctype html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h1>Users</h1>
<table>
    <tr>
        <th>Index</th>
        <th>Name</th>
        <th>Email</th>
    </tr>
    <tr th:each="user, stat : ${users}">
        <td th:text="${stat.index + 1}"></td> <!-- index는 0부터 시작하므로 1을 더해줍니다. -->
        <td th:text="${user.name}"></td>
        <td th:text="${user.email}"></td>
    </tr>
</table>
</body>
</html>

 

<html>에 xmlns:th은 Thymeleaf를 사용하겠다는 선언이다.

 

JSP 때와 같이 파일의 .을 제외한 이름을 Controller에서 문자열로 반환하면 해당하는 HTML 파일이 Thymeleaf로 실행된다.

 

 

 

문법

  • 표현식
    • 변수 : ${…}
    • 선택 변수 : *{…}
    • 메시지 : #{…}
    • Link URL : @{…}

 

  • 리터럴
    • 텍스트 : ‘one text’, ‘Another one’,…
    • 숫자 : 0, 34, 1.0, …
    • boolean : true, false
    • Null : null
    • token : one, sometext, main, …

 

  • text opeation
    • 문자열 연결 : +
    • 문자 대체 : |The name is ${name}|

 

  • 연산
    • Binary : +, -, *, /, %
    • 마이너스 : -

 

  • boolean 연산
    • Binary : and, or
    • 부정 : !, not

 

  • 비교 연산
    • 비교연산자 : >, <, >=, <= (gt, lt, ge, le)
    • 균등연산자 : ==, != (eq, ne)

 

  • 조건 연산
    • if-then : (if) ? (then)
    • if-then-else : (if) ? (then) : (else)
    • Default : (value) ?: (defaultValue)

 

 

표현 설명 예제
@{ ... } URL 링크 표현식 th:href="@{/css/bootstrap.min.css}"
th:href="@{/{itemId}/edit(itemId=${item.id})}"
| ... | 리터럴 대체 th:text="|Hi ${user.name}!|"
(= th:text="'Hi '+${user.name}+'!'"
${ ... } 변수 th:text=${user.name}
th:each 반복 출력 <tr th:each="item: ${items}">
  <td th:text="${item.price}">100</td>
</tr>
*{ ... } 선택 변수 <tr th:object="${items}">
  <td th:text="*{price}">100</td>
</tr>
#{ ... } 메시지 .properties 같은 외부 자원에서 코드에 해당하는 문자열 get. th:text="#{member.register}"

 

 

 

728x90
반응형