타임리프 연산은 자바와 크게 다르지 않습니다. HTML안에서 사용하기 때문에 HTML 엔티티를 사용하는 부분만 주의하면 됩니다.
예를 들어, <, > 같은 용어들은 HTML 태그가 쓰는 용어입니다.
package hello.thymeleaf.basic;
import lombok.Data;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@Controller
@RequestMapping("/basic")
public class BasicController {
...
@GetMapping("/operation")
public String operation(Model model) {
model.addAttribute("nullData", null);
model.addAttribute("data", "Spring!");
return "basic/operation";
}
...
}
<!DOCTYPE html>
<html xmlns:th="<http://www.thymeleaf.org>">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
<li>산술 연산
<ul>
<li>10 + 2 = <span th:text="10 + 2"></span></li>
<li>10 % 2 == 0 = <span th:text="10 % 2 == 0"></span></li>
</ul>
</li>
<li>비교 연산
<ul>
<li>1 > 10 = <span th:text="1 > 10"></span></li>
<li>1 > 10 = <span th:text="1 > 10"></span></li>
<li>1 gt 10 = <span th:text="1 gt 10"></span></li>
<li>1 >= 10 = <span th:text="1 >= 10"></span></li>
<li>1 ge 10 = <span th:text="1 ge 10"></span></li>
<li>1 == 10 = <span th:text="1 == 10"></span></li>
<li>1 != 10 = <span th:text="1 != 10"></span></li>
</ul>
</li>
<li>조건식
<ul>
<li>(10 % 2 == 0)? '짝수':'홀수' = <span th:text="(10 % 2 == 0)?'짝수':'홀수'"></span></li>
</ul>
</li>
<li>Elvis 연산자
<ul>
<li>${data}?: '데이터가 없습니다.' = <span th:text="${data}?:'데이터가 없습니다.'"></span></li>
<li>${nullData}?: '데이터가 없습니다.' = <span th:text="${nullData}?:'데이터가 없습니다.'"></span></li>
</ul>
</li>
<li>No-Operation
<ul>
<li>${data}?: _ = <span th:text="${data}?: _">데이터가 없습니다.</span></li>
<li>${nullData}?: _ = <span th:text="${nullData}?: _">데이터가 없습니다.</span></li>
</ul>
</li>
</ul>
</body>
</html>
산술연산
비교연산
HTML 엔티티를 사용해야 하는 부분을 주의하자!
(gt)
>
, gt
, >
셋 중에 아무거나 써도 되지만, 원칙적으로 엔티티표현을 사용하는 것이 맞습니다.= (ge)
<aside> ❗ 엔티티표현, 비교표현 모두 사용가능하지만 엔티티를 우선시 사용하라는 의미인가요?
원칙적으로 엔티티표현을 사용하는 것이 맞습니다. 엔티티표현을 사용하지 않으면 HTML, XML에서 문제가 될 수도 있습니다.
(문제가 되지 않도록 타임리프도 노력하지만 문제가 될 수도 있다 정도로 생각하시면 됩니다. 실제로 >를 쓰더라도 제대로 동작하긴 합니다.)
</aside>
조건식
Elvis 연산자
<span th:text="${data}?: '데이터가 없습니다.'"></span>
${data}
가 그대로 출력되고 데이터가 없으면 '데이터가 없습니다.'
가 출력됩니다.<span th:text="${nullData}?:'데이터가 없습니다.'">
'데이터가 없습니다.'
가 출력됩니다.No-Operation
_ 인 경우 마치 타임리프가 실행되지 않는 것 처럼 동작합니다.
이것을 잘 사용하면 HTML의 내용 그대로 활용할 수 있습니다.
예시
<span th:text="${nullData}?: _">데이터가 없습니다.</span>
nullData에는 데이터가 없습니다. Elvis 연산자를 썼으니 _ 가 선택이 됩니다.
_ (No-Operation) 이 실행이 되면 타임리프가 실행되지 않는 것 처럼 동작합니다.
<span>데이터가 없습니다.</span>
그래서 span 테그 부분이 그대로 출력됩니다.
테그 안에 기본값을 넣어두고 “No-Operation이면 기본값 쓸거야” 처럼 활용 가능합니다.