프로젝트

[Spring Boot & JPA 프로젝트] 머스테치 Mustache

sian han 2022. 8. 2. 20:33

학원에서 배운 서버템플릿엔진 : JSP

독학중이었던 템플릿엔진 : tymeleaf

사용결정된 템플릿엔진 : 머스테치

 

학원에서는 JSP 사용하는 방법을 배웠었고,

학원 종료 후 시작할 개인 프로젝트 [뜨개장터] 에서는 타임리프를 사용할 계획으로 공부중에 있었다

(실제로 타임리프로 index 정도는 만들어놓은 상태이다)

스프링부트 책을 읽고 머스테치를 사용해보기로 최종결정했다

 

결정사유는 다음과 같다 🔽

JSP : 스프링부트에서 권장하지않는 템플릿엔진임

Thymeleaf : 문법이 어렵다고 함

Mustache : 문법이 다른 엔진들에 비해 심플함

                   로직코드를 사용할 수 없어 view 와 서버의 역할이 명확하게 분리됨

 

Controller 에서 URL 매핑을 할 때 앞의 경로와 뒤의 파일 확정자는 자동으로 지정된다

앞 경로 : src/main/resources/templates

뒤 파일 확장자 : .mustache

 

 

근데 !!

thymeleaf 에서 mustache 로 변경하는 도중 org.thymeleaf.exceptions.TemplateInputException 에러가 자꾸 발생한다 .. ㅠ

 

▶ 템플릿엔진 thymeleaf => mustache 변경 시 TemplateInputException 에러

 

 

 

해결

1. build.gradle 에서 thymeleaf 관련 코드 삭제

2. 설정 > 플러그인에서 thymeleaf 비활성화

 

아놔 저 이것때문에 몇시간 날렸게요 .... 3시간ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

안웃김

 

 

▶ 템플릿엔진 mustache 사용 시 한글깨짐

build.gradle 에서 스프링부트 버전을 2.6.7 로 다운그레이드

 

 


※ 머스테치 include

 

 

 

▷ 폴더구조

 

 

 

▶ top

<!doctype html>
<html lang="ko">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="description" content="Ogani Template"/>
    <meta name="keywords" content="Ogani, unica, creative, html"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>

    <title>index</title>

    <!-- Google Font -->
    <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@200;300;400;600;900&display=swap" rel="stylesheet">

    <!-- Css Styles -->
    <link rel="stylesheet" href="/css/bootstrap.min.css" type="text/css">
    <link rel="stylesheet" href="/css/jquery-ui.min.css" type="text/css">
    <link rel="stylesheet" href="/css/style.css" type="text/css">
    <link rel="stylesheet" href="/css/main.css" type="text/css">
</head>
<body>

    <div class="container">
        <div class="row">
            <div class="col-lg-3">
                <div class="header__logo">
                    <a href="/knitmarket"><img src="/img/LOGO.png" alt="로고사진" id="logo"></a>
                </div>
            </div>
            <div class="col-lg-6">
                <nav class="header__menu">
                    <ul>
                        <li class="active"><a href="#">Home</a></li>
                        <li><a href="#">Shop</a></li>
                        <li><a href="#">Pages</a>
                            <ul class="header__menu__dropdown">
                                <li><a href="#">테스트</a></li>
                                <li><a href="#">Shoping Cart</a></li>
                                <li><a href="#">Check Out</a></li>
                                <li><a href="#">Blog Details</a></li>
                            </ul>
                        </li>
                        <li><a href="#">Blog</a></li>
                        <li><a href="#">Contact</a></li>
                    </ul>
                </nav>
            </div>
            <div class="col-lg-3">
                <div class="header__cart">
                    <ul>
                        <li><a href="#"><i class="fa fa-heart"></i> <span>1</span></a></li>
                        <li><a href="#"><i class="fa fa-shopping-bag"></i> <span>3</span></a></li>
                    </ul>
                </div>
            </div>
        </div>
        <div class="humberger__open">
            <i class="fa fa-bars"></i>
        </div>
    </div>
</header>

 

 

▶ bottom

<div class="container">
    <div class="row">
        <div class="col-lg-3 col-md-6 col-sm-6">
            <div class="footer__about">
                <div class="footer__about__logo">
                    <a href=""><img src="" alt=""></a>
                </div>
                <ul>
                    <li>Address: 60-49 Road 11378 New York</li>
                    <li>Phone: +65 11.188.888</li>
                    <li>Email: hello@colorlib.com</li>
                </ul>
            </div>
        </div>
    </div>

</div>

<script src="https://kit.fontawesome.com/d4af3bb512.js" crossorigin="anonymous"></script>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/jquery.nice-select.min.js"></script>
<script src="js/jquery-ui.min.js"></script>
<script src="js/jquery.slicknav.js"></script>
<script src="js/mixitup.min.js"></script>
<script src="js/owl.carousel.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>

 

 

▶ index

{{>layout/top}}

<!--페이지소스 시작-->
<section class="hero">
    <div class="container">
        <div class="row">
            <div class="col-lg-3">
                <div class="hero__categories">
                    <div class="hero__categories__all">
                        <i class="fa fa-bars"></i>
                        <span>All departments</span>
                    </div>
                    <ul>
                        <li><a href="#">테스트</a></li>
                        <li><a href="#">Vegetables</a></li>
                        <li><a href="#">Fruit & Nut Gifts</a></li>
                        <li><a href="#">Fresh Berries</a></li>
                        <li><a href="#">Ocean Foods</a></li>
                        <li><a href="#">Butter & Eggs</a></li>
                        <li><a href="#">Fastfood</a></li>
                        <li><a href="#">Fresh Onion</a></li>
                        <li><a href="#">Papayaya & Crisps</a></li>
                        <li><a href="#">Oatmeal</a></li>
                        <li><a href="#">Fresh Bananas</a></li>
                    </ul>
                </div>
            </div>

            <div class ="hotItemDiv">




            </div>
        </div>
    </div>
</section>
<!--페이지소스 끝-->


{{>layout/bottom}}