서버에서 HTML 문서 또는 XML 문서를 동적으로 생성하여 제공하는 Server Side Template Engine
HTML 태그에 Thymeleaf 속성을 사용해 동적으로 뷰(View)를 생성하여 제공
서버를 실행하지 않으면 정적인 HTML 문서로 사용되며 서버를 실행하면 동적인 HTML 문서로 생성되어 사용
JSP 태그 및 커스텀 태그(JSTL)을 사용할 수 없어 코드의 재사용 불가능 - JavaScript 사용
<html xmlns:th="http://www.thymeleaf.org">
HTML 태그 속성에 [th:속성명="속성값"] 형식으로 Thymeleaf 속성을 작성해 태그내용 또는 HTML 태그의 속성값을 동적으로 변경하거나 추가하는 기능 제공
Thymeleaf 속성값으로 변수 표현식, 메세지 표현식, 링크 표현식, 선택 변수 표현식, 인라인 표현식 사용 가능
속성값으로 태그내용을 변경하기 위한 Thymeleaf 속성
text 속성값으로 문자값을 사용할 경우 '' 사용
<h2 th:text="100">0</h2>
<h2 th:text="'Hi, Thymeleaf!!!'">Hello, Thymeleaf!!!</h2>
Thymelaf 속성의 속성값으로 변수 표현식을 사용해 태그내용 변경
변수 표현식: ${속성명} 형식으로 Scope 속성값을 Thymeleaf 속성값으로 사용하기 위한 표현식
컨트롤러에서 model 객체서 속성을 넣어주고 사용
@Controller
@RequestMapping("/thymeleaf")
public class ThymeleafController {
@GetMapping("/text")
public String text(Model model) {
model.addAttribute("dataOne", "Hi, Thymeleaf!!!");
model.addAttribute("dataTwo", "<font color='red'>Hi, Thymeleaf!!!</font>");
}
}
<h2 th:text="${dataOne}">Hello, Thymeleaf!!!</h2>

<h2 th:text="${dataTwo}">Hello, Thymeleaf!!!</h2>

text 속성값에 HTML 태그가 포함되어 있다면 HTML 태그 내용까지 그대로 출력이 되지만 utext 속성을 사용하면 태그 내용을 변경해서 출력한다.
utext 속성: 속성값으로 태그내용을 변경하기 위한 Thymeleaf 속성
utext 속성값에 HTML 태그가 포함되어 있는 경우 HTML 태그로 출력 처리
<h2 th:utext="${dataTwo}">Hello, Thymeleaf!!!</h2>
인라인 표현식을 사용해 Scope 속성값을 제공받아 사용 가능
인라인 표현식: [[${속성명}]] 형식으로 표현해 Scope 속성값을 제공받아 사용하는 표현식
인라인 표현식은 일반적으로 JavaScript에서 사용
utext 속성과 마찬가지로 속성값에 HTML 태그가 있는경우 HTML 태그로 출력 처리됨
<h2>[[${dataOne}]]</h2>
<h2>[(${dataTwo})]</h2>
@Data
@Builder
public class User {
private String id;
private String name;
private String email;
}
@Controller
@RequestMapping("/thymeleaf")
public class ThymeleafController {
@GetMapping("/text")
public String text(Model model) {
User user=User.builder()
.id("abc123")
.name("홍길동")
.email("abc@itwill.xyz")
.build();
model.addAttribute("user", user);
}
}
<h2>아이디 = <span th:text="${user.id}">test</span></h2>
<h2>이름 = <span th:text="${user.getName()}">테스트</span></h2>
<h2>이메일 = <span th:text="${user['email']}">test@aaa.com</span></h2>

선택 변수 표현식을 사용해 객체의 필드값을 제공받아 Thymeleaf 속성값으로 사용
선택 변수 표현식: *{필드명|맵키} 형식으로 표현해 객체의 필드값 또는 맵값을 Thymeleaf 속성값으로 사용
Object 속성을 이용해 선택 변수 표현식으로 접근하는 방법은 2가지
<h2>아이디 = <span th:object="${user}" th:text="*{id}">test</span></h2>
<h2>이름 = <span th:object="${user}" th:text="*{name}">테스트</span></h2>
<h2>이메일 = <span th:object="${user}" th:text="*{email}">test@aaa.com</span></h2>
<hr>
<!-- object 속성으로 제공받은 객체는 하위 태그에서 사용 가능 -->
<div th:object="${user}">
<h2>아이디 = <span th:text="*{id}">test</span></h2>
<h2>이름 = <span th:text="*{name}">테스트</span></h2>
<h2>이메일 = <span th:text="*{email}">test@aaa.com</span></h2>
</div>
메세지 표현식으로 Properties 파일에 저장된 스프링 메세지를 제공받아 Thymeleaf 속성값으로 사용
메세지 표현식: #{이름} 형식으로 표현하여 이름으로 제공되는 메세지를 Thymeleaf 속성값으로 설정
#Message
spring.messages.basename=messagesmsg.value = Hi<h2 th:text="#{msg.value}">Hello</h2> 
HTML 태그의 src 속성값을 동적으로 변경하기 위한 Thymeleaf 속성
src 속성의 속성값으로 링크 표현식을 사용해 속성값 설정
링크 표현식 @{웹자원경로} 형식으로 표현해 웹자원을 제공받아 Thymeleaf 속성값으로 사용
src 속성, href 속성, action 속성 등의 Thymeleaf 속성의 속성값으로 사용
컨텍스트의 최상위 폴더 경로가 자동으로 제공되어 웹자원 요청
<!-- 일반적으로 요청 -->
<img src="/images/Koala.jpg" width="200">
<!-- src 속성과 링크표현식으로 요청 -->
<img th:src="@{/images/Koala.jpg}" width="200">

<h2><a href="/">메인페이지</a></h2>
<h2><a th:href="@{/}">메인페이지</a></h2>
Scope 속성값으로 String 객체를 제공받아 문자열에서 원하는 정보를 Thymeleaf 속성값으로 변환하여 사용하기 위한 유틸리티 객체
ThymeleafController.java
model.addAttribute("phone", "010-1234-5678");
result.html
<h2 th:text="${phone}">전화번호</h2>
<h2 th:text="${#strings.substring(phone, 0, 3)}">앞부분 3자리</h2>
<h2 th:text="${#strings.substring(phone, 4, 8)}">중간부분 4자리</h2>
<h2 th:text="${#strings.substring(phone, 9, 13)}">뒷부분 4자리</h2>

dates: Scope 속성값으로 Date 객체를 제공받아 원하는 날짜 및 시간 패턴의 Thymeleaf 속성값으로 변환하여 사용하기 위한 유틸리티 객체
ThymeleafController.java
model.addAttribute("now1", new Date());
result.html
<h2 th:text="${now1}">2024-10-02 12:54:52</h2>
<h2 th:text="${#dates.format(now1, 'yyyy-MM-dd HH:mm:ss')}">2024-10-02 12:54:52</h2>

temporals: Scope 속성값으로 LocalDateTime 객체를 제공받아 원하는 날짜 및 시간 패턴의 Thymeleaf 속성값으로 변환하기 위한 유틸리티 객체
ThymeleafController.java
//LocalDateTime.now() : 현재 날짜와 시간이 저장된 LocalDateTime 객체를 반환하는 정적메소드
model.addAttribute("now2", LocalDateTime.now());
result.html
<h2 th:text="${now2}">2024-10-02 12:54:52</h2>
<h2 th:text="${#temporals.format(now2, 'yyyy-MM-dd HH:mm:ss')}">2024-10-02 12:54:52</h2>

model.addAttribute("price", "100000000");
model.addAttribute("pi", "3.141592");<h2 th:text="${price}">100</h2>
<h2 th:text="${#numbers.formatInteger(price, 3, 'COMMA')}">100</h2>
<hr>
<h2 th:text="${pi}">1.23</h2>
<h2 th:text="${#numbers.formatDecimal(pi, 1, 2)}">1.23</h2> 
<h2 th:text="10 + 2">0</h2>
<h2 th:text="'Hello, ' + ${user.name} + '!!!'">안녕하세요. 테스트님!!!</h2>
<!-- + 연산자를 사용하지 않고 | | 기호를 사용해 문자값과 표현식을 Thymeleaf 속성값으로 사용 -->
<!-- 자바스크립트의 `` 벡틱 이라고 생각하면됨 -->
<h2 th:text="|Hello, ${user.name}!!!|">안녕하세요. 테스트님!!!</h2>
