[Spring Boot] Thymeleaf
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
** 타임리프 3.0 부터는 include가 사라졌다고 한다..!!
'개발노트 > 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 |