스프링

[Spring Boot] Thymeleaf를 활용해보자(1)

zumsim 2023. 1. 12. 22:20
728x90
반응형
Thymeleaf

'템플릿 엔진'의 일종으로 HTML에 속성을 추가해 페이지에 값을 추가하거나 처리 할 수 있다.

Thymeleaf를 사용하는 이유?
1. JSP와 유사하게 ${}을 별도의 처리 없이 이용할 수 있다.
2. Model에 담긴 객체를 화면에서 Javascript로 처리하기 편하다.
3. 연산이나 포맷 기능을 추가적인 개발 없이 지원한다.

 

기본적인 사용방법

 

기존의 속성 앞에 'th:'를 붙여주고 값을 지정해준다.

JSP와 달리 별도의 태그를 이용하지 않아도 되며 Thymeleaf는 HTML은 그대로 두고 값을 추가하는 방식이다. 

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 th:text="${'hello'}"></h1>
</body>
</html>
cs

 

일반적으로 JSP에서 foreach문으로 리스트를 돌리는 것과 다르게

li 태그 내에 th:each라는 속성으로 값을 넘겨주면 편하게 처리가 가능하다.

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <ul>
    <li th:each="dto : ${list}">
       [[${dto}]]
    </li>
  </ul>
</body>
</html>
cs

 

반복문의 state 객체

 

소스를 보면 state가 추가된 것을 볼 수 있고, 변수의 이름은 다른 이름을 이용하는 것도 가능하다.

 

@GetMapping({"/ex2""/exLink"})
public void exModel(Model model) {
    List<SampleDTO> list = IntStream.rangeClosed(1,20).asLongStream().
            mapToObj(i->{
                SampleDTO dto = SampleDTO.builder()
                        .sno(i)
                        .first("First.."+i)
                        .last("Last.."+i)
                        .regTime(LocalDateTime.now())
                        .build();
                return dto;
            }).collect(Collectors.toList());
 
    model.addAttribute("list", list);
}
cs

 

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .target {
            background-color: red;
        }
    </style>
</head>
<body>
  <ul>
      <li th:each="dto, state: ${list}">
          [[${state.index}]] --- [[${dto}]]
      </li>
  </ul>
</body>
</html>
cs

 

제어문

 

Thymeleaf의 제어문 처리는 th:if ~ unless 등을 이용할 수 있고, 삼항연산자 스타일을 사용할 수 있다.

 

@GetMapping({"/ex2"})
public void exModel(Model model) {
    List<SampleDTO> list = IntStream.rangeClosed(1,20).asLongStream().
            mapToObj(i->{
                SampleDTO dto = SampleDTO.builder()
                        .sno(i)
                        .first("First.."+i)
                        .last("Last.."+i)
                        .regTime(LocalDateTime.now())
                        .build();
                return dto;
            }).collect(Collectors.toList());
 
    model.addAttribute("list", list);
}
cs

 

- 'th:if' 를 사용한 방법

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <ul>
      <li th:each="dto, state: ${list}" th:if="${dto.sno % 5 == 0}">
          [[${dto}]]
      </li>
  </ul>
</body>
</html>
cs

 

- 삼항연산자를 사용한 방법

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <ul>
      <li th:each="dto, state: ${list}">
          <li th:text="${dto.sno % 5 == 0}?${dto.sno}:${dto.first}"></li>
      </li>
  </ul>
</body>
</html>
cs

 

이런 방식을 이용하면 특정 상황에서만 작용하는 CSS의 클래스를 지정하는 작업도 편하게 할 수 있다.

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .target {
            background-color: red;
        }
    </style>
</head>
<body>
  <ul>
      <li th:each="dto, state: ${list}" th:class="${dto.sno % 5 == 0}?'target'" th:text="${dto}">
      </li>>
  </ul>
</body>
</html>
cs

 

 

728x90
반응형