springboot

thymeleaf로 레이아웃 관리(fragment)

전주천둥새 2023. 5. 15. 16:13

1. thymeleaf - fragment

- fragments를 이용해서 레이아웃을 분리하고 확장 라이브러리를 이용하여 하나의 템플릿을 기준으로 끼워넣는 방식의 페이지 처리가 가능 >>> 모든 페이지마다 th:insert가 사용될 필요가 없음

>>> 반드시 dependency 태그 안쪽에 위치해야한다. 버전을 생략할 시 자동으로 최신버전으로 다운로드해준다.

- 프로젝트 내에 fragment폴더를 생성하여 각 부분의 html 파일 작성

- 분리된 fragments 파일을 하나로 합칠 layout 폴더 및 파일 생성

- head부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
	<head th:fragment="headFragment">
		<meta charset="UTF-8">
		<title>ksmart43</title>
		
		<!-- thymeleaf 링크 표현 구문 @{} -->
		<link rel="stylesheet" type="text/css" th:href="@{/css/main.css}">
		
		<!-- 사용자 정의 css -->
		<th:block layout:fragment="customCss"></th:block>

		<!-- 사용자 정의 js -->
		<th:block layout:fragment="customJs"></th:block>
	</head>
</html>

>>> 확장라이브러리를 사용하기 때문에 html 부분에

xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout" 태그를 추가로 사용한다

 

- header 부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
	<div id="header" th:fragment="headerFragment">
		head.html<br>
		상단메뉴<br>
		<a href="#">01회원가입</a>
		<a href="#">02회원목록</a>
		<a href="#">03상품등록</a>
		<a href="#">04상품목록</a>
	</div>
	
</html>

- leftmenu 부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
	<div id="leftcolumn" th:fragment="leftmenuFragment">
		left.html <br><br>
		왼쪽메뉴
	</div>
</html>

- footer 부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
	<div id="footer" th:fragment="footerFragment">
		footer.html<br>
		하단메뉴<br>
		063-717-1008-ksmart.or.kr 한국스마트정보교육원
		
	</div>
	
</html>

- contents 부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
	  layout:decorate="~{layout/default}">
	
	<!-- 사용자 정의 css -->
	<th:block layout:fragment="customCss">
	
	</th:block>

	<!-- 사용자 정의 js -->
	<th:block layout:fragment="customJs">
		<script src="http://code.jquery.com/jquery-latest.min.js"></script>
	</th:block>
	
	<!-- 사용자 정의 contents -->
	<th:block layout:fragment="customContents">
		<!-- $ : 모델의 값을 바인딩하는 구문 -->
		<!-- ${key} : 태그의 속성에서 값을 바인딩하는 구문 -->
		<h1 th:text="${title}"></h1>
		<!-- [[${key}]] : 인라인 스타일 -->
		[[${title}]]
		[[${member}]]
	</th:block>
</body>
</html>

 

- 통합 default 부분 작성

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head th:replace="fragments/head :: headFragment"></head>
<body>
	<div id="wrapper">
		<div th:replace="fragments/header :: headerFragment"></div>
		<div th:replace="fragments/leftmenu :: leftmenuFragment"></div>
		<div id="rightcolumn">
			<!-- 사용자 정의 contents -->
			<th:block layout:fragment="customContents"></th:block>
		</div>
		<div th:replace="fragments/footer :: footerFragment"></div>
		
	</div>
</body>
</html>

- 확인