본문 바로가기
Spring

Spring 타임리프 이용 기본

by code2772 2022. 12. 19.

[ 목차 ]

    728x90
    반응형

    ✔ 템플릿 엔진

    템플릿 엔진
    - 지정된 템플릿 양식과 데이터가 합쳐져 HTML 문서를 출력하는 소프트웨어
    - 서버 템플릿 엔진
        - velocity : 과거 스프링에서 많이 사용하던 엔진. 현재 권장하지 않음
        - freemarker : 템플릿 엔진으로 많은 기능을 지원. Apache 템플릿 엔진으로
        템플릿 및 변경 데이터를 기반으로 텍스트, 메일, 파일등을 생성하는 Java 라이브러리를 제공
        - thymeleaf : 스프링 부트에서 적극 지원하고 있는 엔진. 문법이 쉽지 않음. react, vue의 경험이
        있다면 최적의 템플릿 엔진
        - mustaches : 문법이 다른 템플릿 엔진보다 쉽다. 비즈니스 로직을 사용할 수 없음. view의 역할과
        서버의 역할이 명확하게 구분됨
    

     

    타임리프(Thymeleaf)

     타임리프는 컨트롤러가 전달하는 데이터를 이용해 동적으로 화면을 만들어주는 역할을 하는 뷰 템플릿 엔진이다. 타임리프가 갖는 대표적인  특징은 다음과 같다.

     

    ✔ 서버상 동작하지 않아도 HTML 파일 내용을 바로 확인 가능

    ✔ 순수 HTML 구조를 유지

     

    project 생성 시 Template Engines에서 Thymeleaf 선택한다.

     

    resources에서 static에는 css, 이미지 등을 생성한다.

    templates는 html을 생상한다.

     

     

    ✔ Index 메인페이지 

    <html lang="ko"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:th="http://www.thymeleaf.org/">
    
    <!-- cafe_head.html -->
    
        <div th:replace="cafe_head :: head"></div>"
    
    <!-- cafe_head.html END-->
    
    <body>
        <div id="container">
            <header>
                <nav>
                    <ul>
                        <li><a href="#intro">카페소개</a></li>
                        <li><a href="#map">오시는길</a></li>
                        <li><a href="#choice">이달의 추천</a></li>
                    </ul>
                </nav>
            </header>
            <section id="intro">
                <div class="page-title">
                    <h1>카페소개</h1>
                </div>
                <div class="content">
                    <div class="photo"><img src="/이미지/coffee.jpg" alt="커피"></div>
                    <div class="text">
                        <p>영업 시간 : 오전 9시 ~ 밤 10시</p>
                        <p>휴무 : 매주 수요일 <i><small>(수요일이 공휴일인 경우 수요일 영업,
                            다음날 휴무)</small></i></p>
                    </div>
                </div>
            </section>
            <section id="map">
                <div class="page-title">
                    <h1>오시는 길</h1>
                </div>
                <div class="content">
                <div class="photo"><img src="/이미지/map.jpg" alt="지도"></div>
                    <div class="text">
                        <p>서귀포시 안덕면 사계리 000-000</p>
                        <p>제주 올레 10코스 산방산 근처</p>
                    </div>
                </div>
            </section>
            <section id="choice">
                <div class="page-title">
                    <h1>이달의 추천</h1>
                </div>
                <div class="content">
                <div class="photo"><img src="/이미지/ice.jpg" alt="추천"></div>
                    <div class="text">
                        <p>핸드드립 아이스 커피</p>
                        <ol>
                            <li>1인분 기준으로 서버에 각 얼음 5조각(한조각은 20cc) 넣고 추출을 시작한다.</li>
                            <li>평상시 보다 원두의 양은 2배정도(20g)와 추출액은 얼음 포함해서 200cc까지 내린다.</li>
                            <li>아이스 잔에 얼음 6~7개 섞어서 시원하게 마신다.</li>
                        </ol>
                    </div>
                </div>
            </section>
            <!-- cafe_head.html -->
    
            <div th:replace="cafe_footer :: footer"></div>"
    
            <!-- cafe_head.html END-->
        </div>
    </body>
    </html>

    th:repalce ="cafe_footer :: footer는 replace(반복 부분을 대체) 이며 cafe_footer는 파일경로 :: footer는 파일 경로에 있는 반복 부분의 명칭을 의미한다.

     

     

    ✔ Head 부분

    <html lang="ko"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:th="http://www.thymeleaf.org/">
    
    <head th:fragment="head">
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <link rel="stylesheet" href="/css/cafe.css">
      <title>카페소개</title>
    </head>

     

    ✔ Footer 부분

    <html lang="ko"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:th="http://www.thymeleaf.org/">
    
    
    <footer th:fragment = "footer"><p>My time with Coffee</p></footer>

    자주 반복적으로 사용하는 부분을 따로 분리한다.

    th:fragment = footer 는 fragment 즉 파편(반복 부분) 을 의미하고 이 명칭을 footer로 하겠다는 의미이다

    나머지 html 부분은 타임리플르 사용하기 위한 부분이다.

     

    ✔ PageController 부분

    package com.koreait.day7.controller.page;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller // 일반 컨트롤러 생성 경우
    @RequestMapping("pages") // http://localhost:8888/pages
    public class PageController {
    
        @RequestMapping(path="/cafe") //http://localhost:8888/pages/cafe
        public ModelAndView cafe(){
            return new ModelAndView("/cafe_index.html");
        }
    }
    

     

    ✔ 결과화면

    반응형

    'Spring' 카테고리의 다른 글

    Spring Project Board(게시판) 1  (0) 2023.01.02
    Spring 유용한 Setting, 사이트  (0) 2022.12.29
    Spring Main Page Project  (0) 2022.12.18
    Spring Join  (0) 2022.12.13
    Spring (리스너, 연관 관계 메핑, 어노테이션)  (0) 2022.12.13