정정홍

그누보드7 템플릿에 HTML 문법을 도입해 보려는데 의견 구합니다.

· 2026-07-15 (수) 12:14:11 · 527 · 16

안녕하세요.
 

그누보드7 템플릿 시스템의 JSON 레이아웃 문법이 어렵고 난해하다는 피드백을 많이 받았습니다. 그래서 JSON 레이아웃 엔진은 지금 그대로 유지하면서, HTML 과 유사한 문법을 추가로 제공하는 방안을 검토하고 있습니다. 방향을 확정하기 전에 여러분의 의견을 구하고자 합니다.
 

같은 화면(환영 카드)을 두 문법으로 작성한 예시입니다.


현행 JSON (79줄):
{
  "meta": {
    "is_partial": true,
    "description": "홈 환영 카드 - 로그인 시 사용자명 표시"
  },
  "type": "basic",
  "name": "Div",
  "props": {
    "className": "col-span-2 bg-gradient-to-br from-blue-600 to-purple-700 rounded-xl px-6 py-10 text-white"
  },
  "children": [
    {
      "type": "basic",
      "name": "Div",
      "props": { "className": "flex items-center gap-2 mb-2" },
      "children": [
        { "type": "basic", "name": "Icon", "props": { "name": "sparkles", "className": "w-5 h-5" } },
        { "type": "basic", "name": "Span", "props": { "className": "text-sm font-medium opacity-90" }, "text": "Welcome" }
      ]
    },
    {
      "type": "basic",
      "name": "H2",
      "props": { "className": "text-xl font-bold mb-2" },
      "text": "{{_global.settings?.general?.site_name ?? 'Site'}}$t:home.welcome_suffix"
    },
    {
      "type": "basic",
      "name": "P",
      "props": { "className": "text-sm opacity-90 mb-4" },
      "text": "{{_global.settings?.general?.site_description ?? '$t:home.welcome_description'}}"
    },
    {
      "type": "basic",
      "name": "Div",
      "props": { "className": "flex gap-3" },
      "children": [
        {
          "id": "register_button",
          "type": "basic",
          "name": "Button",
          "if": "{{!_global.currentUser?.uuid}}",
          "props": {
            "className": "px-4 py-2 bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 rounded-lg font-medium text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors flex items-center gap-1 cursor-pointer"
          },
          "actions": [{ "type": "click", "handler": "navigate", "params": { "path": "/register" } }],
          "children": [
            { "type": "basic", "name": "Span", "text": "$t:home.get_started" },
            { "type": "basic", "name": "Icon", "props": { "name": "arrow-right", "className": "w-4 h-4" } }
          ]
        },
        {
          "id": "dashboard_button",
          "type": "basic",
          "name": "Button",
          "if": "{{_global.currentUser?.uuid}}",
          "props": {
            "className": "px-4 py-2 bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 rounded-lg font-medium text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors flex items-center gap-1 cursor-pointer"
          },
          "actions": [{ "type": "click", "handler": "navigate", "params": { "path": "/mypage" } }],
          "children": [
            { "type": "basic", "name": "Span", "text": "$t:home.go_to_mypage" },
            { "type": "basic", "name": "Icon", "props": { "name": "arrow-right", "className": "w-4 h-4" } }
          ]
        },
        {
          "type": "basic",
          "name": "Button",
          "props": {
            "className": "px-4 py-2 bg-white/20 text-white rounded-lg font-medium text-sm hover:bg-white/30 transition-colors cursor-pointer"
          },
          "actions": [{ "type": "click", "handler": "navigate", "params": { "path": "/page/about" } }],
          "text": "$t:home.learn_more"
        }
      ]
    }
  ]
}
 

동일 내용의 HTML 문법 (28줄, 그누보드7 전용):
<fragment description="홈 환영 카드 - 로그인 시 사용자명 표시">
  <div class="col-span-2 bg-gradient-to-br from-blue-600 to-purple-700 rounded-xl px-6 py-10 text-white">
    <div class="flex items-center gap-2 mb-2">
      <icon name="sparkles" class="w-5 h-5"/>
      <span class="text-sm font-medium opacity-90">Welcome</span>
    </div>
    <h2 class="text-xl font-bold mb-2">{{_global.settings?.general?.site_name ?? 'Site'}}$t:home.welcome_suffix</h2>
    <p class="text-sm opacity-90 mb-4">{{_global.settings?.general?.site_description ?? '$t:home.welcome_description'}}</p>

    <div class="flex gap-3">
      <button ref="register_button" if="!_global.currentUser?.uuid"
              class="px-4 py-2 bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 rounded-lg font-medium text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors flex items-center gap-1 cursor-pointer">
        <on click><navigate path="/register"/></on>
        <span>$t:home.get_started</span>
        <icon name="arrow-right" class="w-4 h-4"/>
      </button>
      <button ref="dashboard_button" if="_global.currentUser?.uuid"
              class="px-4 py-2 bg-white dark:bg-gray-800 text-blue-600 dark:text-blue-400 rounded-lg font-medium text-sm hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors flex items-center gap-1 cursor-pointer">
        <on click><navigate path="/mypage"/></on>
        <span>$t:home.go_to_mypage</span>
        <icon name="arrow-right" class="w-4 h-4"/>
      </button>
      <button class="px-4 py-2 bg-white/20 text-white rounded-lg font-medium text-sm hover:bg-white/30 transition-colors cursor-pointer">
        <on click><navigate path="/page/about"/></on>
        $t:home.learn_more
      </button>
    </div>
  </div>
</fragment>
 

적용 방식

  • 템플릿/확장 개발자는 기존 JSON 문법과 HTML 문법 중 원하는 쪽을 선택해 개발할 수 있습니다. 기존 JSON 템플릿은 아무 변경 없이 그대로 동작합니다.
  • 템플릿/확장 설치 시점에 서버가 HTML을 JSON 으로 자동 변환해 저장합니다. 렌더링 엔진은 지금과 동일하게 JSON 으로 동작하므로 성능/호환성에 영향이 없습니다.
  • 레이아웃 코드 편집기에서는 HTML 모드 / JSON 모드를 자유롭게 오가며 편집할 수 있도록 지원할 예정입니다. (위지윅 편집기는 기존 JSON 생성 방식 유지)


이 방향이 실제 템플릿/확장 개발자 입장에서 도움이 될지, 댓글로 자유롭게 의견 부탁드립니다.

감사합니다.

그누보드7 템플릿 문법 선호도

15명 참여

마감됨

JSON 방식
6.7% (1표)
HTML 방식
93.3% (14표)

투표가 마감되었습니다

총 2명이 반응했습니다
|

댓글 16개

저는 HTML 방식에 한 표입니다.

실제로 사용해 보면서 구조를 이해하는 데 다소 시간이 필요했습니다.

반면 HTML 문법은 웹 개발자에게 익숙한 형태라 가독성이 훨씬 좋고,
템플릿이나 확장 개발에 처음 참여하는 분들도 접근하기 쉬워질 거같습니다.
개발 편의성을 높일 수 있는 좋은 접근이라고 생각합니다.

기존 사용자와 신규 개발자를 함께 고려한 설계 같아, 좋은 방향으로 발전하길 기대하겠습니다.
실 사용자 입장에서 구조를 이해하는데 시간이 걸리셨다는 점 이해하였습니다.
좋은 의견 감사드립니다. 😊

저도 초기부터 JSONUI 도입에 의문을 가졌었는데 일단 왜 도입했나? 어떤 장점이 있어서 도입했는지 알 수가 없습니다. 컴파일 안하는게 어떻게 큰 장점이 될까 싶었거든요. 따로 json ui 를 학습해야된다는거 허들이 높습니다.  AI 면 해결이 되긴 하지만 아직 UI 디자인은 AI가 가장 미숙한 부분이라 생각되거든요. 
 

전 json ui 유지하면서 기존 html 템플릿 경로도 있어야 된다고 생각됩니다.   
이 부분이 기존 그누5 개발자들에게도 , 테마 개발, 판매하는 컨텐츠몰 판매자들에게도 어필이 될듯 합니다.  
AI로 SIR도 큰 타격을 받았습니다.  방문자, 컨텐츠몰을 보면요, 플러그인은 다죽었습니다만 그래도 팔리는건 디자인 부분인 테마입니다. 이부분 고려해야 합니다. 


하나만 선택한다면 HTML 입니다.

빌드(컴파일)을 하지 않는다는 점은 개발자 관점에서 보면 큰 장점이 되지 않습니다. --watch 모드로 개발하면 react, vue 도 수정된 화면을 즉시 보며 작업할 수 있기 때문입니다.
 

다만 사용자(사이트 운영자) 관점에서는 이야기가 다릅니다. 빌드 방식은 코드 수정 -> 빌드 -> 배포 단계를 거쳐야 합니다. 확장을 설치하면 그 확장이 제공하는 UI가 사이트에 즉시 나타나야 하는데, 빌드를 전제로 하는 구조에서는 이 즉시성을 보장하기 어렵습니다. 또한 레이아웃 편집기 같은 위지윅 빌더를 연동하기에도 빌드 기반 구조는 제약이 큽니다.

 

JSON UI는 이러한 "빌드 없이 즉시 반영" 과 "위지윅 편집기 연동" 을 위한 불가피한 설계였다는 점 양해 부탁드립니다. 다만 문법 난이도가 높다는 지적에는 충분히 공감하며, 그래서 이번에 HTML 문법을 함께 검토하게 되었습니다.


좋은 의견 감사드립니다.
html이 사용하기 쉽다보니 html쪽이 낫다봅니다... 일단 에이아이로 json을 에이아이로 계속 수정중이긴한데, 잘 나오긴하더군요
좋은 방향 같습니다.
좋은 의견 감사드립니다. 참고하도록 하겠습니다. 
템플릿엔진 pug, handlebar 등의 문법도 참고해볼만 할지 모르겠습니다... 

 

말씀하신 pug/handlebars 문법을 검토해 보았는데, 그누보드7 시스템에는 맞지 않아 그대로 사용하기는 어렵고, 커스텀해야 하는 부분이 많을 것으로 보입니다. 그누보드7 시스템에 녹일 만한 장점이 있다면 참고해보도록 하겠습니다.

 

좋은 제안 감사드립니다.

2026-07-15 (수) 17:55:24
if 같은 html 표준 외의 템플릿을 위한 속성이나 태그는 prefix를 붙여 사용하면 좋을 것 같습니다.
t-if, t-on, t-click 등



CSR 없이 blade 템플릿 렌더링은 미지원인가요?

네 기존 관행(표준)과 다른 G7 전용 속성/태그는 별도 prefix를 붙여서 AI 환각을 최대한 줄이는 방향으로 설계하도록 하겠습니다.

그리고 blade 템플릿 지원 여부를 문의해주신 것은 G7은 자체 템플릿 엔진을 사용하고 있는데, 이 구조를 원하지 않는 개발자가 화면을 구성할 다른 수단을 공식적으로 제공하지 않고 있는데, 이에 대한 개선 계획이 있는지 여부를 문의하신 것으로 생각됩니다.

(이전에 올려주신 https://sir.kr/boards/free/1733172 의 연장선상으로 보입니다)

예)
1) React, Vue 앱을 별도로 빌드해 화면을 구성하고 싶은 사용자
2) Blade를 쓰고 싶은 사용자
3) HTML + jQuery를 쓰고 싶은 사용자

1) 의 경우, G7은 REST API 구조이므로 별도의 react, vue 앱을 개발하여 연동할 수 있는 구조이므로 논외로 하겠습니다.
2), 3) 의 케이스의 경우 지원 계획은 있으나 개발 우선순위에서 밀려있습니다. 지원 가능 시점에 본 댓글을 통해 안내해드리도록 하겠습니다.

좋은 의견 감사드립니다.

아무래도 배움이 덜 가는 쪽으로 눈이 더 가겠죠
사용자 정의 속성이 HTML5에서 정식 지원하는 표준이므로 적극 활용하는 것도 방안일거 같습니다
 
의견 감사합니다.
최대한 표준에 가까운 방향으로 지원해보도록 하겠습니다.
다양한 방법을 지원하면 좋습니다. 즐거운 시간 되세요.
의견 감사드립니다. :)

저처럼 구식은 JSON방식보다 HTML이 좋습니다.

다방면으로 유저들의 고민을 수렴해 줘서 고맙습니다.
내부적으로 어떻게 돌아가던 일단 접근성이 좋으면 좋습니다.^^

기능을 덜어내거나 설계를 해치지 않는 선에서 접근성을 개선할 수 있는 합리적인 방안을 지속적으로 고민해 나가겠습니다.
좋은 의견 감사드립니다.
댓글을 작성하시려면 로그인이 필요합니다.

자유게시판

203,005건
+
제목 글쓴이 날짜 조회
07-15 조회 301
07-15 조회 312
07-15 조회 178
07-15 조회 231
07-15 조회 528
07-15 조회 290
07-15 조회 184
07-15 조회 187
07-15 조회 141
07-14 조회 267
07-14 조회 218
07-14 조회 353
07-14 조회 215
07-14 조회 183
07-14 조회 326
07-14 조회 162
07-13 조회 276
07-13 조회 355
07-13 조회 318
07-13 조회 168