개발노트

JSP + Mustache.js + Ajax로 동적으로 데이터 렌더링하기

SoonNote 2025. 4. 15. 17:19
반응형

🔰 Mustache.js란?

Mustache.js는 HTML에 데이터를 바인딩해주는 가볍고 심플한 템플릿 엔진이다.
이름 그대로 {{변수}} 형태의 중괄호 문법을 사용해서 데이터를 템플릿 안에 삽입할 수 있다.

Mustache의 특징은 다음과 같다:

  • {{변수}}, {{#반복}}, {{/반복}} 같은 간단한 문법
  • JavaScript 코드가 템플릿에 섞이지 않는 논리 없는 템플릿
  • HTML 템플릿을 미리 만들어두고, Ajax로 받아온 데이터를 바로 렌더링 가능
  • React나 Vue처럼 무겁지 않아서 JSP 기반 프로젝트에 가볍게 붙이기 좋음

✅ 목표

  • JSP 화면에서 Ajax로 서버 데이터를 요청하고
  • Mustache.js로 데이터를 템플릿에 바인딩해서
  • HTML에 출력하는 전체 흐름 구성

📁 파일 구조

resources/
├── js/
│   ├── list.js                ← Ajax + Mustache 렌더링 스크립트
webapp/
├── list.jsp                   ← JSP 화면
├── api/data/list.json        ← JSON 응답 예시 (또는 Controller)

 

✅ 1. list.jsp – 템플릿, 컨테이너, JS 연결

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="utf-8" %>
<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>Mustache Ajax 예제</title>
  <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/mustache@4.2.0/mustache.min.js"></script>
  <script src="${pageContext.request.contextPath}/resources/js/list.js"></script>
</head>
<body>

  <h2>📋 게시글 목록</h2>
  <div id="list-container"></div>

  <!-- Mustache 템플릿 -->
  <script id="list-template" type="x-tmpl-mustache">
    <ul>
      {{#posts}}
        <li>
          <strong>{{title}}</strong> - {{author}} ({{date}})
        </li>
      {{/posts}}

      {{^posts}}
        <li>데이터가 없습니다.</li>
      {{/posts}}
    </ul>
  </script>

</body>
</html>

✅ 2. list.js – Ajax 요청 + Mustache 렌더링

$(function(){
  $.ajax({
    url: "/api/data/list.json", // 실제는 Controller URL로 교체
    method: "GET",
    dataType: "json",
    success: function(data) {
      const template = $('#list-template').html();
      const rendered = Mustache.render(template, data);
      $('#list-container').html(rendered);
    },
    error: function() {
      alert("데이터 요청 실패");
    }
  });
});

3. JSON 예시 (list.json)

{
  "posts": [
    { "title": "공지사항 1", "author": "관리자", "date": "2024-04-10" },
    { "title": "새로운 업데이트", "author": "운영자", "date": "2024-04-11" },
    { "title": "FAQ 정리", "author": "홍길동", "date": "2024-04-12" }
  ]
}

 

Spring Controller 예시

@GetMapping("/api/data/list.json")
@ResponseBody
public Map<String, Object> getPostList() {
    List<Map<String, String>> posts = new ArrayList<>();
    posts.add(Map.of("title", "공지사항 1", "author", "관리자", "date", "2024-04-10"));
    posts.add(Map.of("title", "새로운 업데이트", "author", "운영자", "date", "2024-04-11"));
    posts.add(Map.of("title", "FAQ 정리", "author", "홍길동", "date", "2024-04-12"));

    return Map.of("posts", posts);
}

✅ 결과 화면

📋 게시글 목록

- 공지사항 1 - 관리자 (2024-04-10)
- 새로운 업데이트 - 운영자 (2024-04-11)
- FAQ 정리 - 홍길동 (2024-04-12)

✅ Mustache 흐름 요약

항목설명

템플릿 작성 <script id="template">로 HTML 구조 작성
데이터 요청 jQuery Ajax 사용
렌더링 처리 Mustache.render(template, data)
결과 출력 .html()로 지정 영역에 삽입

💡 어디에 쓰면 좋을까

  • 서버에서 받아온 리스트를 화면에 표시할 때
  • 뷰와 데이터를 분리해서 구성하고 싶을 때
  • Vue나 React는 무거워서 간단하게 구현하고 싶을 때

📌 확장할 수 있는 기능

  • 검색/필터 조건 추가
  • 로딩 애니메이션 표시
  • 페이지네이션 처리
  • 이벤트 바인딩(수정, 삭제 버튼 등)
반응형