Bootstrap과 Showdown을 이용한 초간단 CMS

문서 공유가 필요한 경우 Google Docs 나 Dropbox, Microsoft OneDrive 같은 클라우드 파일 서비스를 이용할 수 있다. 누구나 접근 가능한 문서이면서, 웹사이트 형식으로 운영을 할 때는 WordPress 나 Joomla, Ghost 같은 설치형 블로깅 CMS나, MediaWiki 같은 위키 형태의 CMS도 고려해볼 수 있다. 최근에는 파일 기반의 정적 사이트 생성기(static site generator)인 Jekyll 이나 Hugo 등도 많이 이용되고 있다. 프로젝트 관리 시스템(PMS)을 이용하고 있다면, PMS 에서 제공하는 문서 도구를 이용할 수 있다.

그런데, 상황에 따라 보안 상의 이유로 Dropbox 같은 외부 파일 공유 서비스를 이용할 수 없을 수 있다. 혹은 설치형 CMS 또는 Static site generator 를 이용하기 위해 서버에 PHP 나 Python 등 프로그래밍 언어를 설치하고 사용하는 것이 어렵거나, 문서 공유만을 위해 CMS, PMS 를 사용하는 것이 부담스러울 수 있다.

본 문서에서는 웹UI 프레임웍으로 많이 사용되고 있는 Bootstrap 과 Markdown 을 HTML 로 변환해주는 도구인 Showdown 을 이용해 간단한 CMS를 제작할 수 있는 방법에 대해 소개한다.

작동 원리

작동 원리는 매우 간단하다. 먼저 Bootstrap으로 웹문서 HTML 템플릿을 생성한다. 그 다음, 마크다운 포맷의 문서 파일을 작성한다. AJAX로 마크다운 문서를 로딩하고, Showdown을 통해 HTML로 변환한 다음, 문서의 특정 element에 삽입한다.

Bootstrap 설치 및 템플릿 작성

Bootstrap 은 CDN으로 제공되는 CSS 와 Javascript 를 삽입한다. jQuery 도 추가한다.

<!-- Bootstrap core CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
    integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

<div class="container-fluid">
  <div class="row">
	<nav class="col-md-2 d-none d-md-block bg-light sidebar">
	  <div class="sidebar-sticky pt-2 navigation">  <!-- 네비게이션 영역 -->
	  </div>
	</nav>

	<main role="main" class="col-md-9 ml-sm-auto col-lg-10 px-4">
		<div class="row">
			<div class="col-md-9 main-content">  <!-- 본문 영역 -->
			</div>
		</div>
	</main>
  </div>
</div>

<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
    integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
    integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>

Showdown 설치

Bootstrap은 트위터에서 오픈소스로 개발한 웹UI 프레임웍이다. 반응형웹과 다양한 UI컴포넌트들을 제공하며, 쉽게 사용할 수 있는 장점이 있다. Showdown은 Javascript로 작성된 마크다운(markdown) 문서를 HTML 문서로 변환해주는 도구이다. Javascript로 작성되었기 때문에 웹 브라우저에서 실행할 수 있으며, NodeJS를 통해 서버에서도 실행이 가능하다.

Showdown은 CDN으로 제공되는 스크립트를 웹페이지에 삽입한다. 그리고, 마크다운을 HTML로 변환하기 위해 Converter 객체를 생성한다. 본 문서에서는 table 마크다운을 사용하기 위해 tables 옵션을 추가하였다.

<script src="https://cdnjs.cloudflare.com/ajax/libs/showdown/1.8.6/showdown.min.js" 
    integrity="sha256-dwhppIrxD8qC6lNulndZgtIm4XBU9zoMd9OUoXzIDAE=" crossorigin="anonymous"></script>
<script type="text/javascript">
var converter = new showdown.Converter({
    tables: true
});
</script>

Navagation 로딩

템플릿 HTML 파일을 브라우저에서 로딩한 다음 네비게이션 파일을 로딩하여 표시한다. 네비게이션 파일 역시 마크다운으로 작성한다. 아래는 네비게이션 마크다운 문서 예이다.

###### Simple Markdown CMS

[Overview](overview.md)
[Bootstrap Template](bootstrap.md)
[Showdown](showdown.md)
[네비게이션](navigation.md)
[본문](content.md)

---

###### Examples

[REST API Document](rest-api.md)
[Markdown Example](markdown-example.md)

위 문서를 Showdown으로 HTML로 변환하고, 사이드바 영역에 추가한다.

var html = converter.makeHtml(md);
$('.sidebar').html(html);

본문

네이게이션 클릭 시 링크 URL을 jQuery의 get 함수로 로딩하고, Showdown 으로 변환한 뒤 본문 영역에 추가한다.

$('.sidebar').on('click', '.nav-link', function() {
    $.get($(this).attr('href'), function(md) {
        var html = converter.makeHtml(md);
        $('.main-content').html(html);
    });

    return false;
});

Bootstrap 의 스타일을 적용하기 위해 변환된 HTML 태그에 Bootstrap 의 class 를 추가해준다.

var classmap = new Map([
    // ['<태그>', '<부트스트랩 클래스>'],
    ['h1', 'h2 py-3 mb-3 border-bottom'],
    ['table', 'table table-striped table-bordered'],
    ['pre', 'alert alert-secondary']
]);

$('.sidebar').on('click', '.nav-link', function() {
    $.get($(this).attr('href'), function(md) {
        var html = converter.makeHtml(md);
        classmap.forEach(function(value, key) {
            html = html.replace(
                new RegExp(`<${key}(.*)>`, 'g'), `<${key} class="${value}" $1>`);
        })
        $('.main-content').html(html);
    });

    return false;
});

결론

문서 URL 이나 SEO(Search Engine Optimization) 측면에서 좀 더 보완할 사항이 있다. 하지만, HTML, CSS, Javascript 와 마크다운 파일로 이루어진 CMS 이므로, AWS S3 같은 파일 스토리지 서비스를 통해서도 CMS 를 운영할 수 있는 장점이 있다.