- 홈 화면과 레이아웃
- 회원 등록
- 회원 목록 조회
- 상품 등록
- 상품 목록
- 상품 수정
- 변경 감지와 병합(merge)
- 상품 주문
- 주문 목록 검색, 취소
view template
: JSP과 같은 템플릿 엔진의 일종
서버 사이드 HTML 렌더링(SSR)
HTML
을 동적으로 렌더링하는 용더로 사용됨controller
가 전달하는 데이터를 이용하여 동적으로 화면을 구성함th:속성
을 이용하여 동적인 view를 제공해줌Natural templates
스프링 통합 지원
HTML 태그에 th:*
속성을 지정하는 방식으로 동작
th:*
로 속성을 적용하면 기존 HTML 속성을 대체하고 기존 속성이 없으면 새로 만듦package jpabook.jpashop.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@Slf4j
public class HomeController {
@RequestMapping("/")
public String home(){
log.info("home controller");
return "home";
}
}
return "home"
home.html
찾아가서 그 타임 리프 파일을 찾아가게 됨import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger log = LoggerFactory.getLogger(getClass());
lombok
의 @Slf4j
annotation을 사용하여 로그를 남길 수 있음spring:
thymeleaf:
prefix: classpath:/templates/
suffix: .html
resources:templates/ +{ViewName}+ .html
resources:templates/home.html
home
)과 스프링부트 설정 prefix
, suffix
정보를 사용해서 랜더링할 뷰(html)
을 찾음resources/templates/hello.html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header">
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div class="container">
<div th:replace="fragments/bodyHeader :: bodyHeader" />
<div class="jumbotron">
<h1>HELLO SHOP</h1>
<p class="lead">회원 기능</p>
<p>
<a class="btn btn-lg btn-secondary" href="/members/new">회원 가입</a>
<a class="btn btn-lg btn-secondary" href="/members">회원 목록</a>
</p>
<p class="lead">상품 기능</p>
<p>
<a class="btn btn-lg btn-dark" href="/items/new">상품 등록</a>
<a class="btn btn-lg btn-dark" href="/items">상품 목록</a>
</p>
<p class="lead">주문 기능</p>
<p>
<a class="btn btn-lg btn-info" href="/order">상품 주문</a>
<a class="btn btn-lg btn-info" href="/orders">주문 내역</a>
</p>
</div>
<div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>
<head th:replace="fragments/header :: header">
<div th:replace="fragments/bodyHeader :: bodyHeader" />
<div th:replace="fragments/footer :: footer" />
자주 사용하는 부분들을 header, bodyHeader, footer로 나눠서 import를 해서 사용
hello.html 파일이 위치한 templates 하위에 fragments 디렉터리를 새로 생성한 후 그 하위 파일로 header, bodyHeader, footer 생성
home 실행 테스트
home.html
<head th:replace="fragments/header :: header">
fragements/header.html
<head th:fragment="header">
th:replace
로 지정한 위치 fragments/header
에서 th:fragment="header"
를 찾아서 들고와서 home에 replace 해줌replace
되어서 화면에 뿌려짐Bootstrap
사용 : https://getbootstrap.com/docs/5.3/getting-started/download/
resources/static
아래에 옮겨 놓은 후 project를 한 번 빌드해준 뒤에 application을 실행해줘야 함
멋지네요