공부하는 스누피

[Spring]타임리프 정리 본문

Web/Spring

[Spring]타임리프 정리

커피맛스누피 2020. 9. 25. 15:54

타임리프

타임리프는 Server-side Java 템플릿 엔진으로, HTML, XML, JS, CSS를 처리할 수 있어 웹과 단일 환경을 지원한다.
타임리프의 주 목적은 템플릿을 유지보수가 용이하도록 제작하는 방법을 제공하는 것이다.
그래서 타임리프는 Natural Templates의 개념을 적용해 디자인에 영향을 미치지 않는 템플릿에만 로직을 주입하는 방식을 사용한다.
이 방법은 디자인 팀과 개발 팀의 갭을 줄이도록 해준다.

사용하는 방법

  • 자체 컨트롤러 인터페이스를 사용하는 경우
    타임리프를 사용하기 위해서는 응답 프로세스마다 타임리프 context를 설정해주어야 한다.
    컨트롤러에서 뷰로 모델 객체를 넘겨주는 대신, 타임리프 context에 변수로 설정해주면 된다.
  • Spring MVC
    스프링의 ViewResolver를 타임리프에서 제공하는 ViewResolver로 사용하도록 설정하면 된다. 그 외의 컨틀롤러 구현은 동일하다.
  • Spring boot
    스프링 부트는 기본으로 타임리프 템플릿 파일을 검색하기 때문에 타임리프 모듈을 의존으로 추가하기만 하면 된다.

타임리프의 주요 expression

  • 변수 식: ${OGNL}
    ${x}: Thymeleaf context 또는 request 속성에 있는 변수 x를 반환한다.
    ${param.x} : request 파라미터에 있는 변수 x를 반환한다.
    ${session.x} : 세션 속성 x를 반환한다.
    ${application.x} : servlet context 속성 x를 반환한다.

  • 메시지 식: #{코드}
    외부 메시지 자원에서 코드에 해당하는 문자열을 읽어와 출력. spring:message와 동일
    ex)

    <title th:text="#{member.register}">title</title>
  • 링크 식: @{링크}
    링크 문자열을 생성한다. 링크 경로에 변수를 넣을 수도 있다.

    <a href="#" th:href="@{/members}">목록</a>
    <a href="#" th:href="@{/members/{memId}(memId=${mem.id})}">상세 정보</a>
  • 선택 변수식: *{OGNL}
    th:object 속성은 특정 객체를 선택하는데, 선택 변수식은 선택한 객체를 기준으로 나머지 경로를 값으로 사용한다.
    th:object로 member를 선택했다면, member.name이나 member.age를 경로로 사용할 때 앞에 member를 붙이지 않아도 경로로 인정된다.

    <div th:object="${member}"> // member 객체 선택
    <span th:text="*{name}">name</span> // 선택 객체를 기준으로한 경로 사용
    </div>
  • 조건식: ${x}? 'true' : 'false'

OGNL(Object-Graph Navigation Language)는 객체의 프로퍼티 경로를 표현할 때 사용한다.

타임리프 기본 속성

  • th:text : 식의 값을 태그 body로 출력한다. HTML 특수 문자는 엔티티 형식(<)으로 변환한다.

  • th:utext : 식의 값을 HTML 특수 문자를 포함하여 그대로 출력한다.

  • th:href : 태그의 주소값 속성을 지정한다.

  • th:action :

    태그의 action 속성 값을 치환한다.

  • th:value : 폼 관련 태그의 value 속성을 지정한다.

  • th:each : 반복 처리에 사용된다. forEach와 작동 원리가 같다.

    // members 변수에 담긴 각 객체에 대해 tr 태그를 반환한다.
    <tr th:each="mem : ${members}"> 
    <td th:text="${mem.id}">Id</td>
    </tr>
  • th:fragement : 다른 템플릿에 삽입될 때 사용할 fragemnt 선택자를 지정한다.

    <div th:fragment="선택자">
    &템플릿 이름;
    </div>
  • th:insert="~{템플릿 이름::fragment선택자}" : 다른 템플릿의 fragement를 삽입한다.

타임리프 식 객체

타임리프에서 제공하는 식 객체를 사용하면 뷰에 값을 보여주기 전에 가공할 수 있다.

  • #strings: String 타입을 위한 기능 제공
  • #numbers : 포맷팅 등 숫자 타입 기능 제공
  • #dates, #calendars: 날짜 타입 기능 제공
  • #lists, #sets, #maps: list, set, map 자료형 타입을 위한 기능 제공

타임리프와 HTML5

타임리프를 사용하기 위해서는 th:*로 시작하는 속성이름을 붙여야 한다.
하지만 HTML5 표준을 따른다면, 브라우저는 HTML 태그가 아닌 것들을 자동으로 제외시킨다.
(브라우저는 th:text같은 이해할 수 없는 모든 속성들을 무시한다.)
타임리프의 data attribute syntax를 사용하면 이 문제를 해결할 수 있다.
접두사 _data-_는 기존에 사용되던 세미콜론 대신에 -를 사용한다.

<p th:text="#{home.welcome}">...</p> // 브라우저가 무시함
<p data-th-text="#{home.welcome}">...</p>

타임리프와 lazy loading

데이터를 실제로 사용할 때만 불러오고 싶은 경우에 변수를 LazyContextVariable로 설정한다.

context.setVariable(
     "users",
     new LazyContextVariable<List<User>>() {
         @Override
         protected List<User> loadValue() {
             return databaseRepository.findAllUsers();
         }
     });

뷰에서 해당 변수를 불러올 때, 조건문으로 초기화 시키지 않게 한다면 Context는 데이터를 불러오지 않는다.

<ul th:if="${condition}">
  <li th:each="u : ${users}" th:text="${u.name}">user name</li>
</ul>

'Web > Spring' 카테고리의 다른 글

[MSA] 스프링 클라우드  (0) 2021.01.10
[이슈] @Transactional(readOnly = true) 오류  (0) 2020.11.01
[Spring] 커맨드 값 검증 방법  (0) 2020.08.28
[Spring] 메시지 정리  (0) 2020.08.28
[Spring] MVC 기본 정리  (0) 2020.08.19
Comments