개발노트/Spring

[Spring Boot] Thymeleaf

Dahoon06 2021. 7. 9. 13:31
728x90
반응형

 

 

 

SrpingBoot에서는 JSP를 권장하지 않는다.

Thymeleaf와 달리 JSP는 스프링부트가 자동 설정을 지원하지 않으며 권장하지도 않는다.

우선 JSP를 사용하면 JAR 패키징을 할 수 없어 WAR 패키징을 해야한다. 물론, WAR패키징으로도 임베디드 톰캣으로 실행할 수 있고 배포도 가능하다.

하지만 Undertow라는 최근에 만들어진 서블릿 엔진이 JSP를 지원하지 않는 등 제약사항이 있다.

또한 JSP에 대한 의존성을 넣으면 의존성 문제가 생기는 경우도 있다.

 

JAR vs WAR

JAR와 WAR 모두 JAVA의 jar 툴을 이용해 생성된 파일이며 애플리케이션을 쉽게 배포하고 동작시킬 수 있도록 관련 파일을 패키징해준다.

  • JAR (Java Archive)
    • .jar 자바 프로젝트를 압축한 파일
    • 자바 리소스, 속성파일, 라이브버리 등이 포함되어있음
    • 원하는 구조로 구성이 가능하며 JDK(Java Development Kit)에 포함되어 있는 JRE(Java Runtime Environment)만 가지고도 실행 가능하다.
  • WAR(Web Application Archive)
    • .war servlet / jsp 컨테이너에 배치할 수 있는 웹어플리케이션 압축 파일
    • 웹 관련 자원만을 포함 (JSP, Servlet, JAR, Class, HTML 등)
    • JAR과 달리 WEB-INF 및 META-INF 디렉토리로 사전 정의된 구조를 사용하며 실행하기 위해서 Tomcat과 같은 웹 서버 또는 웹 컨테이너(WAS)가 필요하다.
    • WAR도 JAVA의 jar 옵션(java -jar)을 이용해 생성하는 JAR 파일의 일종이다.

 


Thymeleaf

 

Thymeleaf는 템플릿 엔진이며 서버사이드 자바 템플릿 엔진의 한 종류이다.

JSP와 Thymeleaf의 가장 큰 차이점은 JSP와 달리 Servlet Code로 변환되지 않다는 점

따라서 비즈니스 로직과 분리되어 오로지 View에 집중할 수 있다.

 

기본적으로 모든 View는 src - templates 디렉토리에 있다.

정적인 파일 css, js, 등 static 디렉토리에 위치

 

 

Maven

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
   <version>버전 입력</version>
</dependency>

Gradle

implementation group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf', version: '해당 버전'

 

라이브러리 관련은 Mave Repository 사이트 사용

 

기존 JSP와 큰 차이점은 thymeleaf 문법이 있어서 해당 문법을 알고있어야 사용이 가능하다.

 

ex)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">

<head th:fragment="head(title)">
     <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
    <!-- Custom styles for this template -->
    <link href="starter-templates.css" th:href="@{/starter-templates.css}" rel="stylesheet">

    <title th:text="${title}"></title>
</head>

<body>

<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top" th:fragment="menu(menu)">
    <a class="navbar-brand" href="#">스프링부트 입문</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault"
            aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarsExampleDefault">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item" th:classappend="${menu} == 'home' ? 'active'">
                <a class="nav-link" href="#" th:href="@{/}">메인 <span class="sr-only" th:if="${menu} == 'home'">(current)</span></a>
            </li>
            <li class="nav-item" th:classappend="${menu} == 'board' ? 'active'">
                <a class="nav-link" href="#" th:href="@{/board/list}">게시판 <span class="sr-only" th:if="${menu} == 'board'">(current)</span></a>
            </li>
        </ul>
    </div>
</nav>

 

html 내부에 xmlns:th="http://www.thymeleaf.org"   thymeleaf를 사용하겠다는 선언

JSP에서의 <%@ page import~~~~%> 와 같은 기능

 

 

thymeleaf 문법은 레퍼런스 참조

https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html

 

Tutorial: Using Thymeleaf

1 Introducing Thymeleaf 1.1 What is Thymeleaf? Thymeleaf is a modern server-side Java template engine for both web and standalone environments, capable of processing HTML, XML, JavaScript, CSS and even plain text. The main goal of Thymeleaf is to provide a

www.thymeleaf.org

 

** 타임리프 3.0 부터는 include가 사라졌다고 한다..!!

728x90
반응형

'개발노트 > Spring' 카테고리의 다른 글

[Spring] @PathVariable , @RequestParam 차이  (0) 2021.08.26
[Spring] @Controller, @RestController 차이  (0) 2021.08.26
[Spring] JPA 관련 레퍼런스  (0) 2021.07.05
[Spring] Transaction  (0) 2021.06.21
[Spring] JDBC  (0) 2021.06.18