본문으로 건너뛰기
  1. Posts/

Velocity 활용하기 - 표기법(Notation)

·3 분· loading · loading ·
Jeong
Techtopic Velocity Notation
RedBeanSoft
작성자
RedBeanSoft
Siemens 의 PLM/ALM/CAD 분야 전문 파트너입니다.
작성자
jeong
There is no end to learning, but there are many beginnings.
Velocity 활용하기 - 이 글은 시리즈의 일부입니다.
부분 3: 이 글

이 글은 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

Velocity 활용하기 - 이 글은 시리즈의 일부입니다.
부분 3: 이 글

관련 글

Velocity 활용하기 - #if / #elseif / #else
·4 분· loading · loading
Jeong
Techtopic Velocity Conditionals

이 글은 Velocity Script 개발자를 대상으로 하며, Velocity의 조건문과 활용 Tip에 대해 소개합니다.

Velocity의 조건문은 #if#end 쌍으로 작성합니다.