요즘 대세는 Thymeleaf!
프론트엔드 개발자가 있는데 배우는 이유??
백엔드 개발자도 admin 페이지 정도는 직접 만들 줄알아야 하기 때문!
ex)서버에서 data라는 이름의 모델에 문자열"Hello! Thymeleaf"을 담아 보냈다고 가정
<span th:text="${data}">Hello</span>
<span th:utext="${data}">Hello</span>
<span>[[${data}]]</span>
서버 사이드에러 렌더링 되었다면 Hello 대신 Hello! Thymeleaf을 출력하는 것!
utext를 사용하는 이유?
모델에 <원하는 태그>라는 태그를 달고 싶어서 data에 "<태그>Hello! Thymeleaf</태그>" 를 담아서 보내게 되면 <부분은 <로 >부분은 >로 변경될 것 입니다. HTML에서는 <를 태그가 아닌 문자로 표현하기 위해 HTML 엔티티로 변경합니다.
이런 HTML 변경 기능을 이스케이프라고 합니다. 타임리프는 기본적으로 th:text에 이스케이프를 재공합니다.
이를 unescape하기 위해서 utext를 사용하게 됩니다.
ex)서버에서 member라는 이름의 모델에 membername이라는 프로퍼티를 가진 객체를 담아 보냈다고 가정
<span th:text="${member.getMembername()}"></span>
<span th:text="${member.membername}"></span>
<span th:utext="${member['membername']}"></span>
<!--memeber가 리스트 였을 때-->
<span th:utext="${member[0].getMembername()}"></span>
<span th:text="${member[0].membername}"></span>
<span th:utext="${member[0]['membername']}"></span>
모든 span태그가 member의 프로퍼티인 membername인 getMembername()을 하신다고 생각하시면 됩니다!
ex)서버에서 member라는 이름의 모델에 membername이라는 프로퍼티를 가진 객체를 담아 보냈다고 가정 - 지역변수 선언
th:with 사용
<!--memeber가 리스트 였을 때-->
<div th:with="first=${member[0]}">
<span th:utext="${first.membername}"></span>
</div>
${#request} : HttpServletRequest 객체에 접근
${#response} : HttpServletResponse 객체에 접근
${#session} : 현 세션 상황에 대하여 접든
${#servletContext}
${#locale}
파라미터의 접근도 쉽게 하기 위해 param이라는 기능도 제공
${param.data}
ex)
<a th:href="@{/mvc}">url</a>
<!-- 링크에 파라미터 포함-->
<a th:href="@{/mvc(param1=${param1},param2=${param2})}">url</a>
<a th:href="@{/mvc/{param1}/{param2}(param1=${param1},param2=${param2})}">url</a>
<a th:href="@{/mvc/{param1}(param1=${param1},param2=${param2})}">url</a>
@{/mvc(param1=${param1},param2=${param2})} : /mvc?param1=data1¶m2=data2
@{/mvc/{param1}/{param2}(param1=${param1},param2=${param2})} : /mvc/data1/data2
@{/mvc/{param1}(param1=${param1},param2=${param2})} : /mvc/data1?param2=data2
이렇게 해석 됩니다!
리터럴 대체
||을 사용
th:text="|hello ${data}|" 이렇게 사용. ${data} 가 변수의 값으로 바뀜.
ex)
<!-- 산술-->
<span th:text="10 + 2"></span>
<span th:text="10 % 2 == 0"></span>
<!-- 비교-->
<span th:text="1 gt 10"></span>
<span th:text="1 >= 10"></span>
<!--조건식-->
<span th:text="${data}?: 'no data'"></span>
<!--no operation-->
<span th:text="${data}?: _">no data</span>
나머지는 그냥 자바와 비슷하고 no operation만 눈여겨 봅시다.
no operation이 의미하는 바는 data가 존재하지 않으면 아무 것도 하지 않는 다는 것 입니다. 애초에 타임리프가 없는 것 처럼 동작 하니 "no data"가 그대로 출력 되게 되져
<span class="text" th:attrappend="class='error '"></span>
<span class="text" th:attrappend="class=' error'"></span>
<span class="text" th:classappend="error"></span>
th:attrappend="class='error '" : 뒤 쪽에 공백이 있으므로 class="text error" 이렇게 됩니다.
th:attrappend="class=' error'" : 앞 쪽에 공백이 있으므로 class="error text" 이렇게 됩니다.
이런게 귀찮아서 나온게 th:classappend="error"니다. 바로 class 뒤쪽에 "error"를 더해 줍니다. class="error text"
<table >
<tr>
<th>이름</th>
<th>나이</th>
</tr>
<tr th:each="member:${members}">
<td th:text="${member.membername}">이름</td>
<td th:text="${member.age}">나이</td>
</table>
반복에서는 신기한 기능도 있습니다.
th:each="member:${members}" 이 상황에서 th:each="member,
memberStat:${members}" 처럼 두번 째 파라미터도 가질 수 있습니다.
두번 째 파라미터가 하는 일은 반복 상태에 대하여 보여 줍니다.
ex)
${memberStat.index}
${memberStat.count}
${memberStat.size}
${memberStat.(even이나 odd)}
${memberStat.(first나 last)}
등등 사용 가능 합니다!
ex)
<!-- if, unless-->
th:if="${member.age == 10}"
th:unless="${member.age ge 10}"
<!--switch-->
th:switch="${member.age}"
th:case="10"
th:case="20"
이렇게 사용 가능 합니다.
ex)
<th:block th:each="member:${members}">
<div>
<span th:text="${member.membername}"></span>
<span th:text="${member.age}"></span>
</div>
지금까지 타임리프 기본기능 이었습니다!
이 글은 인프런 김영한님의 '스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard