이 글은 Velocity Script 개발자를 대상으로 하며, Velocity의 조건문과 활용 Tip에 대해 소개합니다.
Velocity의 조건문은 #if
… #end
쌍으로 작성합니다.
If / ElseIf / Else #
#if
지시어는 웹 페이지가 생성될 때 조건문이 참(true)일 경우 텍스트를 포함할 수 있도록 합니다.
#if( $foo )
<strong>Velocity!</strong>
#end
위의 코드에서 변수 $foo가 참인지 확인하는 두 가지 경우가 있습니다.
1. $foo가 참 값을 갖는 boolean(true/false)일 때
2. null이 아닐 때
Velocity 컨텍스트에는 객체만 포함되므로 ‘boolean’이라고 말하면 Boolean(클래스)으로 표시됩니다.
이는 boolean을 반환하는 메서드의 경우에도 마찬가지입니다. 자체 검사 인프라는 동일한 논리 값의 Boolean을 반환합니다.
#if
와 #end
사이의 내용은 평가가 참일 경우 출력됩니다. 이 경우 $foo가 참이면 출력은 “Velocity!“가 됩니다.
반대로, $foo가 null 값이거나 boolean false인 경우 조건문은 거짓으로 평가되며 출력이 없습니다.
#if
요소와 함께 #elseif
또는 #else
요소를 사용할 수 있습니다. Velocity Templating Engine (VTL) 은 참으로 평가된 첫 번째 표현식에서 중지됩니다.
다음 예제에서는 $foo의 값이 15이고 $bar의 값이 6이라고 가정합니다.
#if( $foo < 10 )
**Go North**
#elseif( $foo == 10 )
**Go East**
#elseif( $bar == 6 )
**Go South**
#else
**Go West**
#end
이 예제에서 $foo는 10보다 크므로 처음 두 비교는 실패합니다. 다음 $bar는 6과 비교되며 이는 참이므로 출력은 “Go South” 입니다.
관계 연산자 #
Velocity는 등가 연산자”==“를 사용하여 변수 간의 관계를 결정합니다. 다음은 등가 연산자가 사용되는 방법을 보여주는 간단한 예입니다.
#set ($foo = "deoxyribonucleic acid")
#set ($bar = "ribonucleic acid")
#if ($foo == $bar)
In this case it's clear they aren't equivalent. So...
#else
They are not equivalent and this will be the output.
#end
Velocity에서 “==“의 의미는 객체 동일성에만 사용될 수 있는 Java와 약간 다릅니다. 등가 연산자를 사용하여 숫자, 문자열 또는 객체를 직접 비교할 수 있습니다.
객체의 클래스가 서로 다른 경우 각 객체에 대해 toString()
을 호출하여 문자열 표현을 얻은 후 비교합니다.
논리 연산자 #
Velocity에는 논리 AND, OR, NOT 연산자도 있습니다. 다음은 논리 AND, OR, NOT 연산자의 사용을 보여주는 예입니다.
AND #
논리 AND 연산자는 모두 true인 경우에만 true로 평가됩니다.
## logical AND
#if( $foo && $bar )
** This AND that**
#end
$foo가 false이면 표현식은 false로 평가되고 $bar는 평가되지 않습니다.
$foo가 true이면 VTL은 $bar의 값을 확인합니다. $bar가 true이면 전체 표현식이 true이므로 “This AND that“이 출력되고, $bar가 false이면 전체 표현식이 false이므로 출력이 없습니다.
OR #
논리 OR 연산자는 전체 표현식이 true로 간주되려면 참조 중 하나만 true로 평가되어야 한다는 점을 제외하면 동일한 방식으로 작동합니다.
## logical OR
#if( $foo || $bar )
**This OR That**
#end
$foo가 참이면 VTL은 $bar를 볼 필요가 없습니다. $bar가 true인지 false인지에 관계없이 표현식은 true가 되며 “This OR That“이 출력됩니다.
$foo가 false이면 $bar를 확인해야 합니다. 이 경우 $bar도 false이면 표현식은 false로 평가되어 출력이 없고, $bar가 true이면 전체 표현식이 true이므로 “This OR That“이 출력됩니다.
NOT #
논리 NOT 연산자에는 인수가 하나만 있습니다.
##logical NOT
#if( !$foo )
**NOT that**
#end
여기서 $foo가 true이면 !$foo는 false로 평가되고 출력이 없습니다.
$foo가 false이면 !$foo는 true로 평가되고 “NOT that“이 출력됩니다. ( ※ quiet reference $!foo와 혼동하지 않도록 주의! )
Etc. #
이외에도 eq, ne, or, not, gt, ge, lt 및 le를 포함한 모든 논리 연산자의 텍스트 버전이 있습니다.
연산자 이름 | 기호 | 대체 기호 | 예제 |
---|---|---|---|
Equals Number (숫자) | == | eq | #if( $foo == 42 ) |
Equals String (문자열) | == | eq | #if( $foo == “bar” ) |
Object Equivalence (객체) | == | eq | #if( $foo == $bar ) |
Not Equals | != | ne | #if( $foo != $bar ) |
Greater Than | > | gt | #if( $foo > 42 ) |
Less Than | < | lt | #if( $foo < 42 ) |
Greater Than or Equal To | >= | ge | #if( $foo >= 42 ) |
Less Than or Equal To | <= | le | #if( $foo <= 42 ) |
Boolean NOT | ! | not | #if( !$foo ) |
Tip #
유용한 Tip이 하나 있습니다.
#else 지시어 바로 뒤에 텍스트를 포함하려면, 이를 구분하기 위해 지시어를 중괄호 { }
를 사용하여 다음 텍스트와 구별해야 합니다.
모든 지시어는 중괄호로 구분할 수 있지만, 주로 #else
에서 유용합니다.
#if( $foo == $bar)it's true!#{else}it's not!#end
헤쳐모여! #
VTL의 조건문에 대해 모두 알게 되었습니다.
마무리를 장식하기 위해 조건문과 유용한 Tip을 활용해 학생들을 모두 소집해보겠습니다.
학생들은 번호 순서대로 자신의 번호와 이름을 외칩니다.
단, 첫 번째 학생은 먼저 “기준!” 이라고 선창해야 합니다.
그리고 마지막 학생은 자신의 번호와 이름을 말한 뒤, “번호 끝!“으로 자신이 마지막임을 알려야 합니다.
#set($students = [
{"id": 1, "name": "홍길동"},
{"id": 2, "name": "이미자"},
{"id": 3, "name": "김철수"},
{"id": 4, "name": "박영희"}
])
#foreach($student in $students)
#if( $velocityCount == 1 )
기준!<br>
#end
#if( $velocityCount != $students.size() )$student.id번 $student.name<br>#{else}, 번호 끝!#end
#end
코드 출력 결과입니다.
학생들 모두 헤쳐모여!
기준!
1번 홍길동
2번 이미자
3번 김철수
4번 박영희, 번호 끝!
참고
https://velocity.apache.org/engine/1.7/user-guide.html#conditionals