spring이 object를 표현하는 방식
Thymeleaf에서 springEL을 사용해서 오브젝트에 접근이 가능하다.
basic/variable
<ul>Object
<li>${user.username} = <span th:text="${user.username}"></span></li>
<li>${user['username']} = <span th:text="${user['username']}"></span></li>
<li>${user.getUsername()} = <span th:text="${user.getUsername()}"></span></li>
</ul>
<ul>List
<li>${users[0].username} = <span th:text="${users[0].username}"></span></li>
<li>${users[0]['username'] = <span th:text="${users[0]['username']}"></span></li>
<li>${users[0].getUsername()} = <span th:text="${users[0].getUsername()}"></span></li>
</ul>
<ul>Map
<li>${userMap['userA'].username = <span th:text="${userMap['userA'].username}"></span></li>
<li>${userMap['userA']['userA'] = <span th:text="${userMap['userA']['username']}"></span></li>
<li>${userMap['userA'].getUsername()} = <span th:text="${userMap['userA'].getUsername()}"></span></li>
</ul>

th:with를 사용해서 지역 변수 선언을 할 수 있다. 단, 선언한 태그 안에서만 사용 가능하다.
<h1>지역 변수 - (th:with)</h1>
<div th:with="first=${users[0]}">
<p>처음 사람의 이름은 <span th:text="${first.username}"></span></p>
</div>
타임리프가 제공하는 기본객체
스프링부트 3.0부터는 타임리프에서 request, response, session, servletContext를 기본객체로 제공하지 않아서 model에 담아서 view로 넘겨야 한다.
${request}${response}${session}${servletContext}${#locale}BasicController
@GetMapping("/basic-objects")
public String basicObjects(Model model, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
session.setAttribute("sessionData", "Hello Session");
model.addAttribute("request", request);
model.addAttribute("response", response);
model.addAttribute("servletContext", request.getServletContext());
return "basic/basic-objects";
}
@Component("helloBean")
static class HelloBean {
public String hello(String data){
return "Hello" + data;
}
}
basic/basic-object.html
<body>
<h1>식 기본 객체 (Expression Basic Objects)</h1>
<ul>
<li>request = <span th:text="${request}"></span></li>
<li>response = <span th:text="${response}"></span></li>
<li>session = <span th:text="${session}"></span></li>
<li>servletContext = <span th:text="${servletContext}"></span></li>
<li>locale = <span th:text="${#locale}"></span></li>
</ul>
<h1>편의 객체</h1>
<ul>
<li>Request Parameter = <span th:text="${param.paramData}"></span></li>
<li>session = <span th:text="${session.sessionData}"></span></li>
<li>spring bean = <span th:text="${@helloBean.hello('Spring!')}"></span></li>
</ul>
</body>

문자, 날짜, 오브젝트, 메시지 등을 편리하게 사용할 수 있도록 하는 객체
유틸리티 객체 종류
#messages: 메시지, 국제화 처리#dates: java.util.Date서식 지정, 구성 요소 추출 등#numbers: 숫자 개체의 서식을 지정하는 방법#springs: String 객체에 대한 메서드 제공#bools: Boolean 처리 메서드 제공#arrays: 배열 처리 메서드 제공#temporals: 자바 8 날짜 서식 지원자바 8의 날짜 타입 사용하려면 thymeleaf-extras-java8 time라는 라이브러리가 필요하다.
하지만, 스프링부트 3.2 이상을 사용한다면 이미 포함되어 있어서 신경 쓰지 않아도 된다.
BasicController
@GetMapping("/date")
public String date(Model model) {
model.addAttribute("localDateTime", LocalDateTime.now());
return "basic/date";
}
basic/date.html
<ul>
<li>default = <span th:text="${localDateTime}"></span></li>
<li>yyyy-MM-dd HH:mm:ss = <span th:text="${#temporals.format(localDateTime, 'yyyy-MM-dd HH:mm:ss')}"></span></li>
</ul>

@{...} 문법을 사용하면 된다.
쿼리 파라미터
@{/hello(param1=${param1}, param2=${param2})}
경로 변수
@{/hello{param1}/{param2}(param1=${param1}, param2=${param2})}
경로 변수 + 쿼리 파라미터
@{/hello/{param1}(param1=${param1}, param2=${param2})}
값을 나타내는 표기법, 고정된 값을 나타냅니다.
String str = "문자입니다."; //문자 리터럴
int a = 30 + 40; //정수 리터럴
주의사항
타임리프에서 문자 리터럴은 ' 작은따옴표로 감싸야한다.
<p th:text=${" 'hello' "}></P>
하지만 매번 이렇게 사용하는 것은 매우 불편한 일이기 때문에 Thymeleaf에서는 공백이 없다면 토큰으로 인지해서 ' 작은 따옴표 생략이 가능하다.
<p th:text=${"hello"}>
하지만, 공백이 있다면 <p th:text=${"'hello world'"}></P> <-- 이렇게 ' 작은 따옴표로 감싸줘야 정상적으로 작동한다.
리터럴 대체 문법
|...|
| hello ${data} | 이렇게 하면 자바스크립트의 ``(백틱) 템플릿 리터럴 같은 효과를 낼 수 있다.
문자와 문자를 연결할 때 + 를 사용하지 않아도 되고 문자야 변수를 연결할 때도 따로 +를 할 필요가 없다.