기본 개념
사용자
웹사이트
•
에디터를 통해서 제작된 사이트이며, 방문자(및 구매자)가 사이트를 방문하여 컨텐츠를 보거나 상품을 구매해요.
•
웹사이트는 쇼핑 기능이 없는 ‘홈페이지’와 쇼핑 기능을 포함하는 ‘쇼핑몰’ 모두를 포함해요.
에디터
•
웹사이트를 제작하기 위한 툴이에요.
•
사용자는 에디터를 활용하여 사이트와 페이지를 구성 및 디자인하고 발행(공개)해요.
•
웹사이트를 제작하는 과정에서 프리뷰(Preview)를 통해 발행하기 전에 미리 구성과 디자인을 확인할 수 있어요.
블록
•
블록은 하나의 행(Row)를 모두 차지하게 삽입될 수도 있고, 하나의 행 내의 열(Column)에 삽입될 수도 있어요.
•
블록 메이커
•
블록을 제작하는 툴이에요.
세팅 빌더
•
특정 블록을 선택하여 나오는 코드 수정 창에서 [세팅 빌더] 탭을 눌러서 사용할 수 있어요.
“안녕 블록 메이커!” — 기본 문법 소개
<style>
h1 {
color: red;
font-size: 24px;
}
</style>
<template>
<h1>안녕 블록 메이커!</h1>
<ul>
<li>제목 색상: red</li>
<li>제목 사이즈: 24px</li>
</ul>
<button>설명 보기</button>
</template>
<script>
const container = bm.container;
const context = bm.context;
function clicked(e) {
e.preventDefault();
if (e.target.matches('button')) {
alert(`제목 색상은 red이고 사이즈는 24px 이에요!`);
}
}
container.addEventListener('click', clicked, true);
</script>
HTML
복사
블록을 만들기 위해서는 HTML/CSS/JavaScript에 대한 기본적인 지식이 필요해요!
간단한 블록을 만들기 위해서는 HTML/CSS 정도로도 구현이 가능하지만, 동작 복잡도가 있는 블록을 만들기 위해서는 기본적인 HTML/CSS/JavaScript 지식이 필요해요.
예시 코드는 빨간색의 “안녕 블록 메이커” 텍스트를 포함하는 <h1> 태그를 그리고 <button>을 클릭 시 설명을 출력하는 블록의 예시에요.
기본 블록 문법 설명
•
하나의 블록은 하나의 코드 파일로 구성돼요.
•
하나의 블록은 크게 3개의 최상위 HTML 태그인 <style> , <template> , <script> 태그로 구성될 수 있고, 태그별로 하나만 최상위 태그로 가질 수 있어요.
◦
<style>: 구현하려는 블록의 Style(CSS)을 입력할 수 있어요.
◦
<template>: 구현하려는 블록의 기본적인 템플릿(HTML)을 입력할 수 있어요.
◦
<script>: 구현하려는 블록의 JavaScript 코드를 입력할 수 있어요.
“{{property.myHelloPhrase}} 블록 메이커!“ — 사용자가 설정할 수 있는 블록 만들기
{
// 웹사이트에 삽입된 각 블록의 고유한 ID 에요.
"id": "...",
// 세팅 빌더를 통해 정의된 블록 설정이 property 내에 포함되어 있어요.
"property": {
"myHelloPhrase": "🖐🏻",
"myColor": "blue",
"myFontSize": 36,
},
...
}
JavaScript
복사
세팅 빌더를 통해 정의된 설정들(property)과 각 설정의 값들을 포함한 컨텍스트(Context) 객체 예시
<style>
h1 {
color: {{property.myColor}};
font-size: {{property.myFontSize}}px;
}
</style>
<template>
<h1>{{property.myHelloPhrase}} 블록 메이커!</h1>
<ul>
<li>제목 색상: {{property.myColor}}</li>
<li>제목 사이즈: {{property.myFontSize}}px</li>
</ul>
<button>설명 보기</button>
</template>
<script>
const container = bm.container;
const context = bm.context;
function clicked(e) {
e.preventDefault();
if (e.target.matches('button')) {
const myColor = context.property.myColor;
const myFontSize = context.property.myFontSize;
alert(`제목 색상은 ${myColor}이고 사이즈는 ${myFontSize}px 이에요!`);
}
}
container.addEventListener('click', clicked, true);
</script>
HTML
복사
이제 사용자는 <h1> 의 색상과 글자 크기를 설정할 수 있고, “안녕”이라는 문구를 고쳐 쓸 수 있어요.
갑자기 주어진 상황!
•
블록을 제작하는 중에 블록의 사용자가 <h1> 태그 내 “색상, 글자 크기나 컨텐츠 일부를 직접 수정할 수 있도록 지원”해달라는 요청이 왔어요.
•
사용자는 아쉽게도 코드를 직접 수정하지 못하는 분이어서, 컨텐츠와 디자인을 바꾸고 싶을 때마다 항상 코드 수정을 위해 연락이 와요. 
사용자가 설정할 수 있는 블록
1.
세팅 빌더를 통해 블록에서 지원하려는 설정 가능한(커스터마이징 가능한) 값들(변수명, 타입, …)을 정의.
2.
컨텍스트(Context)
•
컨텍스트(Context)는 블록의 UI를 그리거나 블록 동작에 참고 및 활용할 수 있는 데이터를 담고 있는 일종의 JSON 객체(Object)에요.
•
컨텍스트 객체 내에는 id 필드가 존재하고, 동일한 블록이라도 여러 위치에 삽입되면 각각 고유한 ID를 가져요.
•
블록을 만드는 과정에서 세팅 빌더를 통해서 정의한 설정과 설정의 값(디폴트 값 혹은 사용자가 설정한 값)들이 컨텍스트 객체 내 property 라는 객체 내에 키와 값이 전달돼요.
•
세팅 빌더와 컨텍스트 객체 내 property 를 활용하여 블록을 제작하면, 한 번 제작한 블록에서 코드 수정 없이도 사용자가 UI나 동작을 에디터에서 설정할 수 있도록 블록을 제작할 수 있어요.
•
컨텍스트 객체는 <style> , <template> , <script> 모든 태그 내에서 접근해 활용할 수 있어요.
◦
◦
◦
<script>: bm.context를 통해서 컨텍스트 객체에 접근할 수 있어요.
•
컨텍스트 객체는 id, property 외의 다른 상황에도 사용돼요.
◦
Handlebars.js 문법이 어려워 보이는데 혹시 다 알아야 할까요?
사용자가 설정한 값을 HTML/CSS에서 단순히 읽어서 사용하시는 경우에는 모든 문법을 자세히 알 필요 없이 property 값에 접근하기 위한 {{property.*}} 문법만 기억해도 괜찮아요!
<style> 태그
<style>
h1 {
color: red;
/* Handlebars.js 문법으로 컨텍스트 객체 내 property 값에 접근 */
font-size: {{property.myFontSize}}px;
}
</style>
HTML
복사
CSS 및 Handlebars.js 로 작성된 스타일 예시
•
블록에 적용될 CSS 코드를 입력할 수 있어요.
•
입력된 CSS 코드는 웹사이트에 삽입된 각 블록 별로 격리되어 적용돼요.
•
•
•
기본 HTML 디자인이 이상해요!
블록 메이커를 통해 제작되는 블록들은 다양한 기기에서 여러 테마에 적용되어도 최대한 동일한 블록 UI를 제공할 수 있도록 브라우저에서 기본 적용되는 디폴트 CSS 스타일이 대부분 초기화(Reset)되어 있어요.
<template> 태그
<template>
<h1>Hello Block Maker!</h1>
<!-- Handlebars.js 문법으로 컨텍스트 객체 내 property 값에 접근 -->
<p>{{property.myDescription}}</p>
</template>
HTML
복사
HTML 및 Handlebars.js 로 작성된 템플릿 예시
<!-- 블록 컨테이너(Block Container) 영역 -->
<div>
<!-- 템플릿의 HTML은 블록 컨테이너 안에 그려져요. -->
<h1>Hello Block Maker!</h1>
<p>블록 메이커에 대한 설명이에요.</p>
</div>
HTML
복사
작성된 템플릿이 웹사이트에 그려진 예시
•
블록의 기본이 되는 HTML 템플릿을 입력할 수 있어요.
•
•
•
•
블록 컨테이너
•
입력한 블록 템플릿을 감싸고 내부에 실제로 그리게 되는 HTML DOM 컨테이너에요.
•
블록 컨테이너는 하나의 블록당 1개만 존재하고, 작성한 HTML 템플릿의 부모(Parent) 컨테이너로 볼 수 있어요.
•
<script> 태그
<script> 태그 사용 시 주의 사항
•
Beta(베타) 기간에는 <script> 태그의 문법적 제약이 거의 없지만, 추후 특정 문법을 사용하는 경우 제약될 수 있어요.
•
외부 라이브러리(jQuery 등)를 사용하는 경우 공통 코드를 설정하여 <script> 태그 내에서 활용할 수 있지만, 꼭 필요한 경우가 아니라면 사이트의 속도 저하의 원인이 될 수 있으니 순수 JavaScript(Vanilla JavaScript) 사용을 지향해요.
<script>
const container = bm.container;
const context = bm.context;
container.addEventListener('click', e => {
e.preventDefault();
if (e.target.matches('h1')) {
// <h1> 태그를 클릭시 사용자가 에디터에 설정한 메세지를 출력
alert(context.property.myAlertMessage);
// 고객 로그아웃 처리
bm.do('logout');
}
}, true);
</script>
HTML
복사
블록에서 접근 가능한 bm 변수와 스크립트 예시
•
<script> 태그 내에 JavaScript 코드를 작성해서 블록의 동작을 제어할 수 있어요.
•
작성한 <script> 코드는 <template> 과 <style> 이 그려진 뒤에 실행돼요.
•
bm
•
<script> 태그 내에서 bm 이라는 변수에 접근할 수 있고, bm 을 통해 해당 블록과 관련된 정보에 접근할 수 있어요.
•
bm 변수는 웹사이트에 삽입된 블록별로 격리되어 있어요.
bm.context
•
컨텍스트(Context) 객체에 접근해 블록의 기능이나 UI 구성에 활용할 수 있어요.
•
<script> 태그에서 컨텍스트(Context) 객체를 활용한 블록 제작 시에는 bm.onContextChange 와 에디터 내 프리뷰(Preview) 지원 내용을 함께 참고해 주세요.
bm.container
•
블록 컨테이너의 DOM 객체에요.
•
일반적으로 DOM 이벤트(마우스 클릭 등)를 걸거나 블록 컨테이너 내 HTML을 찾는(Query) 용도로 사용해요.
bm.onContextChange
•
컨텍스트(Context) 객체의 변화가 생긴 경우 실행되는 콜백 함수를 정의할 수 있는 공간이에요.
bm.onDestroy
•
블록이 제거된 경우(페이지 이동 혹은 DOM 제거 등에 의해) 실행되는 콜백 함수를 정의할 수 있는 공간이에요.
•
블록이 페이지에서 제거될 때 발생하는 정리(Cleanup) 작업이 필요한 경우 유용해요.
◦
setInterval(...), setTimeout(...) 등으로 설정된 타이머 해제
◦
addEventListener(...), removeEventListener(...) 등으로 등록된 DOM 이벤트 리스너 정리
◦
MutationObserver, IntersectionObserver 등의 옵저버 해제
◦
외부 상태나 리소스를 참조하는 전역 변수 또는 캐시 객체 초기화
•
더 자세한 내용은 🗨️ 블록에서 타이머, 이벤트, 옵저버 등을 설정한 경우, bm.onDestroy를 이용해 정리(clean-up) 코드를 꼭 작성해 주세요. 도 함께 참고해주세요.
bm.do(action)
•
블록 메이커에서 제공하는 액션 함수를 호출할 수 있어요.
•
현재 bm.do() 함수로 사용할 수 있는 액션은 다음과 같아요:
◦
bm.do('logout'): 로그인된 고객을 로그아웃 시켜요.
<script> 태그 사용 — Good vs. Bad
<!-- Good -->
<script>
// bm, bm.context 와 별도로 필요한 변수를 관리하고 사용
let myCounter = 0;
bm.container.addEventListener('click', e => {
e.preventDefault();
myCounter = myCounter + 1;
});
</script>
<!-- Bad -->
<script>
// bm.context에 변수를 할당하고 사용
bm.context.myCounter = 0;
bm.container.addEventListener('click', e => {
e.preventDefault();
bm.context.myCounter = bm.context.myCounter + 1;
});
</script>
HTML
복사
•
추후bm 혹은 bm.context 를 코드에서 더 활용할 수 있는 문법을 추가 제공할 예정이어서, bm 혹은 bm.context 를 직접 수정하면 추후 예기치 않은 사이드 이펙트가 발생할 수 있어요.
<!-- Good -->
<script>
bm.container.innerHTML = '<h1>안녕하세요!</h1>';
// 블록 컨테이너에 DOM 이벤트를 위임하고 분기
bm.container.addEventListener('click', e => {
e.preventDefault();
if (e.target.matches('h1')) {
alert('<h1> 태그가 클릭되었어요.');
}
}, true);
// 1초 뒤 <h1> 태그를 새로 생성
setTimeout(() => {
bm.container.innerHTML = '<h1>☺️클릭하면 창이 떠요!</h1>';
}, 1000);
</script>
<!-- Bad -->
<script>
bm.container.innerHTML = '<h1>안녕하세요!</h1>';
// 블록 컨테이너에 그려진 HTML 요소에 직접 DOM 이벤트를 바인딩
const h1 = bm.container.querySelector('h1');
h1.addEventListener('click', e => {
e.preventDefault();
alert('<h1> 태그가 클릭되었어요.');
});
// 1초 뒤 <h1> 태그를 새로 생성
setTimeout(() => {
bm.container.innerHTML = '<h1>😢클릭해도 창이 안떠요...</h1>';
}, 1000);
</script>
HTML
복사
•
블록 컨테이너 내부의 HTML 구조나 내용물이 바뀌는 상황에도 DOM 이벤트를 다시 걸어줄 필요가 없어요.
•
제작하는 블록에서 <script> 태그를 활용해 UI를 동적으로 수정하는 경우에도 상위 컨테이너인 블록 컨테이너를 활용하는 방식이 사이드 이펙트가 덜 발생해요.
◦
에디터 내 프리뷰(Preview) 지원 시 자연스러운 동작에 도움이 돼요.
<!-- Good -->
<script>
// 1초마다 메시지를 출력하는 타이머 설정
const interval = setInterval(() => {
console.log('⏱️ 블록이 아직 페이지에 있어요! (1초마다 동작 중)');
}, 1000);
// 블록이 제거될 때 타이머를 정리
bm.onDestroy = () => {
console.log('🧹 블록이 사라져서 타이머를 멈췄어요!');
clearInterval(interval);
};
</script>
<!-- Bad -->
<script>
// 1초마다 메시지를 출력하는 타이머 설정
const interval = setInterval(() => {
console.log('⏱️ 블록이 아직 페이지에 있어요! (1초마다 동작 중)');
}, 1000);
// 타이머를 정리하지 않아서 블록이 사라진 후에도 계속 실행돼요...
</script>
HTML
복사
•
블록이 제거된 이후에도 코드가 계속 실행되면 성능 저하나 예상치 못한 동작이 발생할 수 있어요.
•
메모리 누수 방지와 깔끔한 상태 관리를 위해 꼭 활용해 주세요!
<data> 태그
<!-- <data> 태그를 활용해서 블록 밖의 데이터를 요청 -->
<data value="$cart" />
<data value="$customer"/>
<style>
...
</style>
<template>
{{#if customer}}
<h1>안녕하세요 {{customer.name.full}}님!</h1>
{{else}}
<h1>안녕하세요!</h1>
{{/if}}
<p>장바구니에 {{cart.count}}개의 상품을 담으셨어요.</p>
{{#if customer}}
<button>로그아웃</button>
{{/if}}
</template>
<script>
const container = bm.container;
const context = bm.context;
bm.onContextChange = () => {
// 로그인 상태나 장바구니 정보가 바뀌면 실행돼요.
console.log(context.customer);
console.log(context.cart);
};
function clicked(e) {
e.preventDefault();
if (e.target.matches('button')) {
// 팁: 로그아웃 버튼을 누르면 로그아웃 처리!
bm.do('logout');
}
}
container.addEventListener('click', clicked, true);
</script>
HTML
복사
<data> 태그를 통해 고객(Customer) 및 장바구니(Cart) 정보를 활용하는 예시
•
<data> 태그는 사이트에서 자동으로 제공되는 값을 블록에서 사용할 수 있게 해줘요.
•
<data> 태그는 <style>, <template> 및 <script> 태그와 다르게 꼭 블록에 선언될 필요는 없어요.
◦
블록에서 필요한 데이터를 가져오는 경우에 <data> 태그를 선언해서 사용할 수 있어요.
•
현재 <data> 태그의 value 로 사용할 수 있는 값은 다음과 같아요:
◦
$customer: 로그인한 사용자 정보 (비회원의 경우 null)
◦
$cart: 장바구니 정보
•
<style>, <template> 태그에서는 {{customer.name.full}}, {{cart.count}}처럼 쓸 수 있어요.
•
<script> 태그에서는 bm.context.customer, bm.context.cart로 접근할 수 있어요.
상태가 바뀌면 자동으로 반영돼요!
•
고객이 로그인하거나 로그아웃하면 customer 값이 바뀌어요.
•
장바구니에 상품을 담거나 빼면 cart 값이 바뀌어요.
•
이런 변화가 생기면 context 값도 자동으로 바뀌고, bm.onContextChange 함수가 실행돼요.
에디터 내 프리뷰(Preview) 지원
<style>
h1 {
/* 사용자가 블록의 설정 값(property.myColor)을 에디터에서 변경하면 프리뷰에 자동 반영돼요. */
color: {{property.myColor}};
}
</style>
<template>
<!-- 사용자가 블록의 설정 값(property.myHelloPhrase)을 에디터에서 변경하면 프리뷰에 자동 반영돼요. -->
<h1>{{property.myHelloPhrase}} 블록 메이커!</h1>
<p></p>
</template>
<script>
const container = bm.container;
const context = bm.context;
const p = container.querySelector('p');
// 처음 한 번은 반영되지만, 사용자가 블록의 설정 값(property.myContents)을 에디터에서 변경해도 자동 반영되지 않아요.
p.innerHTML = context.property.myContents;
</script>
HTML
복사
•
사용자가 설정할 수 있는 블록은 사용자가 에디터에서 블록을 삽입한 뒤, 블록이 정의한 설정 값(컨텍스트(Context) 객체의 property)들을 패널을 통해서 설정하는 과정을 거치게 돼요.
•
사용자가 에디터에서 블록을 설정하게 되면, 사용자는 설정한 값들이 블록에 바로 반영되어 프리뷰에 나오기를 기대해요.
에디터 프리뷰 내 태그별 특징
•
<template> 태그와 <style> 태그에서 사용 중인 컨텍스트(Context) 객체의 property 값들은 에디터에서 자동으로 변경을 감지하고 반영하여 에디터 프리뷰에서 바로 확인할 수 있어요.
•
<script> 태그도 <template> , <style> 태그와 동일하게 제일 처음에는 <script> 태그가 동작하면서 프리뷰에 반영돼요.
•
다만 <script> 태그는 <template> , <style> 태그와는 다르게, 별도의 문법 처리를 해주지 않으면 사용자가 블록의 설정값을 변경하였을 때 자동으로 프리뷰에 반영하지 않아요.
•
...
<script>
const container = bm.container;
const context = bm.context;
const p = container.querySelector('p');
// 최초 실행시 설정 값(property.myContents)을 반영
p.innerHTML = context.property.myContents;
// 이후 사용자가 블록의 설정 값(property.myContents)을 변경한 경우 반영 처리
bm.onContextChange = () => {
const p = container.querySelector('p');
p.innerHTML = context.property.myContents;
};
</script>
HTML
복사
<script> 태그에서 프리뷰 지원하기
•
사용자가 블록이 정의한 설정 값(컨텍스트(Context) 객체의 property)들을 설정하여 property 값에 변화가 생기면, 블록 메이커는 컨텍스트(Context) 객체에 변화가 생겼다고 판단하고 bm.onContextChange에 정의한 함수를 실행해요.
•
bm.onContextChange에 콜백(Callback) 함수를 정의하고, property 값의 변화가 발생한 경우 블록의 UI와 동작에 반영하는 코드를 작성하면 프리뷰에서도 잘 반영되는 블록을 제작할 수 있어요.
Handlebars.js 문법
•
<style>, <template> 태그에서는 일반적인 HTML/CSS와 다르게 Handlebars.js 문법 일부를 지원해요.
•
Handlebars.js 문법을 활용하면 <style>, <template> 태그 내에서 {{…}} 문법으로 컨텍스트(Context) 객체의 값에 접근하고 활용해서 사용자가 설정할 수 있는 블록을 제작할 수 있어요.
•
{{property.mySetting}}
{{property.myNested.mySetting}}
HTML
복사
{{property.myHTMLContents}}
-> <h1>Hello Block Maker!</h1>
{{{property.myHTMLContents}}}
-> <h1>Hello Block Maker!</h1>
HTML
복사
{{{…}}} 문법
•
<style>
{{#if property.showWelcome}}
p {
color: green;
}
{{/if}}
</style>
<template>
{{#if property.showWelcome}}
<p>만나서 반가워요!</p>
{{else}}
<p>인사는 생략할게요...</p>
{{/if}}
</template>
HTML
복사
기본적인 {{#if}} 구문 활용의 예시
<template>
{{#if (eq property.light 'green')}}
<p>초록 불이니 건널 수 있어요.</p>
{{/if}}
{{#if (and (eq property.light 'green') (gte property.cars 1))}}
<p>초록 불이지만 차가 1대 이상 있어요. 조심히 건너가세요.</p>
{{/if}}
</template>
HTML
복사
헬퍼를 함께 활용하는 {{#if}} 구문 활용의 예시
{{#if}} {{else}} 문법 (+{{#unless}})
•
{{#if}} {{else}} 구문으로 분기 처리를 할 수 있어요.
•
{{#if}} 가 있으면 {{/if}} 로 항상 닫혀야 해요.
•
{{else}} 구문은 필요한 경우에만 중간에 끼워서 사용할 수 있어요.
•
{{#if}} 와 비슷하지만 논리 연산이 반대인 문법으로 {{#unless}} 도 있어요.
•
기본적인 {{#if}} 구문에서는 false, undefined, null, "", 0, [] 값들은 모두 거짓 값(Falsy)으로 취급돼요.
{{#if (helper ...)}}
•
•
헬퍼 문법을 활용하면 동일성 비교(eq), 부등호 비교(gt, gte, lt, lte) 등 다양한 비교 연산자와 논리 연산자(and, or)를 함께 활용할 수 있어요.
{
"property": {
"items": [
{ "name": "사과" },
{ "name": "바나나" },
{ "name": "파인애플" }
]
}
}
JSON
복사
<template>
<ul>
{{#each property.items}}
<li>
{{#if @first}}
<strong>[첫 항목]</strong>
{{/if}}
{{#if @last}}
<strong>[마지막 항목]</strong>
{{/if}}
{{@index}}: {{name}}
</li>
{{else}}
<li>표시할 항목이 없어요.</li>
{{/each}}
</ul>
</template>
HTML
복사
{{#each}} 문법 (+{{else}})
•
{{#each}} 구문은 배열이나 객체의 항목들을 순차적으로 출력할 때 사용해요.
•
{{#each}} 가 있으면 반드시 {{/each}} 로 닫아야 해요.
•
{{else}} 구문을 중간에 추가하면, 배열이 비어 있을 때의 대체 내용 표시에 활용할 수 있어요.
•
{{#each}} 내에서 @index, @first, @last 같은 특수 키워드를 사용할 수 있어요.
◦
@index: 현재 항목의 0부터 시작하는 인덱스 값.
◦
@first: 현재 항목이 첫 번째 항목이면 true, 아니면 false.
◦
@last: 현재 항목이 마지막 항목이면 true, 아니면 false.
•
각 배열 요소의 키 값(예시의 items[].name)은 {{#each}} 구문 내에서 {{…}} 문법으로 접근할 수 있어요.
◦
예시처럼 {{name}} 과 같이 간단하게 접근이 가능해요.
◦
{{this.name}} 과 같이 this 키워드를 사용해서 조금 더 명시적으로 표현할 수도 있어요.
편의를 위한 다양한 헬퍼(Helper) 문법
기본적인 {{#if}}, {{#unless}}, {{#each}} 헬퍼 외에도 블록 메이커에서는 다양한 헬퍼 문법을 지원해요.
구분 | 헬퍼(Helper) | 사용 예시 | 설명 |
Conditionals | and | {{#if (and property.flagA property.flagB)}} 모두 true예요 {{else}} 둘 중 하나는 false예요 {{/if}} | · 여러 조건이 모두 true일 때만 true를 반환해요.
· 논리 연산에서 모든 조건이 참인지 확인할 때 사용해요.
예: {{and true true}} → true, {{and true false}} → false |
Conditionals | or | {{#if (or property.flagA property.flagB)}} 둘 중 하나는 true예요 {{else}} 모두 false예요 {{/if}} | · 여러 조건 중 하나라도 true이면 true를 반환해요.
· 둘 중 하나만 참이면 되는 조건을 구성할 때 사용해요.
예: {{or false true}} → true, {{or false false}} → false |
Conditionals | isNil | {{#if (isNil property.value)}} 값이 없어요 {{else}} 값이 있어요 {{/if}} | · 값이 null 또는 undefined인지 확인해요.
· 아무 값도 정의되지 않은 상태인지 확인할 때 사용해요.
예: {{isNil null}} → true, {{isNil "hello"}} → false |
Conditionals | isEmpty | {{#if (isEmpty property.text)}} 비어 있어요 {{else}} 내용이 있어요 {{/if}} | · 값이 비어 있는지를 확인해요. 문자열, 배열, 객체에 사용할 수 있어요.
예: {{isEmpty ""}} → true, {{isEmpty "abc"}} → false |
Conditionals | eq | {{#if (eq property.value 5)}} 값이 5예요 {{else}} 5가 아니에요 {{/if}} | · 두 값이 같은지를 비교해요.
예: {{eq 5 5}} → true, {{eq 5 "5"}} → false |
Conditionals | gt | {{#if (gt property.value 10)}} 10보다 커요 {{else}} 10 이하예요 {{/if}} | · 왼쪽 값이 오른쪽 값보다 큰지 비교해요.
· 숫자의 크기를 비교할 때 자주 사용해요.
예: {{gt 5 3}} → true, {{gt 2 4}} → false |
Conditionals | gte | {{#if (gte property.value 10)}} 10 이상이에요 {{else}} 10 미만이에요 {{/if}} | · 왼쪽 값이 오른쪽 값보다 크거나 같은지 확인해요.
· 특정 기준 이상인지 조건을 검사할 때 사용해요.
예: {{gte 5 5}} → true, {{gte 3 4}} → false |
Conditionals | lt | {{#if (lt property.value 10)}} 10보다 작아요 {{else}} 10 이상이에요 {{/if}} | · 왼쪽 값이 오른쪽 값보다 작은지 비교해요.
· 값이 기준보다 작은지 확인할 때 사용해요.
예: {{lt 2 5}} → true, {{lt 7 3}} → false |
Conditionals | lte | {{#if (lte property.value 10)}} 10 이하예요 {{else}} 10 초과예요 {{/if}} | · 왼쪽 값이 오른쪽 값보다 작거나 같은지 확인해요.
· 숫자가 어떤 한도를 넘지 않았는지 확인할 때 사용해요.
예: {{lte 3 3}} → true, {{lte 5 2}} → false |
Conditionals | inRange | {{#if (inRange property.value 1 10)}} 범위 안에 있어요 {{else}} 범위를 벗어났어요 {{/if}} | · 값이 두 수 사이에 있는지 확인해요.
예: {{inRange 3 1 5}} → true, {{inRange 6 1 5}} → false |
Conditionals | startsWith | {{#if (startsWith property.text "Hi")}} Hi로 시작해요 {{else}} 다른 시작이에요 {{/if}} | · 문자열이 특정 문자로 시작하는지 확인해요.
· 접두사를 검사하거나 특정 구문으로 시작하는지 판단할 때 사용해요.
예: {{startsWith "hello" "he"}} → true |
Conditionals | endsWith | {{#if (endsWith property.text "ing")}} ing로 끝나요 {{else}} 다른 끝이에요 {{/if}} | · 문자열이 특정 문자로 끝나는지 확인해요.
· 접미사를 검사할 때 사용해요.
예: {{endsWith "hello" "lo"}} → true |
Conditionals | includes | {{#if (includes property.text "hello")}} 'hello'가 포함되어 있어요 {{else}} 포함되어 있지 않아요 {{/if}} | · 문자열이나 배열에 특정 값이 포함되어 있는지 확인해요.
· 어떤 키워드나 항목이 있는지 체크할 때 사용해요.
예: {{includes "apple" "pp"}} → true |
Number Helpers | ceil | {{ceil property.value}} | · 숫자를 올림해요.
예: {{ceil 4.2}} → 5 |
Number Helpers | floor | {{floor property.value}} | · 숫자를 내림해요.
예: {{floor 4.8}} → 4 |
Number Helpers | round | {{round property.value}} | · 숫자를 반올림해요.
예: {{round 4.6}} → 5 |
Number Helpers | add | {{add property.a property.b}} | · 두 수를 더해요.
예: {{add 2 3}} → 5 |
Number Helpers | subtract | {{subtract property.total property.used}} | · 왼쪽 값에서 오른쪽 값을 빼요.
예: {{subtract 5 2}} → 3 |
Number Helpers | multiply | {{multiply property.width property.height}} | · 두 수를 곱해요.
예: {{multiply 3 4}} → 12 |
Number Helpers | divide | {{divide property.total property.count}} | · 왼쪽 값을 오른쪽 값으로 나눠요.
예: {{divide 10 2}} → 5 |
Number Helpers | minBy | {{minBy property.people "age"}} | · 배열에서 가장 작은 값을 가진 항목을 찾아요.
예: {{minBy items "age"}} |
Number Helpers | maxBy | {{maxBy property.students "score"}} | · 배열에서 가장 큰 값을 가진 항목을 찾아요.
예: {{maxBy items "score"}} |
Number Helpers | meanBy | {{meanBy property.scores "value"}} | · 특정 속성의 평균을 구해요.
예: {{meanBy items "score"}} → 평균값 |
Number Helpers | sumBy | {{sumBy property.items "count"}} | · 특정 속성의 합계를 구해요.
예: {{sumBy items "price"}} → 합계 |
String Helpers | camelCase | {{camelCase property.text}} | · 문자열을 camelCase 형식으로 바꿔요.
예: {{camelCase "hello world"}} → helloWorld |
String Helpers | kebabCase | {{kebabCase property.title}} | · 문자열을 kebab-case 형식으로 바꿔요.
예: {{kebabCase "Hello World"}} → hello-world |
String Helpers | lowerCase | {{lowerCase property.text}} | · 문자열을 모두 소문자로 바꿔요 (공백 포함).
예: {{lowerCase "HELLO WORLD"}} → hello world |
String Helpers | snakeCase | {{snakeCase property.text}} | · 문자열을 snake_case 형식으로 바꿔요.
예: {{snakeCase "Hello World"}} → hello_world |
String Helpers | startCase | {{startCase property.text}} | · 문자열의 단어를 대문자로 시작하게 바꿔요.
예: {{startCase "hello world"}} → Hello World |
String Helpers | upperCase | {{upperCase property.text}} | · 문자열을 모두 대문자로 바꿔요 (공백 포함).
예: {{upperCase "hello world"}} → HELLO WORLD |
String Helpers | lowerFirst | {{lowerFirst property.word}} | · 문자열의 첫 글자만 소문자로 바꿔요.
예: {{lowerFirst "Hello"}} → hello |
String Helpers | upperFirst | {{upperFirst property.word}} | · 문자열의 첫 글자만 대문자로 바꿔요.
예: {{upperFirst "hello"}} → Hello |
String Helpers | toLower | {{toLower property.text}} | · 문자열을 모두 소문자로 바꿔요.
예: {{toLower "HELLO"}} → hello |
String Helpers | toUpper | {{toUpper property.text}} | · 문자열을 모두 대문자로 바꿔요.
예: {{toUpper "hello"}} → HELLO |
String Helpers | capitalize | {{capitalize property.text}} | · 첫 글자를 대문자로 바꿔요.
예: {{capitalize "hello"}} → Hello |
String Helpers | padStart | {{padStart property.number 4 "0"}} | · 문자열 앞을 채워 길이를 맞춰요.
예: {{padStart "1" 3 "0"}} → 001 |
String Helpers | padEnd | {{padEnd property.code 5 "0"}} | · 문자열 끝을 채워 길이를 맞춰요.
예: {{padEnd "a" 3 "_"}} → a__ |
String Helpers | trim | {{trim property.text}} | · 문자열 앞뒤의 공백을 제거해요.
예: {{trim " hello "}} → hello |
String Helpers | join | {{join property.items ", "}} | · 문자열 구분자를 사용해 배열을 하나의 문자열로 만들 수 있어요.
예: {{join property.items ", "}} → a, b, c |
String Helpers | split | {{split property.text ","}} | · 문자열을 구분자로 나눠 배열로 만들어요.
예: {{split property.text ","}} → ["a", "b"] |
Array Helpers | first | {{first property.items}} | · 배열의 첫 번째 값을 가져와요.
예: {{first property.items}} → 배열의 첫 번째 항목 |
Array Helpers | last | {{last property.items}} | · 배열의 마지막 값을 가져와요.
예: {{last property.items}} → 배열의 마지막 항목 |
Array Helpers | slice | {{slice property.items 1 3}} | · 배열의 일부를 잘라내요.
예: {{slice property.items 1 3}} → 1번째부터 3번째 전까지 |
Array Helpers | size | {{size property.items}} | · 배열, 문자열, 객체의 길이나 개수를 구해요.
예: {{size "abc"}} → 3 |
Array Helpers | concat | {{concat property.items property.extra}} | · 여러 값을 배열로 이어붙여요.
예: {{concat property.items property.extra}} → 배열을 합쳐요 |
Array Helpers | orderBy | {{orderBy property.records "name" "desc"}} | · 배열을 정렬해요.
예: {{orderBy items "name" "asc"}} |
Array Helpers | filter | {{filter property.items "isActive"}} | · 조건에 맞는 항목만 걸러내요.
예: {{filter property.items "isActive"}} |
Array Helpers | reject | {{reject property.tasks "completed"}} | · 조건을 만족하지 않는 항목만 걸러내요.
예: {{reject items "isDone"}} |
Array Helpers | chunk | {{chunk property.items 2}} | · 배열을 지정한 크기로 나눠 2차원 배열로 만들어요.
예: {{chunk property.items 2}} → [[a,b],[c,d]] 형태 |
Random Helpers | random | {{random 0 10}} | · 주어진 범위에서 무작위 수를 만들어요.
예: {{random 1 5}} → 3 |
Random Helpers | shuffle | {{shuffle property.items}} | · 배열의 순서를 무작위로 섞어요.
예: {{shuffle property.items}} → 섞인 배열 |
Random Helpers | sample | {{sample property.items}} | · 배열에서 무작위 항목 하나를 골라요.
예: {{sample property.items}} → 무작위 요소 하나 |
Random Helpers | sampleSize | {{sampleSize property.items 2}} | · 배열에서 지정한 개수만큼 무작위로 골라요.
예: {{sampleSize property.items 2}} → 무작위 2개 항목 |
Other Helpers | range | {{range 1 6}} | · 숫자 범위 배열을 만들어요.
예: {{range 0 3}} → [0, 1, 2] |
Other Helpers | defaultTo | {{defaultTo property.value "없음"}} | · 값이 null 또는 undefined일 때 기본값을 설정해요.
예: {{defaultTo null "기본값"}} → 기본값 |
Type Converters | toInteger | {{toInteger property.value}} | · 값을 정수로 바꿔요.
예: {{toInteger 4.7}} → 4 |
Type Converters | toNumber | {{toNumber property.string}} | · 값을 숫자로 바꿔요.
예: {{toNumber "3.14"}} → 3.14 |
Type Converters | toString | {{toString property.value}} | · 값을 문자열로 바꿔요.
예: {{toString 123}} → 123 |
Type Converters | toJSON | {{toJSON property.data}} | · 객체나 배열을 JSON 문자열로 바꿔요.
예: {{toJSON property.data}} → {"a":1} |
Type Converters | fromJSON | {{fromJSON property.jsonText}} | · JSON 문자열을 다시 객체로 바꿔요.
예: {{fromJSON property.jsonText}} → 객체 |