싱글 페이지 애플리케이션(SPA, Sigle Page Applications)을 만들 때 필수로 필요한 것이 자바스크립트로 구현된 라우터(router)입니다.
자바스크립트로 한 개의 웹페이지를 화면 바인딩을 제어하여 마치 웹페이지가 한 개의 응용프로그램처럼 동작하게 하려면 페이지를 이동시키지 않고 주소를 갱신하여야 합니다.
이런 기능을 구현하는 것이 라우터입니다.
라우터는 크게 해시(#) 라우터와 브라우저 라우터로 구분할 수 있습니다.
자바스크립트로 구현된 라우터는 많습니다.
저는 그중 해시 라우터인 'Sammy.js'를 사용하여 간단하게 SPA를 구현해 보겠습니다.
'index.html'파일의 내용을 아래와 같이 작성합니다.
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <!-- jquery 3.4.1 --> <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script> <!-- sammyjs 0.7.6 --> <script src="lib/sammyjs/0.7.6/sammy.js"></script> <!-- 라우터 처리용 어플리케이션 --> <script src="app.js"></script> </head> <body> <a href="#/">홈</a><br /> <br /> <!-- 라우트 내용이 바인딩되는 div --> <div id="divMain"> </div> </body> </html>
'Sammy.js'는 홈페이지에서 받을 수 있습니다.
(참고 : sammyjs.org - download, GitHub - sammy )
'sammyjs'를 사용하려면 라우터용 애플리케이션을 생성해야 합니다.
'app.js' 파일을 만들고 아래와 같이 코드를 넣습니다.
// 라우트 어플리케이션 생성 var app = Sammy(function () { //라우트 설정**** this.get("#/", function () { //인덱스 페이지 $("#divMain").load("/pages/index.html"); }); this.get("#/test1", function () { $("#divMain").load("/pages/Test1.html"); }); this.get("#/test2", function () { $("#divMain").load("/pages/Test2.html"); }); this.get("#/param/:id", function () { //파라미터 받기 var nID = this.params['id']; $("#divMain").html("넘어온 파라미터 id : " + nID); }); //404 this.notFound = function (verb, path) { //인덱스 페이지 //$("#divMain").load("/pages/index.html"); $("#divMain").html("404, 페이지 못찾음"); }; }); //어플리케이션 시작 $(function () { app.run() });
'RESTFull' 방식을 지원한다고 하지만 단순 라우터로 사용할 거면 'get'만 사용해도 됩니다.
다양한 기능들이 있지만 지금 필요한 건 라우트 기능뿐이죠.
애플리케이션을 생성할 때 'this.get()'로 넘어온 'URL'에 매칭되는 경로(path)를 미리 작성해야 합니다.
경로를 통해 원하는 파라미터를 받으려면 ':(콜론)'을 이용합니다.
예> this.get("#/param/:id", function () {
경로가 없는 경우를 처리하려면 'this.notFound' 함수를 재정의하면 됩니다.
이제 웹서버를 세팅하고 'index.html'을 불러오거나 디폴트 페이지를 설정해서 'var app'를 로드한 '.html'페이지로 이동합니다.
프로젝트 소스 : GitHub - dang-gun/HtmlJavascriptSamples/SammyJs_Test
SPA를 구현하기 위한 라우터는 오픈소스도 많아서 여차하면 자기가 직접 만들어도 됩니다.
'Sammyjs'도 가벼운 축에 속하지만 더 가벼운 라이브러리도 있으니 필요하면 찾아보아요~