Slate Handlebars helper 참조
Helper는 Handlebars 표현식에서 이름과 인자로 호출하는 미리 정의된 함수입니다. var1이 7이면 {{add 5 var1}}의 계산값은 12입니다. 실제 자료형으로 받을지 문자열로 받을지는 사용 위치의 치환 규칙을 따릅니다.
적용 범위
| 분류 | 사용할 위치 |
|---|---|
| Built-in | Slate가 제공하는 Handlebars의 if, unless, each입니다. |
| Core | 질의와 위젯에서 사용합니다. |
| Widget | 위젯에서만 사용합니다. |
| Foundry | HttpJson Foundry query에서만 사용합니다. |
| SQL | SQL query에서만 사용합니다. HttpJson Foundry query에는 사용하지 않습니다. |
Functions editor에서는 helper를 사용할 수 없습니다. 그곳에서는 Slate 값의 참조를 받아 JavaScript로 처리합니다.
Built-in helper
if
조건이 참일 때 본문을 표시하고 else로 다른 경우를 처리합니다. false, undefined, null, 빈 문자열, 0과 빈 배열은 거짓으로 취급합니다.
{{#if ready}}
준비되었습니다.
{{else}}
입력을 기다립니다.
{{/if}}
0을 값이 있는 경우로 다루려면 {{#if count includeZero=true}}...{{/if}} 형태로 지정할 수 있습니다.
unless
if의 반대 조건입니다. 값이 거짓으로 취급되는 경우 본문을 표시합니다.
{{#unless ready}}입력을 준비하세요.{{/unless}}
each
배열이나 객체를 반복하며 this로 현재값을 읽습니다. 배열에서는 @index, 객체에서는 @key로 위치나 키를 읽을 수 있습니다. 비어 있을 때에는 else를 사용합니다.
{{#each names}}
<p>{{@index}}: {{this}}</p>
{{else}}
<p>표시할 이름이 없습니다.</p>
{{/each}}
Core: 자료형과 문자열
toString
JavaScript String()으로 변환합니다.
| 호출과 입력 | 결과 |
|---|---|
{{toString 'hello'}} | "hello" |
{{toString 1}} | "1" |
{{toString variable}}, variable이 ["hello","world"] | "hello,world" |
같은 호출, variable이 [1,2,3] | "1,2,3" |
같은 호출, variable이 {"hello":"world"} | "[object Object]" |
객체 내용을 JSON으로 전달하려면 jsonStringify를 사용합니다.
toNumber
JavaScript Number()로 변환하며 변환할 수 없는 값은 NaN입니다.
| 호출과 입력 | 결과 |
|---|---|
{{toNumber 1}} | 1 |
{{toNumber '2'}} | 2 |
{{toNumber 'hello'}} | NaN |
{{toNumber variable}}, variable이 [1,2,3] | NaN |
같은 호출, variable이 {"hello":"world"} | NaN |
concat
여러 인자를 문자열로 변환하여 이어 붙입니다.
| 호출 | 결과 |
|---|---|
{{concat 1 2}} | "12" |
{{concat 'hello' 'world' 2}} | "helloworld2" |
{{concat 1 2 3 variable}}, variable이 {"hello":"world"} | "123[object Object]" |
배열을 문자열로 이어 붙일 때에는 변환 기준을 명시할 수 있습니다. array1이 ["hello","world"], array2가 ["again","and again"]인 경우 다음 호출은 "hello,worldagain,and again"을 만듭니다.
{{concat (toString array1) (toString array2)}}
substring
문자열과 시작 인덱스 및 선택적인 끝 인덱스를 JavaScript substring()에 전달합니다. 시작은 포함하고 끝은 포함하지 않습니다.
| 호출 | 결과 |
|---|---|
{{substring 'foo' 0 1}} | "f" |
{{substring 'foo' 0 6}} | 끝을 문자열 길이까지 사용하여 "foo" |
{{substring 'foo' 1}} | 끝까지 사용하여 "oo" |
contains
문자열 또는 배열에서 indexOf(searchValue) !== -1로 포함 여부를 확인합니다. 값이 없으면 false입니다.
- variable이
[1,2,3]일 때{{contains variable 3}}은 true입니다. - variable이
"hello world"일 때{{contains variable 'hello'}}은 true입니다.
jsonParse
JSON 문자열을 파싱합니다. 이 helper의 입력은 String이어야 합니다.
| 호출과 입력 | 결과 또는 오류 |
|---|---|
{{jsonParse '"foo"'}} | 문자열 "foo" |
{{jsonParse varA}}, varA가 JSON 문자열 ["hello","world"] | 배열 ["hello","world"] |
같은 호출, varA가 JSON 문자열 {"varA":{"hello":"world","foo":["bar","baz"]}} | 해당 객체 |
{{jsonParse 123}} | jsonParse: Error: value must be a string |
varA가 잘못된 문자열 ["hello",인 경우 | jsonParse: SyntaxError: Unable to parse JSON string |
jsonStringify
값을 JavaScript JSON.stringify()로 JSON 문자열로 만듭니다.
{{jsonStringify 'foo'}}는 따옴표까지 포함한"foo"텍스트를 만듭니다.- varA가
{"hello":"world","foo":["bar","baz"]}이면{{jsonStringify varA}}는{"hello":"world","foo":["bar","baz"]}라는 JSON 문자열을 만듭니다.
Core: 숫자 계산
add, subtract, multiply와 divide는 숫자 인자 두 개를 받습니다. 예를 들어 두 번째 인자가 'abc'이면 네 helper 모두 value must be a number 오류를 냅니다.
add
두 수를 더합니다. {{add 20 5}}는 25입니다.
subtract
첫 수에서 둘째 수를 뺍니다. {{subtract 20 5}}는 15입니다.
multiply
두 수를 곱합니다. {{multiply 20 5}}는 100입니다.
divide
첫 수를 둘째 수로 나눕니다. {{divide 20 5}}는 4입니다.
max
숫자 또는 숫자 배열들을 받아 최댓값을 구합니다.
- variable이
[1,2,3]이면{{max variable}}은 3입니다. - 같은 입력에서
{{max variable 12 15}}는 15입니다. {{max 'hello' 123}}이나 문자열 배열["hello","world"]를 넣은 호출은value must be a number or a number array오류입니다.
min
숫자 또는 숫자 배열들을 받아 최솟값을 구합니다.
- variable이
[1,2,3]이면{{min variable}}은 1입니다. - 같은 입력에서
{{min variable 6 10}}도 1입니다. {{min 'hello' 123}}이나 문자열 배열["hello","world"]를 넣은 호출은value must be a number or a number array오류입니다.
Core: 비교와 논리
eq, ne, lt, le, gt와 ge는 같은 유형의 숫자 두 개 또는 문자열 두 개를 비교합니다. 다른 유형끼리 비교하거나 배열처럼 지원하지 않는 유형을 넣으면 type mismatch 오류가 발생합니다. 예를 들어 arrayValue가 [1,2]이면 {{eq arrayValue 5}}는 이 오류에 해당합니다.
eq
같은지 비교합니다. {{eq 1 1}}은 true입니다. name이 "Steven"인 다음 예는 첫 문장을 표시합니다.
{{#if (eq name 'Steven')}}
Your name is Steven.
{{else}}
Your name is not Steven.
{{/if}}
ne
다른지 비교합니다. {{ne 1 1}}은 false입니다.
lt
첫 값이 둘째 값보다 작은지 비교합니다. {{lt 1 2}}는 true입니다.
le
첫 값이 둘째 값 이하인지 비교합니다. {{le 1 1}}은 true입니다.
gt
첫 값이 둘째 값보다 큰지 비교합니다. {{gt 2 1}}은 true입니다.
ge
첫 값이 둘째 값 이상인지 비교합니다. {{ge 1 1}}은 true입니다.
and
Boolean 인자 두 개 이상에 AND를 적용합니다. var1이 true, var2가 false이면 {{and var1 var2}}는 false입니다.
or
Boolean 인자 두 개 이상에 OR를 적용합니다. 같은 입력에서 {{or var1 var2}}는 true입니다.
not
Boolean 인자 하나를 반전합니다. var가 true이면 {{not var}}는 false입니다.
Core: URL과 표시값 조회
encodeURI
문자열을 JavaScript encodeURI()로 인코딩합니다. {{encodeURI 'hello world?'}}는 "hello%20world?"입니다. 전체 URI의 구분 문자 일부는 유지합니다.
encodeURIComponent
문자열을 JavaScript encodeURIComponent()로 인코딩합니다. {{encodeURIComponent 'hello world?'}}는 "hello%20world%3F"입니다. URL의 개별 질의 값 등을 넣을 때 사용합니다.
두 helper 모두 [1,2,3] 같은 문자열이 아닌 값을 넣으면 value must be a string 오류를 냅니다.
getSelectedDisplayValue
values와 displayValues 배열에서 selectedValue에 해당하는 표시값을 찾습니다.
values=[1,2,3], displayValues=["a","b","c"], selectedValue=2인 경우 {{getSelectedDisplayValue values displayValues selectedValue}}의 예제 반환값은 ["b"]입니다.
values나 displayValues는 배열이어야 합니다. values가 "hello"이면 values must be an array 오류가 발생합니다. selectedValue가 4처럼 values에 없으면 selectedValue '4' is not in values 오류입니다.
getSelectedDisplayValues
다중 선택의 표시값들을 찾습니다. values와 displayValues 외에 selectedValues도 배열이어야 합니다.
values=[1,2,3], displayValues=["a","b","c"], selectedValues=[2,3]에서 {{getSelectedDisplayValues values displayValues selectedValues}}는 ["b","c"]입니다.
values가 "hello"인 잘못된 입력은 values must be an array 오류입니다. selectedValues에 4가 있으면 selectedValue '4' is not in values 오류가 발생합니다.
lookup
기본 Handlebars lookup처럼 동적으로 객체 속성이나 배열 원소를 찾으며 Slate에서는 여러 속성의 경로도 이어서 지정할 수 있습니다.
입력이 {"a":{"b":{"c":"test"}}}이면 {{lookup a 'b' 'c'}}는 "test"입니다.
Widget helper
formatNumber
숫자를 Numeral.js 형식 문자열로 표시합니다. 값은 Number, format은 String이어야 합니다.
| 호출과 입력 | 결과 또는 오류 |
|---|---|
{{formatNumber 1400 '0,0'}} | "1,400" |
{{formatNumber 'abc' '0,0'}} | value must be a number |
{{formatNumber 1400 variable}}, variable이 {"hello":"world"} | format must be a string |
formatDate
날짜를 Moment.js 형식 문자열로 표시합니다. 유효한 날짜값과 String format이 필요합니다.
| 호출과 입력 | 결과 또는 오류 |
|---|---|
{{formatDate '2014-01-02' 'MM/DD/YYYY'}} | "01/02/2014" |
{{formatDate 1237705200000 'YYYY-MM-DD'}} | 날짜 표시 예는 "2009-03-22"입니다. |
{{formatDate 'some string' 'YYYY-MM-DD'}} | value must be a valid date |
{{formatDate '2014-01-02' variable}}, variable이 {"hello":"world"} | format must be a string |
HttpJson Foundry helper
HttpJson Foundry query는 Spark SQL 문법을 사용합니다. 아래 joinParams와 다음 절의 SQL query용 helper를 구분합니다.
joinParams
배열의 각 매개변수를 작은따옴표로 감싸고 쉼표로 연결합니다. 다음은 질의에 들어갈 SQL 템플릿입니다.
SELECT * FROM `table1` WHERE name IN ({{joinParams names}})
names가 ["Bill","John J.","Sam's","Jay"]이면 SQL 조각은 다음과 같습니다.
SELECT * FROM `table1` WHERE name IN ('Bill', 'John J.', 'Sam\'s', 'Jay')
배열 대신 name="Bill"을 {{joinParams name}}에 전달하면 parameters must be an array in joinParams helper 오류가 발생합니다.
SQL query helper
SQL query의 식별자는 alias, schema, table, column으로 처리하고 비교값은 param으로 바인딩합니다. 아래 예제의 table1, id, text와 스키마 이름들은 설명용 데이터 소스 구성입니다. 실제 연결 소스의 카탈로그와 자료형에 맞게 사용합니다.
alias
임시 열 또는 테이블 이름을 등록하여 식별자 검사에서 사용할 수 있게 합니다. 인자는 상수 문자열이어야 하며 변수 참조를 넣으면 거부합니다.
열 별칭의 예입니다. aliasColumnName 변수는 "alias_column_name"입니다.
SELECT id AS {{alias 'alias_column_name'}}
FROM table1
ORDER BY {{column aliasColumnName}};
대소문자나 공백을 보존해야 하는 별칭에는 연결 데이터베이스의 식별자 인용 문법을 사용합니다. 큰따옴표 식별자를 사용하는 소스의 예는 다음과 같습니다. aliasColumnName은 "Alias Column Name"입니다.
SELECT id AS "{{alias 'Alias Column Name'}}"
FROM table1
ORDER BY "{{column aliasColumnName}}";
테이블 별칭도 상수로 등록합니다.
SELECT t.id FROM table1 AS {{alias 't'}};
{{alias aliasColumnName}}처럼 변수로 별칭을 등록할 수는 없습니다. 임시 이름을 동적으로 등록하면 schema, table과 column의 이름 검증 목적을 우회할 수 있기 때문입니다.
schema
스키마 이름이 상수로 지정한 허용 목록과 데이터 소스의 정보 카탈로그에 모두 있는지 검사합니다.
SELECT * FROM {{schema schemaName 'schema1' 'schema2'}}.table1;
schemaName이 "schema1"이면 schema1.table1을 사용합니다. 다음 조건은 실행 시 오류입니다. 미리보기에 이름이 보이더라도 검사를 통과한 것은 아닙니다.
| 조건 | 오류 |
|---|---|
schemaNameNotInList가 허용 목록에 없음 | schema name must be in the list of the whitelist names. |
| 허용 목록에 상수 대신 templatizedName 같은 변수 참조를 추가 | References ['templatizedName'] cannot be dynamic for security reasons. |
허용 목록에 넣은 invalidSchema1이 실제 카탈로그에 없음 | Invalid schema name 오류 |
예를 들어 {{schema schemaName 'invalidSchema1'}}로 허용해도 실제 스키마가 없으면 사용할 수 없습니다.
table
테이블 이름도 상수 허용 목록과 데이터 소스의 정보 카탈로그를 모두 확인합니다.
SELECT * FROM {{table tableName 'table1' 'table2'}};
tableName이 "table1"이면 table1을 사용합니다.
| 조건 | 오류 |
|---|---|
tableNameNotInList가 허용 목록에 없음 | table name must be in the list of the whitelist names. |
| 허용 목록에 templatizedName 같은 변수 참조를 추가 | References ['templatizedName'] cannot be dynamic for security reasons. |
목록의 invalidTable1이 카탈로그에 없음 | Invalid table name 'invalidTable1'. |
column
열 이름 하나 또는 열 이름 배열이 데이터 소스의 정보 카탈로그에 있는지 확인합니다.
| 템플릿과 입력 | 렌더링되는 SQL |
|---|---|
SELECT {{column columnName}} FROM table1;, columnName이 "column1" | SELECT column1 FROM table1; |
SELECT "{{column columnName}}" FROM table1;, columnName이 "Column 1" | SELECT "Column 1" FROM table1; |
SELECT {{column columnNames}} FROM table1;, columnNames가 ["column1","column2"] | SELECT column1, column2 FROM table1; |
큰따옴표 예는 해당 식별자 인용 문법을 쓰는 데이터베이스용입니다. invalidColumn1처럼 없는 열은 Invalid column name 'invalidColumn1'. 오류입니다.
param
일반 실행에서는 값을 매개변수 목록에 보관하고 SQL 자리에 ?를 넣어 prepared statement로 전달합니다. 배열은 원소 수에 맞는 여러 ?로 확장합니다.
| SQL 템플릿과 parameter1 | 실행 SQL의 조건 | 매개변수 목록 |
|---|---|---|
SELECT * FROM table1 WHERE id = {{param parameter1}};, 1234 | id = ? | [1234] |
SELECT * FROM table1 WHERE text IN ({{param parameter1}});, ["some","text"] | text IN (?, ?) | ["some","text"] |
SELECT * FROM table1 WHERE text = {{param (toString parameter1)}};, 1234 | text = ? | ["1234"] |
SELECT * FROM table1 WHERE id = {{param (toNumber parameter1)}};, "1234" | id = ? | [1234] |
SELECT * FROM table1 WHERE text LIKE {{param (concat '%' parameter1 '%')}};, "some text" | text LIKE ? | ["%some text%"] |
자료형 변환은 바인딩할 값과 실제 데이터베이스 열의 유형에 맞춥니다. 날짜 등 다른 데이터베이스 자료형이 필요하면 해당 SQL 소스의 형 변환 문법도 사용합니다.
Preview mode는 렌더링 결과 확인과 디버깅용이며 매개변수값을 표시합니다. 앞의 숫자 예는 SELECT * FROM table1 WHERE id = 1234;, 문자열 배열 예는 SELECT * FROM table1 WHERE text IN ('some', 'text');로 보입니다. 일반 실행의 매개변수 바인딩과 구분합니다.
| 잘못된 입력 | 오류 |
|---|---|
| parameter1이 정의되지 않았거나 null인 값 | Error: parameter value cannot be null in param helper |
parameter1이 ["some",null]인 배열 | Error: parameter array cannot have null value in param helper |