Search

블록 메이커

블록 메이커는 Beta(베타) 기능이에요!
Beta 기간에는 사용된 문법의 하위 호환이 보장되지 않아요.
Beta 기간에 개발된 블록들의 경우 추후 문법 변경에 의해서 수정이 요청될 수 있어요.

기본 개념

사용자

웹사이트

에디터를 통해서 제작된 사이트이며, 방문자(및 구매자)가 사이트를 방문하여 컨텐츠를 보거나 상품을 구매해요.
웹사이트는 쇼핑 기능이 없는 ‘홈페이지’와 쇼핑 기능을 포함하는 ‘쇼핑몰’ 모두를 포함해요.

에디터

웹사이트를 제작하기 위한 툴이에요.
사용자는 에디터를 활용하여 사이트와 페이지를 구성 및 디자인하고 발행(공개)해요.
사용자는 에디터로 블록을 웹사이트에 삽입하고 설정할 수 있어요.
웹사이트를 제작하는 과정에서 프리뷰(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)를 통해 접근하고 사용하도록 지원.
3.
사용자에디터에서 웹사이트 제작 시 블록을 페이지에 삽입하고 입맛에 맞게 설정!

컨텍스트(Context)

컨텍스트(Context)는 블록의 UI를 그리거나 블록 동작에 참고 및 활용할 수 있는 데이터를 담고 있는 일종의 JSON 객체(Object)에요.
컨텍스트 객체 내에는 id 필드가 존재하고, 동일한 블록이라도 여러 위치에 삽입되면 각각 고유한 ID를 가져요.
블록을 만드는 과정에서 세팅 빌더를 통해서 정의한 설정과 설정의 값(디폴트 값 혹은 사용자가 설정한 값)들이 컨텍스트 객체 내 property 라는 객체 내에 키와 값이 전달돼요.
세팅 빌더와 컨텍스트 객체 내 property 를 활용하여 블록을 제작하면, 한 번 제작한 블록에서 코드 수정 없이도 사용자가 UI나 동작을 에디터에서 설정할 수 있도록 블록을 제작할 수 있어요.
컨텍스트 객체는 <style> , <template> , <script> 모든 태그 내에서 접근해 활용할 수 있어요.
<style>: Handlebars.js 문법을 통해서 컨텍스트 객체에 접근할 수 있어요.
<template>: Handlebars.js 문법을 통해서 컨텍스트 객체에 접근할 수 있어요.
<script>: bm.context를 통해서 컨텍스트 객체에 접근할 수 있어요.
컨텍스트 객체는 id, property 외의 다른 상황에도 사용돼요.
자세한 내용은 <data> 태그 내용을 함께 참고해주세요.
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 코드는 웹사이트에 삽입된 각 블록 별로 격리되어 적용돼요.
일반적인 CSS 문법과 다르게 추가로 Handlebars.js 문법을 지원해요.
Handlebars.js 문법으로 컨텍스트(Context) 값에 접근해서 동적인 디자인 구성에 활용할 수 있어요.
컨텍스트(Context) 값으로 동적인 디자인을 구성하지 않는다면, Handlebars.js 문법 없이 기본적인 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 템플릿은 자동으로 블록 컨테이너 내에 그려(Render)져요.
일반적인 HTML 문법과 다르게 추가로 Handlebars.js 문법을 지원해요.
Handlebars.js 문법으로 컨텍스트(Context) 값에 접근해서 동적인 HTML 구성에 활용할 수 있어요.
컨텍스트(Context) 값으로 동적인 HTML을 구성하지 않는다면, Handlebars.js 문법 없이 기본적인 HTML 코드만 입력하여 사용해도 괜찮아요.

블록 컨테이너

입력한 블록 템플릿을 감싸고 내부에 실제로 그리게 되는 HTML DOM 컨테이너에요.
블록 컨테이너는 하나의 블록당 1개만 존재하고, 작성한 HTML 템플릿의 부모(Parent) 컨테이너로 볼 수 있어요.
<script> 태그 내에서 bm.container 문법을 통해서 블록 컨테이너의 DOM 객체에 접근하여 활용할 수 있어요.

<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> 이 그려진 뒤에 실행돼요.
그 외 <script> 태그 내 문법 패턴에 대한 내용은 <script> 태그 사용 — Good vs. Bad 내용도 함께 참고해 주세요.

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.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
복사
bmbm.context 객체 내부의 값을 JavaScript 코드를 통해 직접 수정하지 말아 주세요.
추후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
복사
UI 클릭 등 DOM에 이벤트를 거는(Binding) 경우, 상위 컨테이너인 블록 컨테이너(bm.container)에 이벤트를 걸고 콜백 함수(Callback)에서 분기 처리하는 패턴이 좋아요.
블록 컨테이너 내부의 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
복사
블록에서 타이머, 이벤트, 옵저버 등을 설정한 경우, bm.onDestroy를 이용해 정리(clean-up) 코드를 꼭 작성해 주세요.
블록이 제거된 이후에도 코드가 계속 실행되면 성능 저하나 예상치 못한 동작이 발생할 수 있어요.
메모리 누수 방지와 깔끔한 상태 관리를 위해 꼭 활용해 주세요!

<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> 태그에서 프리뷰 지원하기 내용을 함께 참고해 주세요.
... <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) 객체의 값에 접근하고 활용해서 사용자가 설정할 수 있는 블록을 제작할 수 있어요.
단순히 컨텍스트(Context) 객체에 접근하는 것뿐만 아니라, <style>, <template> 태그 내에서 간단한 로직을 구성할 수도 있어요.
{{property.mySetting}} {{property.myNested.mySetting}}
HTML
복사

{{…}} 문법

{{…}} 문법을 통해서 컨텍스트(Context) 객체의 값에 접근할 수 있어요.
. 으로 구분해서 중첩(Nested)된 값들에 접근할 수 있어요.
{{property.myHTMLContents}} -> &lt;h1&gt;Hello Block Maker!&lt;/h1&gt; {{{property.myHTMLContents}}} -> <h1>Hello Block Maker!</h1>
HTML
복사

{{{…}}} 문법

기본적인 중괄호 2개 문법({{…}} 문법 )과 거의 똑같지만 중괄호 3개 문법을 사용하면 HTML 컨텐츠를 이스케이프(Escape)하지 않고 있는 그대로 표현할 수 있어요.
<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}} 구문에서는 falseundefinednull""0[] 값들은 모두 거짓 값(Falsy)으로 취급돼요.

{{#if (helper ...)}}

편의를 위한 다양한 헬퍼(Helper) 문법 을 함께 활용하면 {{#if}} 구문을 더 확장해서 사용할 수 있어요.
헬퍼 문법을 활용하면 동일성 비교(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}} → 객체