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

Velocity 활용하기 - #if / #elseif / #else

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

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

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