Thymeleaf

2024. 5. 21. 10:13Back-End/Spring

Thymeleaf는 Java 기반 웹 애플리케이션을 위한 강력하고 현대적인 템플릿 엔진이다. 주로 Spring Framework와 함께 사용되며, HTML, XML, JavaScript, CSS 등 다양한 파일 형식을 지원한다. 이 글에서는 Thymeleaf의 주요 특징, 사용법, 기본 문법, 그리고 장점을 살펴보겠다.

 

Thymeleaf의 주요 특징

  1. HTML5 지원: Thymeleaf는 표준 HTML5를 완벽하게 지원한다. 이는 개발자와 디자이너가 동일한 HTML 파일을 작업할 수 있게 해준다.
  2. 표현식 언어: 간단하면서도 강력한 표현식 언어를 통해 변수 출력, 조건문, 반복문 등을 사용할 수 있다.
  3. 템플릿 레이아웃: 템플릿의 재사용성을 높이기 위해 템플릿 레이아웃 기능을 제공한다.
  4. Spring 통합: Spring MVC와의 완벽한 통합을 지원하여, 웹 애플리케이션 개발을 더욱 편리하게 한다.
  5. 확장성: 커스텀 다이얼렉트(dialect)를 통해 기능을 확장할 수 있다.

기본 사용법

컨트롤러 작성

간단한 컨트롤러를 작성해보겠다. 이 컨트롤러는 사용자의 목록을 모델에 추가하여 Thymeleaf 템플릿에 전달한다.

package org.example.springmvc.controller;

import org.example.springmvc.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.Arrays;
import java.util.List;

@Controller
public class UserController {
    @GetMapping("/user")
    public String user(Model model) {
        List<User> users = Arrays.asList(
                new User("jeon", true),
                new User("kim", false),
                new User("lee", false)
        );
        model.addAttribute("users", users);
        return "user";
    }
}

 

모델 클래스 작성

사용자 데이터를 표현할 간단한 모델 클래스를 정의한다.

package org.example.springmvc.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private boolean admin;
}

 

Thymeleaf 템플릿 작성

이제 src/main/resources/templates 디렉토리에 user.html 파일을 생성하고, 사용자 목록을 표시하는 Thymeleaf 템플릿을 작성한다.

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>User List</title>
</head>
<body>
<h1>사용자 목록</h1>
<ul>
    <li th:each="user : ${users}">
        <span th:text="${user.name}">User Name</span> -
        <span th:text="${user.admin} ? 'Admin' : 'User'">Status</span>
    </li>
</ul>
</body>
</html>

 

Thymeleaf의 기본 문법

Thymeleaf의 기본 문법을 살펴보겠다. 이를 통해 모델 속성, 선택 변수 표현식, 메시지 표현식, 링크 URL 표현식 등을 이해할 수 있다.

 

모델 속성

모델 속성은 서버에서 전달된 데이터를 템플릿에서 사용하기 위해 사용된다. Model 객체에 추가된 속성을 템플릿에서 사용할 수 있다.

model.addAttribute("users", users);

템플릿에서 이를 참조하려면 ${}를 사용한다.

<p th:text="${users}">사용자 목록</p>

 

선택 변수 표현식

선택 변수 표현식은 주로 *{}을 사용하여 현재 선택된 객체의 속성에 접근하는 데 사용된다. 예를 들어, 반복문 내에서 현재 객체의 속성에 접근할 때 유용하다.

<li th:each="user : ${users}">
    <span th:text="*{name}">User Name</span>
</li>

 

메시지 표현식

메시지 표현식은 국제화(i18n)를 지원하기 위해 사용된다. messages.properties 파일에 메시지를 정의하고 이를 템플릿에서 사용할 수 있다.

messages.properties 파일:

welcome.message=Welcome to Thymeleaf!

템플릿에서 메시지를 참조하려면 #{}를 사용한다.

<p th:text="#{welcome.message}"></p>

 

링크 URL 표현식

링크 URL 표현식은 동적으로 URL을 생성하기 위해 사용된다. @{}를 사용하여 URL을 생성한다.

<a th:href="@{/user}">User List</a>

 

@GetMapping 어노테이션

@GetMapping 어노테이션은 HTTP GET 요청을 처리하는 메서드를 정의하는 데 사용된다. URL 패턴을 지정하여 특정 URL로 들어오는 GET 요청을 이 메서드가 처리하도록 한다.

@GetMapping("/user")
public String user(Model model) {
    // 메서드 내용
}

이 어노테이션이 붙은 메서드는 해당 URL로 요청이 들어오면 데이터를 불러와 처리하고, 결과를 뷰에 전달한다.

 

Thymeleaf의 장점

  1. 직관적인 템플릿 문법: Thymeleaf는 HTML 문서 안에서 자연스럽게 사용할 수 있는 템플릿 문법을 제공한다. 이는 개발자와 디자이너가 동일한 파일을 작업할 때 매우 유용하다.
  2. 서버-사이드 및 클라이언트-사이드 지원: Thymeleaf는 서버-사이드 렌더링뿐만 아니라, 클라이언트-사이드 렌더링을 지원하여 다양한 개발 환경에 적응할 수 있다.
  3. 강력한 Spring 통합: Spring MVC와의 완벽한 통합으로, 국제화(i18n), 폼 데이터 바인딩, 검증 등의 기능을 손쉽게 사용할 수 있다.
  4. 확장 가능성: 커스텀 다이얼렉트를 통해 자신만의 기능을 확장할 수 있다.
  5. 정적 분석 가능: Thymeleaf 템플릿은 정적 파일처럼 브라우저에서 미리 볼 수 있어, 개발 초기 단계에서의 오류를 줄일 수 있다.

결론

Thymeleaf Java 애플리케이션 개발자에게 매우 강력한 도구이다. Spring MVC와의 뛰어난 통합성, 직관적인 템플릿 문법, 확장 가능성 등은 Thymeleaf 선택할 만한 충분한 이유가 된다. 애플리케이션 개발에서 Thymeleaf 활용해보자. 효율적이고 유지보수하기 쉬운 코드를 작성하는 도움이 것이다.

 

 

'Back-End > Spring' 카테고리의 다른 글

BindingResult  (0) 2024.05.22
@Valid(스프링 MVC에서의 입력 유효성 검증)  (0) 2024.05.22
Spring MVC  (0) 2024.05.18
AOP (Aspect-Oriented Programming)  (0) 2024.05.18
ResultSetExtractor  (0) 2024.05.17