IT 프로젝트/블로그 만들기

[Spring Boot] 스프링 부트 프로젝트/블로그 만들기 - index 페이지 작성 - UI 레이아웃 [Bootstrap + Thymeleaf]

happygram 2018. 11. 11. 21:21

Front-End 부분인 User Interface(UI) 를 구성하도록 하겠습니다.

 

Bootstrap 을 이용하여 HTML + CSS 부분을 구성할 것이고, Template Engine 중 하나인 Thymeleaf 를 사용하여, 서버와 통신할 수 있도록 할 것입니다.

Template Engine 중에 Thymeleaf 를 선택한 이유는 Spring Boot 와 잘 어울리는 Engine 으로 소개 되어 있고, 웹 사이트에 많은 참조 자료들이 있습니다.

 

Dependencies

Gradle 설정 파일인 build.gradle 의 dependencies 부분에 기본적으로 필요한 라이브러리들을 설정하도록 합니다.
 
build.gradle
buildscript { 	ext { 		springBootVersion = '2.0.6.RELEASE' 	} 	repositories { 		mavenCentral() 	} 	dependencies { 		classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 	} }  apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management'  group = 'project.blog' version = '0.0.1-SNAPSHOT' sourceCompatibility = 1.8  repositories { 	mavenCentral() }  dependencies {     compile('org.springframework.boot:spring-boot-starter-web')     compile('org.springframework.boot:spring-boot-starter-thymeleaf')     compile('org.springframework.boot:spring-boot-devtools')     testCompile('org.springframework.boot:spring-boot-starter-test') }

dependencies 설명

  • spring-boot-starter-web : Spring MVC를 사용하는 RESTful 애플리케이션을 포함한 웹 구축 용 스타터 구성을 포함하고 있고, Tomcat을 기본 임베디드 컨테이너로 사용
  • spring-boot-starter-thymeleaf : Thymeleaf 뷰를 사용하여 MVC 웹 응용 프로그램을 작성하기 위한 의존성
  • spring-boot-devtools : 빠른 개발을 위해서 소스 수정 시 컴파일 후 즉시 반영되어 변경된 사항을 확인 가능. 핫 스왑 모드 지원
  • spring-boot-starter-test : Spring Boot 어플리케이션을 테스트하기 위한 스타터 구성

참조 : https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/

 

레이아웃 구성

 

sidebar : 메뉴를 담고 있는 영역

Header : 이미지 및 타이틀 표현하는 영역

dynamic content : 메인 내용을 표현하는 영역. 메뉴에서 선택 시 선택한 메뉴에 따라서 변경되는 영역

Footer : 저자, 작성 날짜 등의 내용을 표현하는 영역

 

소스

index.html
 
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <meta name="context-path" th:content="@{/}"/>
    
    <title>Happygram Blog</title>
    
    <!--  Common header -->
    <th:block th:include="common/include-link"></th:block>
    <!-- Custom styles for sidebar -->
    <link th:href="@{/css/sidebar.css}" rel="stylesheet">
</head>
<body>
    <!-- Common script -->
    <th:block th:include="common/include-script"></th:block>
 
    <div class="wrapper">
        <!-- Side Bar -->
        <nav th:replace="common/common-sidebar"></nav>
        <div id="content">
            <!-- Page Header -->
            <header th:replace="common/common-header"></header>
            
            <!-- Main Content -->
            <div th:replace="${template}"></div>
            
            <hr>
            
            <!-- Footer -->
            <footer th:replace="common/common-footer"></footer>
        </div>
    </div>
    
</body>
</html>
cs

 

설명

  • <th:block th:include="common/include-link"></th:block> : 공통으로 사용할 CSS 모음
    상세 내용
  • <!-- Bootstrap core CSS -->
    <link th:href="@{/webjars/bootstrap/4.1.3/css/bootstrap.min.css}" rel="stylesheet">
     
    <!-- Custom common css -->
    <link th:href="@{/css/common.css}" rel="stylesheet">
     
    <!-- Custom styles for this template -->
    <link th:href="@{/css/clean-blog.css}" rel="stylesheet">
    cs
  • <th:block th:include="common/include-script"></th:block> : 공통으로 사용할 Script 모음
    상세 내용
     
  • <!-- Bootstrap core JavaScript -->
    <script th:src="@{/webjars/jquery/3.3.1/js/jquery.min.js}"></script>
    <script th:src="@{/webjars/bootstrap/4.1.3/js/bootstrap.bundle.min.js}"></script>
     
    <!-- Custom scripts for this template -->
    <script th:src="@{/js/clean-blog.min.js}"></script>
     
    <!-- Common Custom script -->
    <script th:src="@{/js/common.js}"></script>
    cs
  • 메인 부분
    • <nav th:replace="common/common-sidebar"></nav> : 사이드바 영역
      상세 내용
      <nav th:fragment="common-sidebar" id="sidebar">
          <div class="sidebar-header">
              <h3><a th:href="@{/}">Category</a></h3>
          </div>
          <ul id="category" class="list-unstyled components">
          </ul>    
      </nav>
      cs
    • <header th:replace="common/common-header"></header> : 헤더 영역
      상세 내용
    • <header th:fragment="common-header" class="masthead" th:style="'background:url(' + @{/image/main-bg.jpg} + ');'">
          <button type="button" id="sidebarCollapse" class="btn btn-default">
              <i id="sidebarCollapseBtn" class="fas fa-angle-left"></i>
          </button>
          <div class="overlay"></div>
          <div class="container">
              <div class="row">
                  <div class="col-lg-8 col-md-10 mx-auto">
                      <div class="site-heading">
                          <h1>Happygram Blog</h1>
                          <span class="subheading">A Blog Theme by Start Bootstrap</span>
                      </div>
                  </div>
              </div>
          </div>
      </header>
      cs
    • <div th:replace="${template}"></div> : 메뉴 선택에 따라서 동적으로 변경되는 영역
    • <footer th:replace="common/common-footer"></footer> : 푸터 영역
      상세 내용
    • <footer th:fragment="common-footer">
          <div class="container">
              <div class="row">
                  <div class="col-lg-8 col-md-10 mx-auto">
                      <ul class="list-inline text-center">
                          <li class="list-inline-item"><a href="#"> <span class="fa-stack fa-lg"> <i
                                      class="fas fa-circle fa-stack-2x"></i> <i class="fab fa-twitter fa-stack-1x fa-inverse"></i>
                              </span>
                          </a></li>
                          <li class="list-inline-item"><a href="#"> <span class="fa-stack fa-lg"> <i
                                      class="fas fa-circle fa-stack-2x"></i> <i class="fab fa-facebook-f fa-stack-1x fa-inverse"></i>
                              </span>
                          </a></li>
                          <li class="list-inline-item"><a href="#"> <span class="fa-stack fa-lg"> <i
                                      class="fas fa-circle fa-stack-2x"></i> <i class="fab fa-github fa-stack-1x fa-inverse"></i>
                              </span>
                          </a></li>
                      </ul>
                      <p class="copyright text-muted">Copyright &copy; Happygram Blog 2018</p>
                  </div>
              </div>
          </div>
      </footer>
      cs

결과

 

 

 

결론

index.html 에는 전체적인 레이아웃이 정의가 되어있고, 공통적으로 사용하는 라이브러리, CSS 가 정의가 되어 있습니다.
공통적으로 사용될 요소들이 필요하신 경우 위의 요소들처럼 body 부분에 기술하시고, 해당 파일을 구현하시면 됩니다.

 

 

 

참조 라이브러리 사이트 목록 - 도움에 감사를 드립니다.

https://jquery.com/

https://getbootstrap.com/

https://startbootstrap.com/template-overviews/clean-blog/

https://bootstrapious.com/p/bootstrap-sidebar