그누보드7 템플릿에 HTML 문법을 도입해 보려는데 의견 구합니다.
안녕하세요.
그누보드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명 참여
마감됨
투표가 마감되었습니다
댓글 16개
실제로 사용해 보면서 구조를 이해하는 데 다소 시간이 필요했습니다.
반면 HTML 문법은 웹 개발자에게 익숙한 형태라 가독성이 훨씬 좋고,
템플릿이나 확장 개발에 처음 참여하는 분들도 접근하기 쉬워질 거같습니다.
개발 편의성을 높일 수 있는 좋은 접근이라고 생각합니다.
기존 사용자와 신규 개발자를 함께 고려한 설계 같아, 좋은 방향으로 발전하길 기대하겠습니다.
좋은 의견 감사드립니다. 😊
저도 초기부터 JSONUI 도입에 의문을 가졌었는데 일단 왜 도입했나? 어떤 장점이 있어서 도입했는지 알 수가 없습니다. 컴파일 안하는게 어떻게 큰 장점이 될까 싶었거든요. 따로 json ui 를 학습해야된다는거 허들이 높습니다. AI 면 해결이 되긴 하지만 아직 UI 디자인은 AI가 가장 미숙한 부분이라 생각되거든요.
전 json ui 유지하면서 기존 html 템플릿 경로도 있어야 된다고 생각됩니다.
이 부분이 기존 그누5 개발자들에게도 , 테마 개발, 판매하는 컨텐츠몰 판매자들에게도 어필이 될듯 합니다.
AI로 SIR도 큰 타격을 받았습니다. 방문자, 컨텐츠몰을 보면요, 플러그인은 다죽었습니다만 그래도 팔리는건 디자인 부분인 테마입니다. 이부분 고려해야 합니다.
하나만 선택한다면 HTML 입니다.
다만 사용자(사이트 운영자) 관점에서는 이야기가 다릅니다. 빌드 방식은 코드 수정 -> 빌드 -> 배포 단계를 거쳐야 합니다. 확장을 설치하면 그 확장이 제공하는 UI가 사이트에 즉시 나타나야 하는데, 빌드를 전제로 하는 구조에서는 이 즉시성을 보장하기 어렵습니다. 또한 레이아웃 편집기 같은 위지윅 빌더를 연동하기에도 빌드 기반 구조는 제약이 큽니다.
JSON UI는 이러한 "빌드 없이 즉시 반영" 과 "위지윅 편집기 연동" 을 위한 불가피한 설계였다는 점 양해 부탁드립니다. 다만 문법 난이도가 높다는 지적에는 충분히 공감하며, 그래서 이번에 HTML 문법을 함께 검토하게 되었습니다.
좋은 의견 감사드립니다.
좋은 방향 같습니다.
말씀하신 pug/handlebars 문법을 검토해 보았는데, 그누보드7 시스템에는 맞지 않아 그대로 사용하기는 어렵고, 커스텀해야 하는 부분이 많을 것으로 보입니다. 그누보드7 시스템에 녹일 만한 장점이 있다면 참고해보도록 하겠습니다.
좋은 제안 감사드립니다.
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이 좋습니다.
다방면으로 유저들의 고민을 수렴해 줘서 고맙습니다.
내부적으로 어떻게 돌아가던 일단 접근성이 좋으면 좋습니다.^^
좋은 의견 감사드립니다.