<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NVelocity 튜토리얼 &#8211; FoxDevelop</title>
	<atom:link href="https://www.foxdevelop.com/ko/category/c-ko/c-%eb%9d%bc%ec%9d%b4%eb%b8%8c%eb%9f%ac%eb%a6%ac/nvelocity-%ed%8a%9c%ed%86%a0%eb%a6%ac%ec%96%bc/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.foxdevelop.com</link>
	<description>독립 소프트웨어 개발 스튜디오</description>
	<lastBuildDate>Fri, 14 Aug 2026 03:50:22 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://www.foxdevelop.com/wp-content/uploads/2026/05/fox-svgrepo-com-1.png</url>
	<title>NVelocity 튜토리얼 &#8211; FoxDevelop</title>
	<link>https://www.foxdevelop.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>이스케이프와 if 조건문</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ec%9d%b4%ec%8a%a4%ec%bc%80%ec%9d%b4%ed%94%84%ec%99%80-if-%ec%a1%b0%ea%b1%b4%eb%ac%b8/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ec%9d%b4%ec%8a%a4%ec%bc%80%ec%9d%b4%ed%94%84%ec%99%80-if-%ec%a1%b0%ea%b1%b4%eb%ac%b8/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:50:22 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8530</guid>

					<description><![CDATA[역슬래시 이스케이프 + #if 조건 판단 문법 1. 역슬래시 \ 이스케이프 규칙 미리 선언한 변수：#set($dog = "woof woof") VTL 코드 렌더링 결과 원리 설명 $dog woof woof 변수를 정상적으로 해석 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">역슬래시 이스케이프 + #if 조건 판단 문법</p>



<h4 class="wp-block-heading">1. 역슬래시 \ 이스케이프 규칙</h4>



<p class="wp-block-paragraph">미리 선언한 변수：<code>#set($dog = "woof woof")</code></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>VTL 코드</th><th>렌더링 결과</th><th>원리 설명</th></tr></thead><tbody><tr><td><code>$dog</code></td><td>woof woof</td><td>변수를 정상적으로 해석</td></tr><tr><td><code>\$dog</code></td><td>$dog</td><td><strong>단일 역슬래시</strong>：바로 뒤의 <code>$</code>를 이스케이프, 변수 해석을 취소하고 그대로 출력</td></tr><tr><td><code>\\$dog</code></td><td>\woof woof</td><td>첫 번째 <code>\</code>가 두 번째 <code>\</code>를 이스케이프 → <code>\</code> 출력；<br>남은 <code>$dog</code>는 변수로 해석</td></tr><tr><td><code>\\\$dog</code></td><td>\$dog</td><td><code>\\</code>는 <code>\</code> 출력, <code>\$</code>는 <code>$</code> 출력</td></tr><tr><td><code>\\\\$dog</code></td><td>\woof woof</td><td><code>\\</code>가 <code>\</code> 출력, <code>\\</code>가 <code>\</code> 출력；<br><code>$dog</code> 변수 해석</td></tr></tbody></table></figure>



<ol class="wp-block-list">
<li>Velocity 변수명은<strong>반드시 문자로 시작</strong>해야 합니다. <code>$10.0</code>은 변수로 인식하지 않고 그대로 출력하므로 <code>마이크로소프트 $10.0 달러</code>처럼 쓸 때 별도 이스케이프 불필요；</li>



<li><strong>연속된 역슬래시는 두 개씩 상쇄</strong>；<code>\$</code> 조합만 달러 기호를 이스케이프할 수 있음；</li>



<li>페이지에 <code>$변수이름</code>을 그대로 보여주려면 표준 문법：<code>\$dog</code>。</li>
</ol>



<h4 class="wp-block-heading">2. #if 분기 조건 문법</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($ages = 22)</span>
<span class="hljs-comment">#if ($ages &lt;13)</span>
    &lt;h1&gt;당신은 어린이입니다&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;18)</span>
    &lt;h1&gt;당신은 청소년입니다&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;35)</span>
    &lt;h1&gt;당신은 청년입니다&lt;/h1&gt;
<span class="hljs-comment">#elseif ($ages &lt;60)</span>
    &lt;h1&gt;당신은 중년입니다&lt;/h1&gt;
<span class="hljs-comment">#else</span>
    &lt;h1&gt;당신은 노년입니다&lt;/h1&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<h5 class="wp-block-heading">실행 결과</h5>



<p class="wp-block-paragraph"><code>$ages=22</code>，<code>22 &lt; 35</code> 조건 만족 → 출력：<code>&lt;h1&gt;당신은 청년입니다&lt;/h1&gt;</code></p>



<h5 class="wp-block-heading">주의사항</h5>



<ol class="wp-block-list">
<li>블록 끝에<strong>반드시 <code>#end</code></strong>를 적어 닫아야 합니다. 빠지면 오류 발생；</li>



<li>키워드：<code>#elseif</code>（<strong><code>#else if</code>처럼 공백 넣으면 안 됩니다</strong>，잘못된 문법）；</li>



<li>조건에서 사용 가능：<code>&lt; > &lt;= >= == != &amp;&amp; ||</code> 등 연산자；</li>



<li>위에서부터 순서대로 판단하며, 조건에 맞는 첫 번째 분기만 실행하고 나머지는 무시합니다.</li>
</ol>



<p class="wp-block-paragraph">이스케이프와 if 조건문</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ec%9d%b4%ec%8a%a4%ec%bc%80%ec%9d%b4%ed%94%84%ec%99%80-if-%ec%a1%b0%ea%b1%b4%eb%ac%b8/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>확장 메서드</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ed%99%95%ec%9e%a5-%eb%a9%94%ec%84%9c%eb%93%9c/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ed%99%95%ec%9e%a5-%eb%a9%94%ec%84%9c%eb%93%9c/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:45:26 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8514</guid>

					<description><![CDATA[1. 백엔드 Person 엔티티 코드(C#) C# 백엔드 코드에서 객체 변수 설정 2. VTL 템플릿 코드 &#38; 렌더링 설명 1. $pTest.getMyName() ✅ Velocity 매개변수 없는 메서드 호출：괄호() 생략 가능，$pTest.getMyName 는 $pTest.getMyName()와 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h4 class="wp-block-heading">1. 백엔드 Person 엔티티 코드(C#)</h4>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">string</span> name;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Name
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> name; }
        <span class="hljs-keyword">set</span> { name = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> Age
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> age; }
        <span class="hljs-keyword">set</span> { age = <span class="hljs-keyword">value</span>; }
    }

    <span class="hljs-comment">//매개변수 없는 생성자</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"></span>)</span>{}
    <span class="hljs-comment">//매개변수가 있는 생성자</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> name, <span class="hljs-keyword">int</span> age</span>)</span>
    {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    }

    <span class="hljs-comment">//매개변수 없는 인스턴스 메서드</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> <span class="hljs-title">getMyName</span>(<span class="hljs-params"></span>)</span>
    {
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.name;
    }

    <span class="hljs-comment">//다중 매개변수 인스턴스 메서드</span>
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> <span class="hljs-title">JoinStr</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> str1, <span class="hljs-keyword">string</span> str2</span>)</span>
    {
        <span class="hljs-keyword">return</span> str1 + str2;
    }
}</code></span></pre>


<p class="wp-block-paragraph">C# 백엔드 코드에서 객체 변수 설정</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">Person pTest = <span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Tom"</span>, <span class="hljs-number">22</span>);
context.Put(<span class="hljs-string">"pTest"</span>, pTest);</code></span></pre>


<h4 class="wp-block-heading">2. VTL 템플릿 코드 &amp; 렌더링 설명</h4>


<pre class="wp-block-code"><span><code class="hljs language-php">메서드 호출&lt;br /&gt;
$pTest.getMyName();

<span class="hljs-comment">#set($a = "hello")</span>
<span class="hljs-comment">#set($b = "foxdevelop")</span>

$pTest.JoinStr($a, $b);</code></span></pre>


<h5 class="wp-block-heading">1. <code>$pTest.getMyName()</code></h5>



<ul class="wp-block-list">
<li>객체의<strong>매개변수 없는 메서드</strong> <code>getMyName()</code> 호출</li>



<li>반환값 <code>Tom</code></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Velocity 매개변수 없는 메서드 호출：괄호<code>()</code> 생략 가능，<code>$pTest.getMyName</code> 는 <code>$pTest.getMyName()</code>와 동일</p>
</blockquote>



<h5 class="wp-block-heading">2. <code>$pTest.JoinStr($a, $b)</code></h5>



<ul class="wp-block-list">
<li>문자열 매개변수 두 개를 받는 메서드 호출</li>



<li>VTL이 먼저 <code>$a</code>、<code>$b</code>를 해석한 뒤 실인자 <code>"hello"</code>、<code>"foxdevelop"</code> 전달</li>



<li>문자열 결합 결과 반환：<code>hellofoxdevelop</code></li>
</ul>



<h4 class="wp-block-heading">요약</h4>



<ol class="wp-block-list">
<li><strong>메서드 이름은 대소문자를 엄격히 구분</strong><br>C# <code>getMyName()</code> ≠ <code>GetMyName()</code>，템플릿은 코드 표기와 일치해야 합니다.</li>



<li><strong>매개변수는 변수를 그대로 사용</strong><br>따옴표를 추가하지 마세요，<code>$pTest.JoinStr($a,$b)</code>가 올바릅니다；<code>$pTest.JoinStr("$a","$b")</code>로 쓰면 리터럴 문자열&#8221;$a&#8221;가 전달됩니다</li>



<li><strong>속성과 메서드 구분</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>$pTest.Name</code> → 속성 접근(getter)</li>



<li><code>$pTest.getMyName()</code> → 메서드 호출</li>
</ul>



<ol class="wp-block-list">
<li><strong>반환값 자동 출력</strong><br>템플릿에 <code>$객체.메서드()</code>를 적으면 Velocity가 반환값을 자동으로 출력；출력이 필요 없으면 <code>#set</code>으로 결과를 받습니다：</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($result = $pTest.JoinStr($a,$b))</span></code></span></pre>


<h4 class="wp-block-heading">3. 최종 페이지 렌더링 결과</h4>


<pre class="wp-block-code"><span><code class="hljs">메서드 호출
Tom;

hellofoxdevelop;</code></span></pre>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">확장 메서드</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ed%99%95%ec%9e%a5-%eb%a9%94%ec%84%9c%eb%93%9c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>변수 경계 보충 설명</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%eb%b3%80%ec%88%98-%ea%b2%bd%ea%b3%84-%eb%b3%b4%ec%b6%a9-%ec%84%a4%eb%aa%85/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%eb%b3%80%ec%88%98-%ea%b2%bd%ea%b3%84-%eb%b3%b4%ec%b6%a9-%ec%84%a4%eb%aa%85/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:31:48 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8498</guid>

					<description><![CDATA[변수 기본 설정：#set ($valok = "hello foxdevelop") 변수 경계 ${} 와 . 접근 차이 분석 코드 렌더링 결과 원리 설명 $valok hello foxdevelop 기본 변수 출력 $valok.com hello foxdevelop.com Velocity가 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">변수 기본 설정：<code>#set ($valok = "hello foxdevelop")</code></p>



<h4 class="wp-block-heading">변수 경계 <code>${}</code> 와 <code>.</code> 접근 차이 분석</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>코드</th><th>렌더링 결과</th><th>원리 설명</th></tr></thead><tbody><tr><td><code>$valok</code></td><td>hello <code>foxdevelop</code></td><td>기본 변수 출력</td></tr><tr><td><code>$valok.</code>com</td><td>hello <code>foxdevelop</code>.com</td><td>Velocity가 <code>valok</code> 객체의 <code>cn</code> 속성/메서드를 호출하려 합니다. 문자열에 <code>cn</code> 메서드가 없으므로 <strong>변수와 접미사가 그대로 출력</strong>됩니다</td></tr><tr><td><code>${valok}.com</code></td><td>hello <code>foxdevelop</code>.com</td><td><code>{}</code>가 변수 범위를 고정하며 <code>valok</code> 렌더링 뒤에 <code>.com</code> 문자열을 붙입니다(권장하는 연결 문법)</td></tr><tr><td><code>$!valok.com</code></td><td>hello<code>foxdevelop</code>.com</td><td><code>$!</code> 조용한 참조：변수가 존재하면 <code>$valok</code>와 동일하고 없을 때는 빈 문자열을 출력하며 <code>$xxx</code>를 그대로 보여주지 않습니다</td></tr><tr><td><code>${valok.com}</code></td><td><strong>빈 값</strong></td><td><code>valok.com</code> 속성을 읽으려 시도합니다. 문자열에 <code>com</code> 속성이 없어 변수가 없는 것으로 처리됩니다. 빈 값을 원한다면 <code>$!{valok.com}</code>을 사용하세요</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><br><code>${valok}.cn</code> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 변수 + 접미사 연결<br><code>${valok.cn}</code> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> valok 객체 안의 cn 속성 접근</p>



<h4 class="wp-block-heading">작은따옴표 / 큰따옴표 &amp; 변수 붙여쓰기</h4>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>코드</th><th>렌더링 결과</th><th>원리 설명</th></tr></thead><tbody><tr><td><code>what$valok</code></td><td>whathello <code>foxdevelop</code></td><td>직접 연결, Velocity가 자동으로 변수 경계를 인식</td></tr><tr><td><code>what$"valok"</code></td><td>what$&#8221;valok&#8221;</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />문법 오류. <code>$</code> 바로 뒤에 따옴표를 쓸 수 없어 변수를 분석할 수 없음</td></tr><tr><td><code>what"$valok"</code></td><td>what&#8221;hello <code>foxdevelop</code>&#8220;</td><td>따옴표는 일반 문자일 뿐 템플릿 안에서 문자열 구문으로 작동하지 않고 변수는 정상 처리됨</td></tr><tr><td><code>what'$valok'</code></td><td>what&#8217;hello <code>foxdevelop</code>&#8216;</td><td>위와 동일, 작은따옴표도 평범한 문자</td></tr><tr><td><code>$valokwhat</code></td><td>$valokwhat</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />변수 인식 불가! Velocity가 <code>valokwhat</code> 전체를 변수명으로 보고 없으면 원문을 출력</td></tr><tr><td><code>${valok}what</code></td><td>hello <code>foxdevelop</code>what</td><td><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />중괄호로 범위를 고정, 변수와 글자가 붙는 문제 해결</td></tr></tbody></table></figure>



<h4 class="wp-block-heading">정리</h4>



<ol class="wp-block-list">
<li><strong>변수가 다른 글자와 이어질 때 반드시 <code>${변수이름}</code> 사용</strong><br>잘못된 예：<code>$valokwhat</code>；올바른 예：<code>${valok}what</code></li>



<li><strong>접미사 붙일 때：<code>${valok}.cn</code> 이지 <code>${valok.cn}</code>으로 쓰지 마세요</strong></li>



<li><strong><code>$!변수</code> 조용한 참조</strong>：변수가 없으면 빈 값이 나오고 <code>$xxx</code>가 출력되지 않음</li>



<li><strong>템플릿 HTML 안의 따옴표는 그냥 문자</strong>；<strong>#set 할당 구문 안에서만</strong> 작은따옴표(변수 해석 안함), 큰따옴표(변수 해석함) 차이가 생깁니다</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($a = "$valok") // 큰따옴표：변수 해석, a=hello bamn</span>
<span class="hljs-comment">#set($a = '$valok') // 작은따옴표：변수 해석 안함, a=$valok</span></code></span></pre>


<p class="wp-block-paragraph">변수 경계 보충 설명</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%eb%b3%80%ec%88%98-%ea%b2%bd%ea%b3%84-%eb%b3%b4%ec%b6%a9-%ec%84%a4%eb%aa%85/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>컬렉션 순회</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ec%bb%ac%eb%a0%89%ec%85%98-%ec%88%9c%ed%9a%8c/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ec%bb%ac%eb%a0%89%ec%85%98-%ec%88%9c%ed%9a%8c/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:19:12 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8482</guid>

					<description><![CDATA[Velocity #foreach 컬렉션 및 객체 순회 1. 문자열 List 순회하기 C# 백엔드 코드 Velocity 템플릿 코드 실행 결과: 리스트의 각 문자열을 반복해서 가져오고 줄 바꿈하여 출력합니다. 문법 설명 #foreach(반복변수 in ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Velocity #foreach 컬렉션 및 객체 순회</p>



<h4 class="wp-block-heading">1. 문자열 List 순회하기</h4>



<h5 class="wp-block-heading">C# 백엔드 코드</h5>


<pre class="wp-block-code"><span><code class="hljs language-cs">List&lt;<span class="hljs-keyword">string</span>&gt; strList = <span class="hljs-keyword">new</span> List&lt;<span class="hljs-keyword">string</span>&gt;() {<span class="hljs-string">"dsd"</span>,<span class="hljs-string">"sdfsd"</span>,<span class="hljs-string">"asdfsd"</span>,<span class="hljs-string">"asdfsdfsd"</span>};
context.Put(<span class="hljs-string">"strList"</span>, strList);</code></span></pre>


<h5 class="wp-block-heading">Velocity 템플릿 코드</h5>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#foreach($str in $strList)</span>
    $str &lt;br/&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<p class="wp-block-paragraph">실행 결과: 리스트의 각 문자열을 반복해서 가져오고 줄 바꿈하여 출력합니다.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="406" height="184" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16.png" alt="" class="wp-image-7102" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16.png 406w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-16-300x136.png 300w" sizes="(max-width: 406px) 100vw, 406px" /></figure>



<h5 class="wp-block-heading">문법 설명</h5>



<p class="wp-block-paragraph"><code>#foreach(반복변수 in 컬렉션)</code> 로 반복문을 시작하고 <code>#end</code> 로 반복문을 마칩니다.</p>



<h4 class="wp-block-heading">2. 사용자 정의 엔티티 클래스 List 순회</h4>



<h5 class="wp-block-heading">1. Person 엔티티(C#)</h5>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Person</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">string</span> name;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">string</span> Name
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> name; }
        <span class="hljs-keyword">set</span> { name = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">int</span> age;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> Age
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> age; }
        <span class="hljs-keyword">set</span> { age = <span class="hljs-keyword">value</span>; }
    }
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"></span>)</span>{}
    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">Person</span>(<span class="hljs-params"><span class="hljs-keyword">string</span> name,<span class="hljs-keyword">int</span> age</span>)</span>
    {
        <span class="hljs-keyword">this</span>.name = name;
        <span class="hljs-keyword">this</span>.age = age;
    }
}</code></span></pre>


<h5 class="wp-block-heading">2. 백엔드에서 List 구성</h5>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">List</span>&lt;Person&gt; pList = <span class="hljs-keyword">new</span> <span class="hljs-keyword">List</span>&lt;Person&gt;();
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Jack"</span>, <span class="hljs-number">1</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Ben"</span>, <span class="hljs-number">11</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Kevin"</span>, <span class="hljs-number">100</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Simon"</span>, <span class="hljs-number">500</span>));
pList.Add(<span class="hljs-keyword">new</span> Person(<span class="hljs-string">"Lulu"</span>, <span class="hljs-number">20</span>));
context.Put(<span class="hljs-string">"pList"</span>, pList);</code></span></pre>


<h5 class="wp-block-heading">3. 템플릿에서 속성 접근 문법</h5>



<p class="wp-block-paragraph">템플릿 코드:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">#foreach($per in $pList)
<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end</code></span></pre>


<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong>데이터를 읽어올 수 없습니다! 오류가 발생하거나 빈 화면이 표시됩니다</strong></p>



<h4 class="wp-block-heading">근본 원리</h4>



<p class="wp-block-paragraph">Velocity 객체 속성 접근 규칙：<br><code>$per.xxx</code> 는 자동으로 <strong>public Get 메서드 <code>GetXxx()</code></strong> 를 찾습니다</p>



<ul class="wp-block-list">
<li><code>$per.name</code> → <code>per.getName()</code> 호출 시도</li>



<li><code>$per.age</code> → <code>per.getAge()</code> 호출 시도</li>
</ul>



<p class="wp-block-paragraph">작성한 엔티티:</p>



<ul class="wp-block-list">
<li>private 필드：<code>name</code>、<code>age</code></li>



<li><strong>public 속성은 첫 글자 대문자：<code>Name</code>、<code>Age</code></strong>，대응 메서드 <code>GetName()</code>、<code>GetAge()</code></li>
</ul>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />올바른 템플릿 작성법:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">#foreach($per in $pList)
<span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end</code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">참고: C#은 속성 첫 글자를 대문자로 사용하는 규칙이고 Java 엔티티는 보통 소문자를 사용합니다. 초보자가 자주 실수하는 대소문자 함정입니다.</p>
</blockquote>



<h4 class="wp-block-heading">3. #foreach 내장 변수</h4>



<p class="wp-block-paragraph">반복문 안에서 바로 사용할 수 있는 내장 변수입니다:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>변수</th><th>설명</th></tr></thead><tbody><tr><td><code>$foreach.index</code></td><td>현재 인덱스, <strong>0부터 시작</strong></td></tr><tr><td><code>$foreach.count</code></td><td>현재 순번, <strong>1부터 시작</strong></td></tr><tr><td><code>$foreach.first</code></td><td>첫 번째 데이터인지 여부(불리언)</td></tr><tr><td><code>$foreach.last</code></td><td>마지막 데이터인지 여부(불리언)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">예시:</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#foreach($per in $pList)</span>
    $foreach.count 、이름：$per.Name
<span class="hljs-comment">#end</span></code></span></pre>


<h4 class="wp-block-heading">4. 테이블 출력</h4>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">table</span> <span class="hljs-attr">border</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">cellpadding</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">cellspacing</span>=<span class="hljs-string">"0"</span>&gt;</span>
#foreach($per in $pList)
    <span class="hljs-tag">&lt;<span class="hljs-name">tr</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Name<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">td</span>&gt;</span>$per.Age<span class="hljs-tag">&lt;/<span class="hljs-name">td</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">tr</span>&gt;</span>
#end
<span class="hljs-tag">&lt;/<span class="hljs-name">table</span>&gt;</span></code></span></pre>


<h4 class="wp-block-heading">정리</h4>



<ol class="wp-block-list">
<li><code>#foreach(변수 in 컬렉션)</code> + <code>#end</code> 는 Velocity 표준 반복문;</li>



<li>일반 List 순회 시 <code>$변수</code> 를 직접 출력;</li>



<li>엔티티 객체 순회：<code>$객체.속성이름</code> <strong>대소문자를 정확히 일치</strong>시키고 private 필드에 접근하지 마세요;</li>



<li>C# 엔티티 속성은 첫 글자를 대문자로 통일하고 템플릿도 동일하게 작성;</li>



<li>데이터가 비어있으면 먼저 <strong>속성 대소문자, get 접근자 존재 여부</strong> 를 확인하세요.</li>
</ol>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">컬렉션 순회</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ec%bb%ac%eb%a0%89%ec%85%98-%ec%88%9c%ed%9a%8c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>주석</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ec%a3%bc%ec%84%9d-2/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ec%a3%bc%ec%84%9d-2/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 03:11:46 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8466</guid>

					<description><![CDATA[1. 템플릿 주석 구분 작성 방식 타입 특징 &#60;!-- HTML 주석 --&#62; HTML 기본 주석 최종 웹페이지 소스코드에 출력되며 브라우저 소스 보기에서 확인 가능 ## 한줄 주석 Velocity 한줄 주석 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">1. 템플릿 주석 구분</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>작성 방식</th><th>타입</th><th>특징</th></tr></thead><tbody><tr><td><code>&lt;!-- HTML 주석 --&gt;</code></td><td>HTML 기본 주석</td><td><strong>최종 웹페이지 소스코드에 출력</strong>되며 브라우저 소스 보기에서 확인 가능</td></tr><tr><td><code>## 한줄 주석</code></td><td>Velocity 한줄 주석</td><td>엔진만 인식하며 <strong>페이지에 출력되지 않음</strong>, 줄 끝까지 적용</td></tr><tr><td><code>#* 여러줄 주석 내용 *#</code></td><td>Velocity 여러줄 주석</td><td>줄바꿈 지원, <strong>페이지에 출력되지 않음</strong></td></tr></tbody></table></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">개발 권장：업무 관련 코드 주석은 <code>##</code> / <code>#* *#</code> 를 우선 사용하여 페이지 소스에 주석 내용이 노출되지 않도록 하세요.</p>
</blockquote>



<h3 class="wp-block-heading">2. 변수 명명 규칙</h3>



<p class="wp-block-paragraph">공식 기본 명명 규칙</p>



<ol class="wp-block-list">
<li>변수의 첫 글자는<strong>영문자(a‑z / A‑Z)여야 합니다</strong></li>



<li>이후 사용 가능 문자：영문자, 숫자<code>0‑9</code>, 밑줄<code>_</code>, 하이픈<code>-</code></li>
</ol>



<h4 class="wp-block-heading">하이픈 <code>-</code> 의 연산자 모호성 문제</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name-d = "test")</span></code></span></pre>


<p class="wp-block-paragraph">실행 시 오류가 발생：<code>Encountered "name" ... Was expecting one of:</code><br><strong>원인：Velocity가 <code>-</code> 를 빼기 연산자로 인식하기 때문입니다!</strong><br>엔진은 <code>$name - d</code> 로 해석하여 변수 <code>$name</code> 에서 변수 <code>d</code> 를 빼는 연산으로 판단해 문법 충돌이 생깁니다.</p>



<p class="wp-block-paragraph">두 가지 해결방법：</p>



<ol class="wp-block-list">
<li><strong>권장：밑줄을 사용한 명명</strong> (모호성 없음, 일반적인 코딩 규약)</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name_d = "hello world")</span></code></span></pre>


<ol start="2" class="wp-block-list">
<li><strong>중괄호로 변수 범위 지정</strong> (하이픈이 들어간 변수명 지원)</li>
</ol>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set(${name-d} = "hello world")</span>
${name-d}</code></span></pre>


<h4 class="wp-block-heading">유효/무효 예시 비교</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" />정상</span>
<span class="hljs-comment">#set($name_d = "밑줄")</span>
<span class="hljs-comment">#set($name12d = "영문자 시작 + 숫자")</span>
<span class="hljs-comment">#set(${name-1_2d} = "하이픈 사용 시 중괄호 필수")</span>

<span class="hljs-comment"># <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" />중괄호 없이 하이픈 사용 → 구문 분석 오류</span>
<span class="hljs-comment">#set($name-d = "오류 발생!")</span>
<span class="hljs-comment">#set($name-1_2d = "오류 발생!")</span></code></span></pre>


<h3 class="wp-block-heading">3. #set 문법 작성 규칙</h3>



<p class="wp-block-paragraph">표준 작성법 (괄호 주변 공백은 자유롭게, 통일된 스타일 권장)</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($변수이름 = "값")</span></code></span></pre>


<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">문자열은 큰따옴표로 감싸야 합니다. 등호 좌우에 공백을 넣으면 가독성이 좋아집니다.</p>
</blockquote>



<p class="wp-block-paragraph">주석</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ec%a3%bc%ec%84%9d-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>템플릿 재사용</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%9e%ac%ec%82%ac%ec%9a%a9/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%9e%ac%ec%82%ac%ec%9a%a9/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:57:13 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8450</guid>

					<description><![CDATA[1. 핵심 역할 Velocity 템플릿 엔진은 #include / #parse 로 템플릿 재사용을 구현합니다.페이지 상단 네비게이션 _head.htm, 하단 저작권 정보 _footer.htm 같은 공통 부분을 별도 서브템플릿으로 분리해서 불러오면 HTML 코드 중복을 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">1. 핵심 역할</h3>



<p class="wp-block-paragraph">Velocity 템플릿 엔진은 <code>#include</code> / <code>#parse</code> 로 <strong>템플릿 재사용</strong>을 구현합니다.<br>페이지 상단 네비게이션 <code>_head.htm</code>, 하단 저작권 정보 <code>_footer.htm</code> 같은 공통 부분을 별도 서브템플릿으로 분리해서 불러오면 HTML 코드 중복을 피할 수 있습니다.</p>



<h3 class="wp-block-heading">2. 두 지시자의 핵심 차이</h3>



<h4 class="wp-block-heading">1. <code>#include("파일경로")</code></h4>



<p class="wp-block-paragraph"><strong>파일 원문을 그대로 출력만 할 뿐, 서브템플릿 안의 Velocity 변수(<code>$!{xxx}</code>)는 해석하지 않습니다</strong></p>



<ul class="wp-block-list">
<li>서브템플릿 안의 <code>$!{testinclude}</code>는 렌더링되지 않고 문자열 그대로 출력됩니다 <code>$!{testinclude}</code></li>



<li><strong>여러 파일</strong>을 한 번에 불러오기 지원：<code>#include("a.htm","b.htm")</code></li>



<li>적합：변수가 없는 순수 정적 HTML, 정적 코드 조각</li>
</ul>



<h4 class="wp-block-heading">2. <code>#parse("파일경로")</code></h4>



<p class="wp-block-paragraph"><strong>서브템플릿을 불러오고 Velocity 문법을 전부 해석합니다</strong>. 부모 템플릿에서 넘긴 변수가 서브템플릿에서 정상적으로 렌더링됩니다.</p>



<ul class="wp-block-list">
<li>서브템플릿의 <code>$!{testinclude}</code>는 컨텍스트 변수를 읽어 백엔드에서 전달한 값으로 교체됩니다</li>



<li><strong>단일 파일 경로만 허용</strong>하며 여러 파일을 동시에 불러올 수 없습니다</li>



<li>적합：변수를 사용하는 공통 헤더, 푸터 등의 템플릿(페이지 제목, 동적 저작권 문구 등)</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">메모 노트 내용：<br><code>#include는 서브템플릿 코드를 그대로 붙여넣을 뿐 해석하지 않고, #parse는 문법 해석을 진행합니다</code></p>
</blockquote>



<h3 class="wp-block-heading">3. 실제 예시</h3>



<h4 class="wp-block-heading">1. 백엔드 코드(.cs)</h4>


<pre class="wp-block-code"><span><code class="hljs language-javascript">context.Put(<span class="hljs-string">"testinclude"</span>, <span class="hljs-string">"서브템플릿 문자열："</span>);</code></span></pre>


<h4 class="wp-block-heading">2. 서브템플릿 <code>_footer.htm</code> 내용</h4>


<pre class="wp-block-code"><span><code class="hljs">저작권 정보 $!{testinclude}</code></span></pre>


<h5 class="wp-block-heading">케이스① <code>#include("./themes/default/_footer.htm")</code> 사용</h5>



<p class="wp-block-paragraph">페이지 출력 결과：</p>


<pre class="wp-block-code"><span><code class="hljs">저작권 정보 $!{testinclude}</code></span></pre>


<p class="wp-block-paragraph">변수가 해석되지 않고 플레이스홀더 그대로 출력됩니다.</p>



<h5 class="wp-block-heading">케이스② <code>#parse("./themes/default/_footer.htm")</code> 사용</h5>



<p class="wp-block-paragraph">페이지 출력 결과：</p>


<pre class="wp-block-code"><span><code class="hljs">저작권 정보 서브템플릿 문자열：</code></span></pre>


<p class="wp-block-paragraph">변수가 정상적으로 렌더링됩니다. 실제 프로젝트에서 헤더·푸터 공통 템플릿에<strong>#parse를 우선 사용</strong>하는 이유입니다.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 사용 시나리오 권장</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>지시자</th><th>적합한 사용처</th></tr></thead><tbody><tr><td><code>#include</code></td><td>정적 자원, 순수 텍스트, 변수 렌더링이 필요 없는 정적 HTML 조각</td></tr><tr><td><code>#parse</code></td><td>공통 헤더, 푸터, 사이드바；<code>$변수</code>, <code>#if</code> 등 VTL 문법이 포함된 템플릿</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 개발 규칙：<br>동적 변수가 쓰일 가능성이 있는 네비게이션, 푸터 저작권 등 공통 컴포넌트는 <code>#parse</code>를 사용하고, 완전 정적 텍스트나 스타일 조각에는 <code>#include</code>를 사용합니다.</p>



<p class="wp-block-paragraph">템플릿 재사용</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%9e%ac%ec%82%ac%ec%9a%a9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>템플릿 안에서 변수 설정하기</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%95%88%ec%97%90%ec%84%9c-%eb%b3%80%ec%88%98-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%95%88%ec%97%90%ec%84%9c-%eb%b3%80%ec%88%98-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:34:55 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8433</guid>

					<description><![CDATA[지금까지 배운 변수는 C# 백엔드 코드에서 정의한 뒤 템플릿에서 사용하는 방식이었습니다. 사실 set 지시자를 이용해 템플릿 내부에서 직접 변수를 선언할 수 있습니다. 1. 변수 정의 #set() 변수를 정의하는 두 가지 ...]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">지금까지 배운 변수는 C# 백엔드 코드에서 정의한 뒤 템플릿에서 사용하는 방식이었습니다. 사실 set 지시자를 이용해 템플릿 내부에서 직접 변수를 선언할 수 있습니다.</p>



<h3 class="wp-block-heading">1. 변수 정의 <code>#set()</code></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">변수를 정의하는 두 가지 방식:<br>방식1: 백엔드 C#/Java 코드에서 미리 변수를 정의하고 템플릿 페이지에서 읽어오기;<br>방식2: <strong>템플릿 안에서 <code>#set()</code>으로 직접 변수 정의</strong>(이번 강의 핵심)</p>



<p class="wp-block-paragraph"></p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name = "hello foxdevelop.com")</span>
<span class="hljs-comment">#set($okay = "common baby")</span>
<span class="hljs-comment">#set($nameokay = "$name|$okay")</span></code></span></pre>


<ul class="wp-block-list">
<li><code>#set(변수 = 값)</code>：문자열, 숫자, 배열, 객체 속성, 다른 변수 할당을 지원합니다</li>



<li>약타입 언어이므로 변수 타입 선언이 필요 없습니다</li>
</ul>



<h3 class="wp-block-heading">2. 변수 렌더링 문법 및 규칙</h3>



<h4 class="wp-block-heading">2.1 기본 형식</h4>



<ul class="wp-block-list">
<li><code>$name</code>：변수가 없으면 <code>$name</code> 문자열 그대로 출력</li>



<li><code>$!name</code>：<strong>자동 비우기 렌더링</strong>，변수가 없을 때 빈 값 출력. 페이지에 <code>$xxx</code>가 보이는 것을 막으므로 권장</li>



<li>권장 표준 문법：<strong><code>${name}</code></strong>（중괄호로 변수 범위를 명확히 구분）</li>
</ul>



<h4 class="wp-block-heading">2.2 경계 문제 예시</h4>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#set($name = "hello")</span>
$namehello     × 엔진이 $namehello 라는 변수로 인식해 찾지 못함
${name}hello   √ 정상, $name을 해석한 뒤 hello 텍스트 이어 붙임</code></span></pre>


<h3 class="wp-block-heading">3. 한 줄 주석 <code>##</code></h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## 여기는 주석, 최종 결과에 출력되지 않음</span>
<span class="hljs-comment">#set($name = "test") ## 줄 끝에도 주석 작성 가능</span></code></span></pre>


<ol class="wp-block-list">
<li>주석 내용은<strong>최종 렌더링된 페이지에 출력되지 않습니다</strong>;</li>



<li>브라우저에서 페이지 소스 보기를 해도<strong>주석 텍스트가 보이지 않습니다</strong>（템플릿 엔진 처리 단계에서 제거）.</li>
</ol>



<h3 class="wp-block-heading">4. #set에서 지원하는 여러 할당 타입</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">## 문자열 할당</span>
<span class="hljs-comment">#set($name = "hello world")</span>

<span class="hljs-comment">## 변수를 다른 변수에 복사</span>
<span class="hljs-comment">#set($obj= $name)</span>

<span class="hljs-comment">## 객체 속성 할당</span>
<span class="hljs-comment">#set($obj.Friend = "monica")</span>
<span class="hljs-comment">#set($obj.Blame = $whitehouse.Leak)</span>

<span class="hljs-comment">## 메서드 호출 결과 할당</span>
<span class="hljs-comment">#set($obj.Plan = $spindoctor.weave($web))</span>

<span class="hljs-comment">## 숫자 할당</span>
<span class="hljs-comment">#set($obj.Number = 123)</span>

<span class="hljs-comment">## 배열 할당</span>
<span class="hljs-comment">#set($obj.Say = &#91;"Not", $my, "fault"])</span></code></span></pre>


<h3 class="wp-block-heading">5. 변수가 존재하지 않을 때 특수 규칙</h3>


<pre class="wp-block-code"><span><code class="hljs language-php">$sadfsdfsd</code></span></pre>


<p class="wp-block-paragraph">템플릿 엔진이 해당 변수를 찾지 못할 경우：</p>



<ul class="wp-block-list">
<li>일반 문법 <code>$sadfsdfsd</code>：문자열 <code>$sadfsdfsd</code> 그대로 출력</li>



<li><code>$!sadfsdfsd</code>로 작성：변수가 없으면 빈 문자열 출력</li>
</ul>



<p class="wp-block-paragraph">템플릿 안에서 변수 설정하기</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ed%85%9c%ed%94%8c%eb%a6%bf-%ec%95%88%ec%97%90%ec%84%9c-%eb%b3%80%ec%88%98-%ec%84%a4%ec%a0%95%ed%95%98%ea%b8%b0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>기본 템플릿 문법</title>
		<link>https://www.foxdevelop.com/ko/2026/08/14/%ea%b8%b0%eb%b3%b8-%ed%85%9c%ed%94%8c%eb%a6%bf-%eb%ac%b8%eb%b2%95/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/14/%ea%b8%b0%eb%b3%b8-%ed%85%9c%ed%94%8c%eb%a6%bf-%eb%ac%b8%eb%b2%95/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Fri, 14 Aug 2026 02:24:10 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=8417</guid>

					<description><![CDATA[1. 엔티티 객체를 템플릿에 전달하기 1. PageInfo 엔티티 클래스 지금까지 문자열만 전달했는데 효율이 낮고 유지보수가 불편합니다. 엔티티 클래스로 데이터를 묶으면 코드가 훨씬 직관적이게 됩니다. 2. 컨텍스트 데이터 채우기 context.Put("키이름",데이터)：데이터를 템플릿으로 ...]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">1. 엔티티 객체를 템플릿에 전달하기</h3>



<h4 class="wp-block-heading">1. PageInfo 엔티티 클래스</h4>



<p class="wp-block-paragraph">지금까지 문자열만 전달했는데 효율이 낮고 유지보수가 불편합니다. 엔티티 클래스로 데이터를 묶으면 코드가 훨씬 직관적이게 됩니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">PageInfo</span>
{
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">bool</span> IsShowImage;
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">bool</span> IsShowImage1
    {
        <span class="hljs-keyword">get</span> { <span class="hljs-keyword">return</span> IsShowImage; }
        <span class="hljs-keyword">set</span> { IsShowImage = <span class="hljs-keyword">value</span>; }
    }
}</code></span></pre>


<ul class="wp-block-list">
<li>비공개 필드 <code>IsShowImage</code>, 공개 속성 <strong><code>IsShowImage1</code></strong>으로 외부에 노출</li>



<li>템플릿 접근 문법: <code>$info.IsShowImage1</code></li>
</ul>



<h4 class="wp-block-heading">2. 컨텍스트 데이터 채우기</h4>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-comment">//템플릿 컨텍스트 컨테이너</span>
IContext context = <span class="hljs-keyword">new</span> VelocityContext();

PageInfo pi = <span class="hljs-keyword">new</span> PageInfo();
pi.IsShowImage1 = <span class="hljs-literal">true</span>;

<span class="hljs-comment">//객체 pi를 키 이름 info로 컨텍스트에 저장</span>
context.Put(<span class="hljs-string">"info"</span>,pi);

<span class="hljs-comment">//문자열 변수 예시</span>
context.Put(<span class="hljs-string">"infotitle"</span>,<span class="hljs-string">"안녕하세요"</span>);</code></span></pre>


<p class="wp-block-paragraph"><code>context.Put("키이름",데이터)</code>：데이터를 템플릿으로 넘기고 템플릿은 <code>$키이름</code>으로 읽어옵니다.</p>



<h3 class="wp-block-heading">2. Velocity 템플릿 핵심 문법</h3>



<h4 class="wp-block-heading">2.1 지시자 기호 <code>#</code></h4>



<p class="wp-block-paragraph"><code>#</code>로 시작하는 구문은 지시자입니다. 자주 쓰이는 지시자:<br><code>#if</code>, <code>#else</code>, <code>#end</code>, <code>#foreach</code>, <code>#set</code>, <code>#include</code></p>



<p class="wp-block-paragraph">조건 렌더링 예시:</p>



<p class="wp-block-paragraph">이미지 두 장을 준비한 뒤 웹사이트 루트의 Contents/Images 폴더에 넣으세요. IsShowImage1 값을 바꿔서 보여줄 이미지를 전환합니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">#if($info.IsShowImage1)</span>
    &lt;img src=<span class="hljs-string">"./Contents/Images/a.gif"</span> /&gt;
<span class="hljs-comment">#else</span>
    &lt;img src=<span class="hljs-string">"./Contents/Images/b.gif"</span> /&gt;
<span class="hljs-comment">#end</span></code></span></pre>


<p class="wp-block-paragraph">로직: <code>IsShowImage1=true</code>일 때 a.gif 표시, 그 외에는 b.gif 표시</p>



<h4 class="wp-block-heading">2.2 변수 기호 <code>$</code></h4>



<ul class="wp-block-list">
<li><code>$변수이름</code>：변수 값 출력</li>



<li><code>${변수이름}</code>：<strong>변수 경계 지정</strong> (중요!)</li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">사용 상황: 변수 바로 뒤에 문자가 이어질 때 엔진이 변수 이름 끝을 구분하지 못함</p>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-php">잘못된 표기: $infotitlefoxdevelop.com
엔진이 변수명을 infotitlefoxdevelop로 인식하며 존재하지 않는 변수로 취급합니다.

올바른 표기: ${infotitle}foxdevelop.com
infotitle 변수를 해석한 뒤 foxdevelop.com 문자열을 이어 붙임</code></span></pre>


<h4 class="wp-block-heading">2.3 무음 출력 수식자 <code>!</code> → <code>$!변수이름</code></h4>



<p class="wp-block-paragraph">기본 동작: 변수가 없으면 페이지에 <code>$변수이름</code> 문자 그대로 출력<br><code>$!변수이름</code>：변수가 없거나 null일 때 아무것도 출력하지 않고 $ 기호도 표시하지 않음</p>



<p class="wp-block-paragraph">비교 예시:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>표기</th><th>변수 존재(값=&#8221;안녕하세요&#8221;)</th><th>변수 없음</th></tr></thead><tbody><tr><td><code>$infotitle</code></td><td>안녕하세요</td><td><code>$infotitle</code></td></tr><tr><td><code>$!infotitle</code></td><td>안녕하세요</td><td>(빈 값, 아무것도 출력 안함)</td></tr><tr><td><code>${infotitle}</code></td><td>안녕하세요</td><td><code>${infotitle}</code></td></tr><tr><td><code>$!{infotitle}</code></td><td>안녕하세요</td><td>빈 값</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">전체 테스트 코드:</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">${infotitle}foxdevelop.com <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$!infotitlefoxdevelop.com <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$infotitle <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span>
$!infotitle <span class="hljs-tag">&lt;<span class="hljs-name">br</span>/&gt;</span></code></span></pre>


<h3 class="wp-block-heading">정리</h3>



<ol class="wp-block-list">
<li>변수 뒤에 문자열을 이어 붙일 때 반드시 <code>${변수}</code>로 감싸기</li>



<li>실제 운영 환경에서는 <code>$!{변수이름}</code>을 우선 사용, null일 때 원본 <code>$xxx</code>가 출력되어 레이아웃이 깨지는 것을 방지</li>



<li><code>#if</code>로 불리언 속성 판단 시 그대로 <code>#if($info.IsShowImage1)</code>로 작성, <code>==true</code> 불필요</li>
</ol>



<p class="wp-block-paragraph">기본 템플릿 문법</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/14/%ea%b8%b0%eb%b3%b8-%ed%85%9c%ed%94%8c%eb%a6%bf-%eb%ac%b8%eb%b2%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NVelocity 개요</title>
		<link>https://www.foxdevelop.com/ko/2026/08/01/nvelocity-%ea%b0%9c%ec%9a%94/</link>
					<comments>https://www.foxdevelop.com/ko/2026/08/01/nvelocity-%ea%b0%9c%ec%9a%94/#respond</comments>
		
		<dc:creator><![CDATA[jack]]></dc:creator>
		<pubDate>Sat, 01 Aug 2026 12:46:11 +0000</pubDate>
				<category><![CDATA[NVelocity 튜토리얼]]></category>
		<guid isPermaLink="false">https://www.foxdevelop.com/?p=7129</guid>

					<description><![CDATA[.NET 플랫폼 템플릿 엔진으로, Java 플랫폼의 Velocity를 .NET으로 포팅한 버전입니다. 소개 ASP.NET 프로젝트에서 널리 사용됩니다;ASP.NET MVC에는 Razor 템플릿이 기본으로 탑재되어 있습니다. 기존 .aspx 페이지 기반 프로젝트에 MVC 패턴을 적용하고 싶은 ...]]></description>
										<content:encoded><![CDATA[<p>.NET 플랫폼 템플릿 엔진으로, Java 플랫폼의 Velocity를 .NET으로 포팅한 버전입니다.</p>


<h4 class="wp-block-heading">소개</h4>



<p class="wp-block-paragraph">ASP.NET 프로젝트에서 널리 사용됩니다;<br>ASP.NET MVC에는 Razor 템플릿이 기본으로 탑재되어 있습니다.</p>



<p class="wp-block-paragraph">기존 <code>.aspx</code> 페이지 기반 프로젝트에 MVC 패턴을 적용하고 싶은 개발자들이 많이 NVelocity를 선택했습니다.</p>



<p class="wp-block-paragraph">NVelocity는 이미 유지보수가 중단되었으며 오래된 .NET Framework 레거시 프로젝트에서만 사용합니다. 신규 프로젝트는 Razor, Handlebars.NET 등 현대적인 템플릿 엔진을 우선 사용하는 것이 좋습니다.</p>



<p class="wp-block-paragraph">.NET Framework 버전별 호환 NVelocity 버전</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>.NET Framework 버전</th><th>NVelocity 버전</th></tr></thead><tbody><tr><td>.NET 4.0</td><td>1.0 (공식 최신판)</td></tr><tr><td>.NET 2.0</td><td>0.5</td></tr><tr><td>.NET 1.0</td><td>0.48</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Velocity는 역사가 긴 Java 템플릿 엔진으로 구문이 간결하며 <code>#</code>, <code>$</code> 기호를 템플릿 마커로 활용합니다. NVelocity는 이 구문을 완전히 포팅했습니다.</p>



<h4 class="wp-block-heading">다운로드</h4>



<p class="wp-block-paragraph">공식 마지막 업데이트는 2018년이며 최신 버전은 1.2.0입니다.</p>



<p class="wp-block-paragraph">아래 주소에서 소스 코드를 내려받을 수 있습니다.</p>



<p class="wp-block-paragraph">오픈소스 프로젝트로 GitHub에서 관리되고 있습니다 <a href="https://github.com/castleproject/NVelocity/tree/master">castleproject/NVelocity: Castle&#8217;s NVelocity</a></p>



<p class="wp-block-paragraph">공식 저장소에는 컴파일된 dll 파일이 없으므로 소스를 다운로드한 뒤 직접 빌드하거나 프로젝트 자체를 솔루션에 포함시켜 사용하면 됩니다.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="397" height="269" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13.png" alt="" class="wp-image-7081" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13.png 397w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-13-300x203.png 300w" sizes="(max-width: 397px) 100vw, 397px" /></figure>



<p class="wp-block-paragraph">Visual Studio로 sln 파일을 엽니다.</p>



<p class="wp-block-paragraph">마지막 릴리즈 버전은 .NET Core 2.1 기반이므로 필요하다면 .NET 4.8로 업그레이드하는 것을 권장합니다.</p>



<p class="wp-block-paragraph">빌드가 완료되면 출력 폴더에서 dll 파일을 확인할 수 있습니다.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="372" height="76" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14.png" alt="" class="wp-image-7082" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14.png 372w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-14-300x61.png 300w" sizes="(max-width: 372px) 100vw, 372px" /></figure>



<p class="wp-block-paragraph">그러고 나서 다른 ASP.NET 웹 프로젝트에 참조를 추가하면 됩니다. 방금 생성한 NVelocity.dll을 웹 프로젝트에 포함시키세요.</p>



<h4 class="wp-block-heading">프로젝트 적용 방식</h4>



<p class="wp-block-paragraph">프로젝트에 어셈블리 참조 추가: NVelocity.dll<br>주요 장점: 이 템플릿 엔진을 활용하면 웹사이트의 테마 전환 기능을 간편하게 구현할 수 있습니다.</p>



<p class="wp-block-paragraph">웹 사이트 루트 경로에 Themes 폴더를 생성해 모든 템플릿을 보관하는 기본 디렉터리로 지정합니다.<br>Themes 안에 여러 테마 폴더를 만들 수 있습니다. 예시는 다음과 같습니다.</p>



<p class="wp-block-paragraph">사이트 루트에 Themes 폴더를 만들어 테마 저장 경로로 사용합니다.</p>



<h4 class="wp-block-heading">테마 디렉터리 구조</h4>



<p class="wp-block-paragraph">default 폴더를 만들어 기본 템플릿으로 지정합니다.<br>필요에 따라 Themes/blue, Themes/dark 등 여러 템플릿 세트를 추가할 수 있습니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-php">사이트 루트
└── Themes
    ├── <span class="hljs-keyword">default</span>      <span class="hljs-comment"># 기본 테마 템플릿 파일</span>
    ├── dark         <span class="hljs-comment"># 어두운 테마 템플릿 파일</span>
    └── blue         <span class="hljs-comment"># 파란색 테마 템플릿 파일</span></code></span></pre>


<p class="wp-block-paragraph">실행 시 설정 파일에서 활성화된 테마 이름을 읽고 NVelocity가 해당 테마 폴더 안의 템플릿을 불러옵니다.<br>테마 전환의 원리: 설정값을 수정해 다른 테마 폴더를 가리키도록 할 뿐 비즈니스 로직 코드는 수정할 필요가 없습니다.<br>구식 ASP.NET WebForm(.aspx) 프로젝트에서 프론트 페이지 테마 변경 기능을 구현하기 적합합니다.</p>



<h4 class="wp-block-heading">aspx 작성</h4>



<p class="wp-block-paragraph">사이트 루트에 <code>Register.aspx</code> 페이지를 새로 생성하고 예시 페이지로 활용합니다.</p>



<p class="wp-block-paragraph"><code>Themes/default</code> 경로에 템플릿 파일 <code>register.htm</code>을 생성합니다. 이 파일은 NVelocity 템플릿으로 HTML과 Velocity 문법을 담습니다.</p>



<p class="wp-block-paragraph"><code>Register.aspx</code>를 열고 <strong>페이지 지시문만 남겨둔 나머지 HTML 코드를 전부 삭제합니다.</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">%@</span> <span class="hljs-attr">Page</span> <span class="hljs-attr">Language</span>=<span class="hljs-string">"C#"</span> <span class="hljs-attr">AutoEventWireup</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">CodeBehind</span>=<span class="hljs-string">"Register.aspx.cs"</span> <span class="hljs-attr">Inherits</span>=<span class="hljs-string">"NVelocityStudy.Web.Register"</span> %&gt;</span></code></span></pre>


<p class="wp-block-paragraph">aspx 파일 자체는 페이지 렌더링에 관여하지 않고 컨트롤러 진입점 역할만 수행합니다. 백엔드 코드가 NVelocity를 호출해 <code>register.htm</code> 템플릿을 불러와 최종 내용을 출력합니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-css">사이트 루트
├─ <span class="hljs-selector-tag">Register</span><span class="hljs-selector-class">.aspx</span>          # 접속 진입 페이지
├─ <span class="hljs-selector-tag">Register</span><span class="hljs-selector-class">.aspx</span><span class="hljs-selector-class">.cs</span>       # 서버 로직 코드
└─ <span class="hljs-selector-tag">Themes</span>
    └─ <span class="hljs-selector-tag">default</span>
        └─ <span class="hljs-selector-tag">register</span><span class="hljs-selector-class">.htm</span>   # <span class="hljs-selector-tag">NVelocity</span> 템플릿</code></span></pre>


<p class="wp-block-paragraph">이후 <code>Register.aspx.cs</code>에 코드를 작성해 현재 테마의 <code>register.htm</code> 템플릿을 불러오고 데이터 모델을 전달한 뒤 완성된 HTML을 생성합니다.</p>



<p class="wp-block-paragraph">테마를 교체하려면 테마 폴더 경로 설정만 바꾸면 되며, 해당 폴더 안의 <code>register.htm</code>이 자동으로 로딩됩니다.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="325" height="357" src="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15.png" alt="" class="wp-image-7083" srcset="https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15.png 325w, https://www.foxdevelop.com/wp-content/uploads/2026/08/image-15-273x300.png 273w" sizes="auto, (max-width: 325px) 100vw, 325px" /></figure>



<h4 class="wp-block-heading">aspx.cs 구현</h4>



<p class="wp-block-paragraph">서버 코드 파일 <code>Register.aspx.cs</code>를 열고 <strong>Page_Load</strong> 메서드 안에 NVelocity 렌더링 로직을 작성합니다. 페이지가 로드될 때 템플릿 해석 및 결과 출력이 진행됩니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-keyword">using</span> System;
<span class="hljs-keyword">using</span> System.Collections.Generic;
<span class="hljs-keyword">using</span> System.Web;
<span class="hljs-keyword">using</span> System.Web.UI;
<span class="hljs-keyword">using</span> System.Web.UI.WebControls;

<span class="hljs-keyword">namespace</span> <span class="hljs-title">NVelocityStudy.Web</span>
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">partial</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Register</span> : <span class="hljs-title">System</span>.<span class="hljs-title">Web</span>.<span class="hljs-title">UI</span>.<span class="hljs-title">Page</span>
    {
        <span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Page_Load</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, EventArgs e</span>)</span>
        {
            <span class="hljs-comment">// 여기에 NVelocity 템플릿 로딩 및 렌더링 코드를 작성합니다</span>
        }
    }
}</code></span></pre>


<p class="wp-block-paragraph">Page_Load 안에 아래 코드를 추가합니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-cs"><span class="hljs-function"><span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">Page_Load</span>(<span class="hljs-params"><span class="hljs-keyword">object</span> sender, EventArgs e</span>)</span>
{
    <span class="hljs-comment">//1단계. VelocityEngine 인스턴스 생성</span>
    VelocityEngine ve = <span class="hljs-keyword">new</span> VelocityEngine();

    <span class="hljs-comment">//2단계. 엔진 설정 초기화</span>
    ExtendedProperties pros = <span class="hljs-keyword">new</span> ExtendedProperties();
    pros.AddProperty(RuntimeConstants.RESOURCE_LOADER, <span class="hljs-string">"file"</span>); <span class="hljs-comment">// 파일 기반 템플릿 로드 방식</span>
    pros.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, Server.MapPath(<span class="hljs-string">@""</span>)); <span class="hljs-comment">// 템플릿 기본 경로</span>
    ve.Init(pros); <span class="hljs-comment">// 설정을 적용하고 엔진 초기화</span>

    <span class="hljs-comment">//3단계. 템플릿 파일 불러오기</span>
    Template template = ve.GetTemplate(<span class="hljs-string">"themes/default/register.htm"</span>);

    <span class="hljs-comment">//4단계. 컨텍스트 생성, 템플릿에 변수 전달</span>
    IContext context = <span class="hljs-keyword">new</span> VelocityContext();
    context.Put(<span class="hljs-string">"websiteName"</span>, <span class="hljs-string">"FoxDevelop"</span>);
    context.Put(<span class="hljs-string">"domainName"</span>, <span class="hljs-string">"foxdevelop.com"</span>);

    <span class="hljs-comment">//5단계. 템플릿과 데이터를 결합하여 HTML 생성</span>
    StringWriter writer = <span class="hljs-keyword">new</span> StringWriter();
    template.Merge(context, writer); <span class="hljs-comment">// 렌더링 결과를 writer에 저장</span>

    <span class="hljs-comment">//6단계. 최종 페이지 출력</span>
    Response.Write(writer.ToString().Replace(<span class="hljs-string">"\r\n"</span>, <span class="hljs-string">"&lt;br/&gt;"</span>));
}</code></span></pre>


<p class="wp-block-paragraph">이 코드는 템플릿 html 파일을 읽고 변수를 생성한 뒤 html 내의 자리 표시자를 실제 값으로 교체하는 과정입니다.</p>



<ol class="wp-block-list">
<li><strong>VelocityEngine 인스턴스 생성</strong> 전역 정적 <code>Velocity.Init()</code>와 달리 독립적인 엔진 객체로 여러 개의 개별 설정을 운용할 수 있습니다.</li>



<li><strong>엔진 초기화 및 환경 설정</strong></li>
</ol>



<ul class="wp-block-list">
<li><code>RESOURCE_LOADER=file</code> : 템플릿을 로컬 파일로 불러오도록 지정;</li>



<li><code>FILE_RESOURCE_LOADER_PATH</code> : 템플릿을 탐색할 기본 경로 설정;</li>



<li><code>ve.Init(pros)</code> : 설정을 불러와 초기화를 완료.</li>
</ul>



<ol start="3" class="wp-block-list">
<li><strong>템플릿 불러오기 <code>GetTemplate()</code></strong> 설정된 기본 경로를 기준으로 <code>themes/default/register.htm</code> 템플릿을 읽어옵니다.</li>



<li><strong>VelocityContext 데이터 컨텍스트</strong><code>context.Put(키, 값)</code>으로 C# 변수를 템플릿에 전달하며, htm 파일 안에서는 <code>$websiteName</code>、<code>$domainName</code>으로 값을 호출합니다.</li>



<li><strong>템플릿 Merge 렌더링</strong><code>template.Merge(컨텍스트, 출력스트림)</code>으로 변수를 템플릿에 채워 완성된 HTML 문자열을 만들며, <code>StringWriter</code>로 렌더링 결과를 받습니다.</li>



<li><strong>Response 출력</strong> 완성된 HTML을 브라우저로 전송;<code>Replace("\r\n","&lt;br/&gt;")</code> : 소스 코드의 줄바꿈 문자를 HTML 줄바꿈 태그로 변환.</li>
</ol>



<h4 class="wp-block-heading">htm 템플릿 작성</h4>



<p class="wp-block-paragraph">테마 폴더 안의 <code>register.htm</code> 파일을 수정합니다.</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-meta">&lt;!DOCTYPE <span class="hljs-meta-keyword">html</span> <span class="hljs-meta-keyword">PUBLIC</span> <span class="hljs-meta-string">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span class="hljs-meta-string">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">html</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/1999/xhtml"</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    사이트：$websiteName <span class="hljs-tag">&lt;<span class="hljs-name">br</span> /&gt;</span>
    도메인：$domainName
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span></code></span></pre>


<p class="wp-block-paragraph">위의 $xxxxxxx 두 개는 Page_Load에서 선언한 변수의 자리 표시자이며 렌더링 과정에서 실제 값으로 교체됩니다.</p>



<ol class="wp-block-list">
<li><strong>변수 표기 <code>$변수명</code></strong> <code>$websiteName</code>、<code>$domainName</code>는 NVelocity(VTL) 변수 문법입니다. 코드에서 <code>context.Put("websiteName", "FoxDevelop")</code>로 값을 할당하면 렌더링 시 엔진이 자동으로 치환합니다.</li>
</ol>



<ul class="wp-block-list">
<li><code>$websiteName</code> → <code>FoxDevelop</code></li>



<li><code>$domainName</code> → <code>foxdevelop.com</code></li>
</ul>



<p class="wp-block-paragraph">실행 결과 예시</p>


<pre class="wp-block-code"><span><code class="hljs language-css">사이트：<span class="hljs-selector-tag">FoxDevelop</span>
도메인：<span class="hljs-selector-tag">foxdevelop</span><span class="hljs-selector-class">.com</span></code></span></pre>


<p class="wp-block-paragraph">NVelocity 개요</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.foxdevelop.com/ko/2026/08/01/nvelocity-%ea%b0%9c%ec%9a%94/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
