이 글은 Velocity Script 개발자를 대상으로 하며, Velocity의 표기법(Notaion)의 종류와 각 표기법에 대해 설명합니다.
Velocity의 표기법에는 인덱스, 정식 참조, 조용한 참조 표기법이 있습니다.
1. 인덱스 표기법 (Index Notation) #
$foo[0]
형태의 표기법은 객체의 특정 인덱스(색인)에 접근할 때 사용할 수 있습니다.
이 표기법은 객체의 get(Object)
메서드를 호출하는 것과 동일하며, 이러한 연산에 대한 문법적 축약 표현을 제공합니다.
인덱스 표기법은 다음과 같은 상황에서 유효하게 사용할 수 있습니다.
$foo[0] ## Integer 인덱스 조회하는 경우
$foo[$i] ## 다른 참조를 인덱스로 사용하는 경우
$foo["bar"] ## $foo가 Map일 때 String을 인덱스로 사용하는 경우
이 대괄호 표기법은 Java 배열에서도 유효합니다.
Velocity가 배열을 래핑하여 get(Integer)
메서드를 제공하므로 배열에서 특정 요소를 반환할 수 있습니다.
또한 대괄호 표기법은 .get
이 유효한 모든 곳에서 사용할 수 있습니다.
$foo.bar[1].junk
$foo.callMethod()[1]
$foo["apple"][4]
인덱스 표기법을 사용해 참조를 설정할 수도 있습니다.
#set($foo[0] = 1)
#set($foo.bar[1] = 3)
#set($map["apple"] = "orange")
지정된 요소에 주어진 값이 설정됩니다.
Velocity는 먼저 set
메서드를 시도하고, 그다음 put
메서드를 시도하여 할당을 수행합니다.
2. 정식 참조 표기법 (Formal Reference Notation) #
위의 예시에서는 참조에 대한 축약 표기법을 사용했지만 정식 참조 표기법(Formal Notation)도 존재합니다.
${mudSlinger}
${customer.Address}
${purchase.getTotal()}
대부분의 경우 축약 표기법을 사용하지만 몇몇 경우에는 올바른 처리를 위해 정식 표기법을 사용해야 합니다.
예시로 $vice
를 문장의 기본 단어로 사용하여 문장을 즉석에서 구성한다고 가정해 보겠습니다.
목표는 누군가가 기본 단어를 선택하고 “Jack is a pyromaniac.” 또는 “Jack is a kleptomaniac.” 라는 두 가지 결과 중 하나를 생성하는 것입니다.
이런 경우에는 축약 표기법을 사용하는 것이 부적절합니다.
Jack is a $vicemaniac.
이 문장은 모호하며, Velocity는 $vice
가 아닌 $vicemaniac
이 사용자가 사용하려는 식별자라고 생각합니다.
$vicemaniac
에 대한 값이 없으면 그대로 $vicemaniac
이 반환됩니다.
정식 표기법을 사용하면 이 문제를 해결할 수 있습니다.
Jack is a ${vice}maniac.
이제 Velocity는 $vicemaniac
이 아닌 $vice
가 참조임을 인식합니다.
정식 표기법은 참조가 텍스트와 바로 인접해 있는 경우에 유용하게 사용할 수 있습니다.
3. 조용한 참조 표기법 (Quiet Reference Notation) #
Velocity는 정의되지 않은 참조를 발견하면 일반적으로 해당 참조 이미지를 출력합니다.
예를 들어, 다음과 같은 참조가 VTL 템플릿의 일부로 포함되어 있다고 가정해 보겠습니다.
<input type="text" name="email" value="$email"/>
폼이 처음 로드되면 $email
참조 변수에 값이 없을 경우, “$email” 보다는 빈 텍스트 필드 "" 이 표시되는 것이 적절해 보입니다.
이러한 경우에 조용한 참조 표기법(Quiet Reference Notation)을 사용하면 Velocity의 일반적인 동작을 피할 수 있습니다.
$email
을 사용하는 대신 $!email
을 사용하면 됩니다.
<input type="text" name="email" value="$!email"/>
이제 폼이 처음 로드되고 $email
에 값이 없으면 “$email” 대신 빈 문자열이 출력됩니다.
아래 예시처럼 정식 참조 표기법과 조용한 참조 표기법을 함께 사용할 수도 있습니다.
<input type="text" name="email" value="$!{email}"/>
4. $! vs !$ #
VTL에서 $!
와 !$
는 모두 참조를 처리하는 표기법이지만 !
의 위치에 따라 그 의미와 용도가 완전히 다른 참조입니다.
1️⃣ $! : 조용한 참조 #
$!
는 정의되지 않은 변수를 조용하게 처리하여 빈 문자열을 출력합니다.
2️⃣ !$ : 논리적 부정 #
!$
는 논리적 부정으로, 변수의 참/거짓 값을 반대로 평가합니다.
☑ 요약 #
표기법 | 설명 | 사용 예시 |
---|---|---|
$! |
정의되지 않은 변수를 처리할 때 빈 문자열 반환 | $!email |
!$ |
논리적 부정 연산을 의미하며, 불리언 값의 참/거짓을 반대로 평가 | !$isAdmin |
참고
https://velocity.apache.org/engine/1.7/user-guide.html#quiet-reference-notation