반응형
들어가며
Thymeleaf
- 스프링 부트에서 자동 설정으로 지원하는 서버 사이드 자바 템플릿 엔진의 한 종류이다.
- 스프링 프레임워크의 MVC 구조에서 View를 담당하는 라이브러리이다.
- JSP와 달리 Servlet Code로 변환되지 않는다.
- 페이지 수정시 서버를 실행하지 않고도 수정이 가능하다.
JSP를 권장하지 않는 이유
- JSP를 사용하면 JAR 패키징을 할 수 없어 WAR 패키징을 해야 한다.
- JAR는 JRE로만 실행 가능하고, WAR는 실행을 위해 WAS가 필요하다.
- Undertow라는 서블릿 엔진이 JSP를 지원하지 않는다.
- JSP 의존성이 문제가 생기는 경우가 있다.
기본 예제
Dependencies
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}
application.properties
# thymeleaf 코드 수정 후 Build Project만 수행해주면 서버 재시작 없이 브라우저에서 수정사항 확인 가능
spring.thymeleaf.cache=false
example.html
- 경로 : ~/src/main/resources/templates/example.html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h2>Hello</h2>
</body>
</html>
서버 실행 및 확인
th:text
설명
- 일반 텍스트를 노출하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("name", "john");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<div>username : <span th:text="${name}"></span></div>
<div th:text="${'Hi, ' + name}"></div>
<div th:text="|Hi, ${name}|"></div>
<div th:text="'Hi, ' + ${name}"></div>
<div th:text="${name == 'john'}"></div>
<div th:text="${name == 'john' ? 'ok' : 'no'}"></div>
</body>
</html>
th:value
설명
- 태그의 value를 설정하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("name", "john");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<input type="text" th:value="${name}">
</body>
</html>
th:utext
설명
- html을 노출하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("html", "<h1>Hello World</h1>");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<div th:utext="${html}"></div>
</body>
</html>
th:each
설명
- 리스트 항목을 하나씩 노출하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
List<User> users = List.of(
new User("john", 25),
new User("tom", 30),
new User("jane", 45)
);
model.addAttribute("users", users);
return "example";
}
@AllArgsConstructor
@NoArgsConstructor
@Data
private static class User {
private String name;
private int age;
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<table>
<thead>
<tr>
<th>index</th>
<th>name</th>
<th>age</th>
</tr>
</thead>
<tbody>
<tr th:each="user, iter : ${users}">
<td th:text="${iter.index}"></td>
<td th:text="${user.name}"></td>
<td th:text="${user.age}"></td>
</tr>
</tbody>
</table>
</body>
</html>
th:with
설명
- 변수에 값을 담아 사용하는 속성
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<div th:with="name = 'john', age = 25">
<span th:text="${name}"></span> : <span th:text="${age}"></span>
</div>
</body>
</html>
th:if, th:unless
설명
- 조건에 해당되거나 해당되지 않을 경우에 노출하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("type", "DEV");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<th:block th:if="${type == 'DEV'}">DEV</th:block>
<th:block th:unless="${type == 'DEV'}">PROD</th:block>
</body>
</html>
th:switch, th:case
설명
- 조건에 해당되거나 해당되지 않을 경우에 노출하는 속성
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("type", "DEV");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<th:block th:switch="${type}">
<th:block th:case="DEV">DEV</th:block>
<th:block th:case="*">PROD</th:block>
</th:block>
</body>
</html>
th:src
설명
- src를 설정하는 속성
이미지 파일 준비
- 경로 : ~/src/main/resources/static/images/pet.jpg
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<img th:src="@{/images/pet.jpg}">
</body>
</html>
date
설명
- 날짜 객체(Date, LocalDateTime)를 받아와 포맷팅하는 예제
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("date1", new Date());
model.addAttribute("date2", LocalDateTime.now());
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<div th:text="${#dates.format(date1, 'yyyy-MM-dd HH:mm:ss')}"></div>
<div th:text="${#temporals.format(date2, 'yyyy-MM-dd HH:mm:ss')}"></div>
</body>
</html>
javascript
설명
- javascript의 값으로 전달한 값을 활용하는 예제
ExampleController
@Controller
public class ExampleController {
@GetMapping("/example")
public String example(Model model) {
model.addAttribute("name", "john");
return "example";
}
}
example.html
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<script th:inline="javascript">
const name1 = [[${name}]];
const name2 = /*[[${name}]]*/ '서버에서 전달한 name값';
alert(name1 + name2);
</script>
</body>
</html>
참고
- https://www.thymeleaf.org/doc/articles/standarddialect5minutes.html
- https://velog.io/@dsunni/Spring-Boot-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9B%B9-MVC-Thymeleaf
- https://snowdeer.github.io/spring-boot/2019/11/29/thymeleaf-sample-on-spring-boot/
- https://bamdule.tistory.com/216
- https://www.baeldung.com/dates-in-thymeleaf
- https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#javascript-inlining
반응형
'Development > Spring' 카테고리의 다른 글
[Spring] @ConfigurationProperties (0) | 2021.08.02 |
---|---|
[Spring] @Value (0) | 2021.08.02 |
[Spring] Model Mapping (0) | 2021.06.13 |
[Spring] Spring Security (0) | 2021.05.29 |
[Spring] spring-retry (0) | 2021.05.27 |