<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>한국스프링사용자모임 KSUG</title>
		<link>http://www.ksug.org/</link>
		<description></description>
		<language>ko</language>
		<pubDate>Tue, 23 Feb 2010 14:02:20 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>영회</managingEditor>
		<image>
		<title>한국스프링사용자모임 KSUG</title>
		<url><![CDATA[http://cfs8.tistory.com/upload_control/download.blog?fhandle=YmxvZzEzMDc4OEBmczgudGlzdG9yeS5jb206L2F0dGFjaC8wLzQuZ2lm]]></url>
		<link>http://www.ksug.org/</link>
		<description></description>
		</image>
		<item>
			<title>[Spring Roo]&#039;스프링 루와 함께하는 쾌속 웹개발&#039; 발표자료(Adobe 후원 세미나)</title>
			<link>http://www.ksug.org/107</link>
			<description>&lt;br /&gt;
&amp;nbsp;지난 2010/02/20 있었던, Adobe 후원 &#039;Java개발자를 위한 공감&#039; 세미나에서 발표한 자료와 데모 때 사용한 코드입니다.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://springframework.tistory.com/attachment/cfile6.uf@131A180E4B81F37BB7D053.pdf&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/pdf.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; RapidWebDevelopmentWithSpringRoo_20102020.pdf&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;imageblock left&quot; style=&quot;float: left; margin-right: 10px;&quot;&gt;&lt;a href=&quot;http://springframework.tistory.com/attachment/cfile21.uf@1374FA0C4B813B434F0011.roo&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; store.roo&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;br /&gt;
&amp;nbsp;그리고 발표내용은 Outsider님이 쓰신&amp;nbsp; &lt;A title=&quot;[http://blog.outsider.ne.kr/437]로 이동합니다.&quot; href=&quot;http://blog.outsider.ne.kr/437&quot; target=_blank&gt;자바 커뮤니티 공동 세미나 &quot;자바 개발자를 위한 ‘共感(공감)’을 찾아서&quot; #2&lt;/A&gt;&amp;nbsp; 페이지에 잘 요약되어 있습니다. (잘 정리해 주셔서 감사합니다~)&lt;br /&gt;
&lt;br /&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;데모 때 사용한 roo 버전은 1.0.1이였는데, 같은날 바로 1.0.2가 나왔습니다.&lt;br /&gt;
&amp;nbsp;* Spring Roo 1.0.2 (GA) Released : &lt;A href=&quot;http://www.springsource.org/node/2399&quot;&gt;http://www.springsource.org/node/2399&lt;/A&gt;&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfile28.uf.tistory.com/image/181E3A234B81E54F9D8E5E&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;20-kangaroos[1].jpg&quot; height=&quot;375&quot; width=&quot;500&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/DIV&gt;</description>
			<category>정상혁</category>
			<category>java 개발자 공감 세미나</category>
			<category>spring roo</category>
			<category>스프링루</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/107</guid>
			<comments>http://www.ksug.org/107#entry107comment</comments>
			<pubDate>Sun, 21 Feb 2010 22:56:06 +0900</pubDate>
		</item>
		<item>
			<title>[Spring Batch] Spring Batch Monitoring System by 자바지기</title>
			<link>http://www.ksug.org/106</link>
			<description>&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfile1.uf.tistory.com/image/14698C0F4B61762BBE1024&quot; alt=&quot;&quot; filemime=&quot;image/jpeg&quot; filename=&quot;spring batch monitoring system[2].jpg&quot; height=&quot;388&quot; width=&quot;620&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp; 자바지기 박재성님께서 Spring Batch의 메타데이터 테이블을 조회하고 Job을 수동실행 시킬 수 있는 관리프로그램을 개발하셨습니다. 즉, 배치작업들의 실행결과, 실행시각, 처리한 건수 등을 조회하고, 필요하다면 웹브라우저를 통해 Job을 실행할 수도 있는 것이죠.&lt;br /&gt;
&lt;br /&gt;&lt;SPAN id=title-text&gt;&lt;A href=&quot;http://www.javajigi.net/pages/viewpage.action?pageId=258474004&quot;&gt;Spring Batch Monitoring System 공개 및 요구사항 수렴&lt;/A&gt;&amp;nbsp;&lt;br /&gt;
&lt;/SPAN&gt;&lt;A href=&quot;http://www.younghoe.info/1284&quot;&gt;&lt;FONT color=#5a5140 size=3&gt;Spring Batch Monitoring System 개발자 인터뷰&lt;/FONT&gt;&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 앞으로 많은 분들에게 도움이 될 수 있는 프로젝트로 발전이 될 것이라 믿습니다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;</description>
			<category>정상혁</category>
			<category>Spring Batch</category>
			<category>Spring Batch Monitoring</category>
			<category>스프링배치</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/106</guid>
			<comments>http://www.ksug.org/106#entry106comment</comments>
			<pubDate>Thu, 28 Jan 2010 20:34:48 +0900</pubDate>
		</item>
		<item>
			<title>StringTemplate 소개</title>
			<link>http://www.ksug.org/105</link>
			<description>&lt;div&gt;
Mail 발송 삽질을 하다가 StringBuilder가 너무 보기 싫어 File을 이용해 메일 템플릿을 구현할 작정으로 검색을 해보았습니다. 스트링 관련 검색을 하다보니 벨로시티도 나오고 하다가 유독 StringTemplate이 괜찮다는 문구를 보고 찾아 들어갔습니다. 진짜 문자열 템플릿 엔진이더군요.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
방식은 간단합니다. 파일을 읽고, 문자열을 대체한다. 물론 우아 하게 대체를 합니다. 그래도 짧은 시간안에 StringBuilder 와 &quot;....&quot; + &quot;...&quot;+를 갈아 치우게 되었습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
일단 잡다한 미사어구는 집어 치우고 예제들어갑니다.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
예제는 String = &quot;&quot;; 이지만 실제는 File기반으로 쓰는경우가 더 많겠지요.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;StringTemplate template = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;null&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// setAttrubte로 값을 넣습니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; StringTemplate(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;안녕하세요. 저는 $name$입니다.&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;name&quot;&lt;/span&gt;, &lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;lee,jaeil&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
간단하게 StringTemplate를 생성하고, 대체할 문자는 $$를 씁니다. 형식이 틀리다면 에러를 냅니다.&lt;/div&gt;
&lt;div&gt;
setAttribute로 추가를 하고, toString()해주면 원하는 결과가 나옵니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;StringTemplateGroup group = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplateGroup(&lt;/span&gt;&quot;mygroup&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&quot;특정폴더&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template = group.getInstanceOf(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;basic&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
특정폴더에 basic.st라는 템플릿 파일을 읽어들입니다. 당연히 syntax는 모두 동일합니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(146, 26, 102);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/span&gt;static&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;class&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; User {&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;private&lt;/span&gt; String &lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;name&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(146, 26, 102);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;private&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;int&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;private&lt;/span&gt; String &lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;job&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; User(String name, &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;int&lt;/span&gt; age, String job) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;super&lt;/span&gt;();&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;name&lt;/span&gt; = name;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;age&lt;/span&gt; = age;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;this&lt;/span&gt;.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;job&lt;/span&gt; = job;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String getName() {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(146, 26, 102);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;/span&gt;return&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;int&lt;/span&gt; getAge() {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(146, 26, 102);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;/span&gt;return&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String getJob() {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(146, 26, 102);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;/span&gt;return&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;job&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String toString() {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; String.format(&lt;/span&gt;&quot;{name : %s, age : %s, job :%s}&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;age&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;job&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;User me = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; User(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;lee,jaeil&quot;&lt;/span&gt;, 19, &lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;student&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;안녕하세요. 저는 $user.name$이고 $user.age$살이고 $user.job$입니다.&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;user&quot;&lt;/span&gt;, me);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
내장객체가 아닌 유저가 만든 객체도 넣습니다. 물론 이게 안되면 말이 안되죠. 접근은 .을 씁니다.&lt;/div&gt;
&lt;div&gt;
사실은 객체의 toString()메소드를 출력하는것입니다. String, int boolean 모두 toString을 뽑아냅니다.&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;font class=&quot;Apple-style-span&quot; face=&quot;Monaco, gulim, tahoma, sans-serif&quot; size=&quot;4&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: 14px; line-height: normal;&quot;&gt;&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;$user$&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;user&quot;&lt;/span&gt;, users);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;//&amp;nbsp; &lt;span style=&quot;text-decoration: underline;&quot;&gt;map도&lt;/span&gt; 지원합니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;HashMap&lt;/span&gt; hm = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;text-decoration: underline;&quot;&gt;HashMap&lt;/span&gt;();&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;hm.put(&lt;/span&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&quot;lee,jaeil&quot;&lt;/span&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;hm.put(&lt;/span&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(62, 61, 249);&quot;&gt;&quot;age&quot;&lt;/span&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;, 19)&lt;/span&gt;;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;hm.put(&lt;/span&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&quot;job&quot;&lt;/span&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;text-decoration: underline;&quot;&gt;&quot;student&quot;&lt;/span&gt;&lt;span style=&quot;text-decoration: underline; color: rgb(0, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;안녕하세요. 저는 $user.name$이고 $user.age$살이고 $user.job$입니다.&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;user&quot;&lt;/span&gt;, hm);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
물론 Map도 지원합니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// &lt;span style=&quot;text-decoration: underline;&quot;&gt;Multi&lt;/span&gt; &lt;span style=&quot;text-decoration: underline;&quot;&gt;Values일 경우&lt;/span&gt; 이여 붙히지만, 구분자를 둘수 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// &lt;span style=&quot;text-decoration: underline;&quot;&gt;Collection도&lt;/span&gt; 됩니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;User[] users = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; User[] {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; User(&lt;/span&gt;&quot;lee, jaeil&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, 19, &lt;/span&gt;&quot;student&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;, &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; User(&lt;/span&gt;&quot;seo,hyunju&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, 18, &lt;/span&gt;&quot;student&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;};&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;안녕하세요. $users; separator=\&quot;, \&quot;$ 입니다.&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;users&quot;&lt;/span&gt;, users);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
배열일경우 연달아 출력하고 $$에 ;를 이용해서 args를 줄수있습니다. 배열일경우 separator를 인식합니다. 값은 꼭 &quot;&quot;를 사용해야합니다.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// &lt;span style=&quot;text-decoration: underline;&quot;&gt;Group을&lt;/span&gt; 정하고 다른 &lt;span style=&quot;text-decoration: underline;&quot;&gt;Template을&lt;/span&gt; include&amp;nbsp; 합니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// &lt;span style=&quot;text-decoration: underline;&quot;&gt;Group을&lt;/span&gt; 정해야 다른 템플릿을 사용가능합니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;StringTemplateGroup group = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplateGroup(&lt;/span&gt;&quot;mygroup&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&quot;/Users/jilee/Documents/workspace-sts-2.2.1.RELEASE/StringTemplateSample/sample&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template = group.getInstanceOf(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;basic&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
특정 폴더 이하를 group으로 묶을수 있습니다. basic.st와 bold.st를 그위치에 지정합니다.
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
basic.st&lt;/div&gt;
&lt;div&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(254, 254, 184); background-color: rgb(254, 254, 184); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;안녕하세요. $bold(it=&quot;test&quot;)$&amp;nbsp; 입니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;bold.st&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(254, 254, 184); background-color: rgb(254, 254, 184); padding: 10px;&quot;&gt;
&lt;div&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&amp;lt;b&amp;gt;$it$&amp;lt;/b&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
bold라는 템플릿을 인클루드합니다. it는 템플릿이 args를 받을수 있는데 기본 변수 이름이 it입니다.&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// 템플릿 파일을 &lt;span style=&quot;text-decoration: underline;&quot;&gt;property에&lt;/span&gt; : 로 접근하여 사용할수 있습니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(group, &lt;/span&gt;&quot;안녕하세요. 저는 $user.name:bold()$이고 $user.age$살이고 $user.job:bold()$입니다.&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;user&quot;&lt;/span&gt;, me);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
템플릿Include를 이용해서 다양한 기능을 구사 할수 있습니다. :접근자를 이용해서 bold템플릿을 치환하고 그 값은 $it$로 받게 되어 &amp;lt;b&amp;gt;&amp;lt;/b&amp;gt;를 끼워 넣을수 있습니다.&lt;/div&gt;
&lt;div&gt;
간단한 템플릿을 구성하면&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;html&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;head&amp;gt;$head()$&amp;lt;/head&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;body&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;div&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
$content()$&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;div&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
$footer()$&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;/body&amp;gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
위와 같은 식으로 group으로 묶은 폴더 밑에 head.st, conten.st, footer.st를 구성할수 있습니다.&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// 반복된값을 출력합니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// :{}를 사용합니다. :{ 와 | 사이의 이름으로 각각의 객체를 받습니다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;$users:{u | &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;$u.name$,&amp;nbsp; $u.age$, $u.job$&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;}; separator=\&quot;\n\&quot;$&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;users&quot;&lt;/span&gt;, users);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
Table에서 row값출력을 구현할수 있습니다. jstl의 foreach보다 훨씬 간단하지만, 그래서 햇갈렸습니다. :{}접근자를 이용해서 u라는 인스턴스로 각각의 값을 받아 users갯수만큼 그려주게 됩니다. 마찬가지로 ;를 이용해 separator를 줄수 있습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// 조건문을 사용&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;$if(users)$ $users:{u | &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;$u$&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;}; separator=\&quot;\n\&quot;$ $endif$&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;//template.setAttribute(&quot;users&quot;, users);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;/p&gt;
&lt;/div&gt;
$if(...) ...값이 존재하거나 size 0보다 크다, &amp;nbsp;boolean true일때 참이게 됩니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;//$를 쓰고 싶다면 \를 사용&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; StringTemplate(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;\\$ $\\n$ $\\t$ $\\r$&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;//주석도 사용할수 있음&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template = &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; StringTemplate(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;$! this is a comment !$ &quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
뭐 이건 알아두면 좋구요. $값이 중요한 시그니처임으로 템플릿에서는 \값을 이용해야 출력할수 있습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;hr style=&quot;height: 1px; border-width: 1px 0px 0px; border-color: black; display: block;&quot;&gt;&lt;/div&gt;
마지막으로 가장중요한 Format에 대하 알아보겠습니다.&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;class&lt;/span&gt; StringRender &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;implements&lt;/span&gt; AttributeRenderer {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(119, 119, 119);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;@Override&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String toString(Object o) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; o.toString();&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(119, 119, 119);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;@Override&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String toString(Object o, String formatName) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;escape&quot;&lt;/span&gt;.equals(formatName)) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;String s = o.toString();&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; s.replaceAll(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;&amp;lt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;&amp;amp;lt;&quot;&lt;/span&gt;).replaceAll(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;&amp;gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;&amp;amp;gt;&quot;&lt;/span&gt;);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; toString(o);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;class&lt;/span&gt; DateRender &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;implements&lt;/span&gt; AttributeRenderer {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(119, 119, 119);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;@Override&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String toString(Object o) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; o.toString();&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(119, 119, 119);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/span&gt;@Override&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;public&lt;/span&gt; String toString(Object o, String formatName) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;if&lt;/span&gt;(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;simple&quot;&lt;/span&gt;.equals(formatName)) {&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;				&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; SimpleDateFormat(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;yyyy-MM-dd&quot;&lt;/span&gt;).format(o);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;			&lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;return&lt;/span&gt; toString(o);&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;}&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; min-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;		&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;}&lt;/p&gt;
&lt;/div&gt;
처음에 당황스러운게 html에서 중요한 specialchars를 변환하는 내장기능이 없었습니다. 문서를 보니 해당 도메인마다 적절하게 구현 해주면 되는것이더군요. 특정객체를 선언하고 formatName을 다르게 받아 여러가지 포맷팅을 가능하게 해줍니다.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border: 1px solid rgb(238, 238, 238); background-color: rgb(238, 238, 238); padding: 10px;&quot;&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(79, 144, 116);&quot;&gt;// AttributeRenderer를 이용하여 포맷을 결정한다.&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template = &lt;/span&gt;&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt; StringTemplate(&lt;/span&gt;&quot;Today date is $currentTime; format=\&quot;simple\&quot;$ $html; format=\&quot;escape\&quot;$&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.registerRenderer(String.&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;class&lt;/span&gt;, &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; StringRender());&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.registerRenderer(Date.&lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;class&lt;/span&gt;, &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; DateRender());&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;template.setAttribute(&lt;span style=&quot;color: rgb(62, 61, 249);&quot;&gt;&quot;currentTime&quot;&lt;/span&gt;, &lt;span style=&quot;color: rgb(146, 26, 102);&quot;&gt;new&lt;/span&gt; Date());&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco; color: rgb(62, 61, 249);&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;template.setAttribute(&lt;/span&gt;&quot;html&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;, &lt;/span&gt;&quot;&amp;lt;a href=\&quot;\&quot;&amp;gt;test&amp;lt;/a&amp;gt;&quot;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin: 0px; font: 14px Monaco;&quot;&gt;System.&lt;span style=&quot;color: rgb(17, 47, 199);&quot;&gt;out&lt;/span&gt;.println(template.toString());&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
기본적인 StringTemplate기능을 소개해봤습니다. 저는 몰랐지만, www.jGuru.com에서 쓰던 Template엔진을 라이브러리로 제공한것이라고 하더군요. 다음번에는 MVC모델에 직접 적용해봐야겠습니다.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
참고자료&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;a href=&quot;http://www.antlr.org/wiki/display/ST/Five+minute+Introduction&quot; target=&quot;_self&quot; title=&quot;[http://www.antlr.org/wiki/display/ST/Five+minute+Introduction]로 이동합니다.&quot;&gt;http://www.antlr.org/wiki/display/ST/Five+minute+Introduction&lt;/a&gt;&lt;div&gt;
&lt;a href=&quot;http://www.antlr.org/wiki/display/ST/StringTemplate+Wiki+Home&quot; target=&quot;_self&quot; title=&quot;[http://www.antlr.org/wiki/display/ST/StringTemplate+Wiki+Home]로 이동합니다.&quot;&gt;http://www.antlr.org/wiki/display/ST/StringTemplate+Wiki+Home&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
예제파일을 추가했습니다.&lt;table style=&quot;display: inline; border-collapse: collapse&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;http://springframework.tistory.com/attachment/cfile6.uf@137301034B6068296EE777.java&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; BasicUsage.java&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
			<category>StringTemplate</category>
			<category>template</category>
			<author>소내기</author>
			<guid>http://www.ksug.org/105</guid>
			<comments>http://www.ksug.org/105#entry105comment</comments>
			<pubDate>Thu, 28 Jan 2010 01:22:56 +0900</pubDate>
		</item>
		<item>
			<title>자바 개발자를 위한 ‘共感(공감)’을 찾아서</title>
			<link>http://www.ksug.org/104</link>
			<description>Adobe의 후원으로 자바 커뮤니티 공동 세미나가 &quot;자바 개발자를 위한 ‘共感(공감)’을 찾아서&quot;라는 주제로 열리는데 저희 KSUG도 참여하게 되었습니다.

&lt;br /&gt;
&lt;br /&gt;KSUG에서는 정상혁님이 스프링 루(Spring Roo)를 소개하고 시연하는 시간을 갖을 계획입니다. 의미있는 시간이 되기를 바라면서 관심 있는 분은 많은 참여 바랍니다. &lt;br /&gt;
&lt;br /&gt;무엇보다 아이폰 앱 &quot;서울 버스&quot;로 유명한 유주완님의 세션도 마련되어 있습니다. 빨리 신청하셔야 할 것 같습니다.&lt;br /&gt;
&lt;br /&gt;&lt;table border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt;
  &lt;tbody&gt;&lt;tr&gt;
    &lt;td background=&quot;http://adoberia.co.kr/edm/edm_bg.jpg&quot;&gt;
    &lt;table align=&quot;center&quot; border=&quot;0&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; width=&quot;650&quot;&gt;
      &lt;tbody&gt;&lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;http://adoberia.co.kr/edm/edm_201001_001.jpg&quot;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;http://adoberia.co.kr/edm/edm_top.jpg&quot; usemap=&quot;#Map_edm_top&quot; border=&quot;0&quot;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;http://adoberia.co.kr/edm/edm_201001_002.jpg&quot; usemap=&quot;#Map_contents&quot; border=&quot;0&quot;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;img src=&quot;http://adoberia.co.kr/edm/edm_footer.jpg&quot; usemap=&quot;#Map_edm_footer&quot; border=&quot;0&quot;&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td height=&quot;50&quot;&gt;&lt;br /&gt;
&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/td&gt;
  &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;

&lt;map name=&quot;Map_edm_top&quot;&gt;
&lt;area shape=&quot;rect&quot; coords=&quot;25,19,214,42&quot; href=&quot;http://www.adoberia.co.kr&quot; target=&quot;_blank&quot;&gt;
&lt;/map&gt;
&lt;map name=&quot;Map_edm_footer&quot;&gt;
&lt;area shape=&quot;rect&quot; coords=&quot;403,46,421,59&quot; href=&quot;[$%OPTOUT%$]&quot;&gt;
&lt;/map&gt;
&lt;map name=&quot;Map_contents&quot;&gt;
&lt;area shape=&quot;rect&quot; coords=&quot;487,161,550,181&quot; href=&quot;http://adoberia.co.kr/edm/map_eventhall.html&quot; target=&quot;_blank&quot;&gt;
&lt;area shape=&quot;rect&quot; coords=&quot;253,596,396,646&quot; href=&quot;http://www.adoberia.co.kr/iwt/blog/blog.php?tn=flex&amp;amp;id=371&quot; target=&quot;_blank&quot;&gt;
&lt;/map&gt;
</description>
			<author>geekinside</author>
			<guid>http://www.ksug.org/104</guid>
			<comments>http://www.ksug.org/104#entry104comment</comments>
			<pubDate>Wed, 27 Jan 2010 16:52:10 +0900</pubDate>
		</item>
		<item>
			<title>Spring Roo 소개 스크린 캐스트</title>
			<link>http://www.ksug.org/103</link>
			<description>Stefan Schmidt씨가 스프링 루를 시연하면서 기능을 간단히 소개하는 스크링 캐스트를 만들어 올렸습니다.&lt;br /&gt;
&lt;h2 style=&quot;font-weight: normal;&quot;&gt;&lt;a href=&quot;http://blog.springsource.com/2010/01/19/spring-roo-intro-screencast/&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link&quot;&gt;&lt;span style=&quot;font-size: 10pt;&quot;&gt;Introduction To Spring Roo 
Screencast&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;빠른 진행 때문에 좀 따라가기 힘든데 &lt;br /&gt;
&lt;br /&gt;
처음에 계약 관리 시스템을 루로 생성하고&lt;br /&gt;
이클립스로 프로젝트로 임포트한 후에&lt;br /&gt;
루가 자동 생성한 통합 테스트를 실행해보고&lt;br /&gt;
루로 생성한 코드를 이클립스로 수정했을 때 루가 이것을 감지해서 aspectj 코드를 자동으로 수정하는 모습&lt;br /&gt;
기본적인 CRUD(scaffold)를 자동으로 생성해서 배포하는 모습&lt;br /&gt;
이클립스 리펙토링 기능으로 Java 코드와 Aspectj ITD 코드 간에 코드를 옮기는 모습&lt;br /&gt;
그리고 소스에서 Roo를 제거하는 모습을 시연합니다.&lt;br /&gt;
&lt;br /&gt;
짧지만 중요한 루의 특징을 볼 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
			<category>roo</category>
			<category>spring roo</category>
			<category>스프링루</category>
			<author>geekinside</author>
			<guid>http://www.ksug.org/103</guid>
			<comments>http://www.ksug.org/103#entry103comment</comments>
			<pubDate>Sat, 23 Jan 2010 10:42:35 +0900</pubDate>
		</item>
		<item>
			<title>springOne 2GX의 스프링 루 발표자료 공개</title>
			<link>http://www.ksug.org/102</link>
			<description>2009년 10월에 있었던 springOne 2GX에서 사용 되었던 스프링 루 발표 자료가 공개되었습니다.&lt;br /&gt;
&lt;br /&gt;
먼저 Roo 개발팀으로 있는 &lt;a title=&quot;[http://www.springone2gx.com/conference/new_orleans/2009/10/speakers/stefan_schmidt]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://www.springone2gx.com/conference/new_orleans/2009/10/speakers/stefan_schmidt&quot;&gt;Stefan Schmidt&lt;/a&gt;의 발표 자료 입니다.&lt;br /&gt;
&lt;br /&gt;
시연 중심의 발표였기 때문에 슬라이드에는 큰 내용이 없지만 오히려 개요를 알기에는 좋을 듯 합니다.&lt;br /&gt;
&lt;div style=&quot;width: 425px; text-align: left;&quot; id=&quot;__ss_2954511&quot;&gt;
&lt;a style=&quot;margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/schmidtstefan/spring-one2-gx-slides-stefan-schmidt&quot; title=&quot;Extreme Web Productivity with Spring Roo&quot;&gt;Extreme Web Productivity with Spring Roo&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=springone2gxslidesstefanschmidt-100120044009-phpapp01&amp;amp;stripped_title=spring-one2-gx-slides-stefan-schmidt&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=springone2gxslidesstefanschmidt-100120044009-phpapp01&amp;amp;stripped_title=spring-one2-gx-slides-stefan-schmidt&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;&quot;&gt;
View more &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/schmidtstefan&quot;&gt;Stefan Schmidt&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
그 다음은 Roo 개발팀 리더이자 스프링 시큐리티의 창시자이고 스프링소스의 떠오르는 태양 &lt;a title=&quot;[http://www.springone2gx.com/conference/new_orleans/2009/10/speakers/ben_alex]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://www.springone2gx.com/conference/new_orleans/2009/10/speakers/ben_alex&quot;&gt;Ben Alex&lt;/a&gt;의 발표 자료로 두 개입니다.&lt;br /&gt;
&lt;br /&gt;
첫번째 소개 자료에서는 Stefan Schmidt의 자료 보다 깊이 있게 스프링 루를 소개하고 있습니다.&lt;br /&gt;
&lt;div style=&quot;width: 425px; text-align: left;&quot; id=&quot;__ss_2805183&quot;&gt;
&lt;a style=&quot;margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/benalexau/introduction-to-spring-roo-100-2805183&quot; title=&quot;Introduction To Spring Roo 1.0.0&quot;&gt;Introduction To Spring Roo 1.0.0&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2009-12introductiontospringroo-091231024655-phpapp02&amp;amp;stripped_title=introduction-to-spring-roo-100-2805183&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2009-12introductiontospringroo-091231024655-phpapp02&amp;amp;stripped_title=introduction-to-spring-roo-100-2805183&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;&quot;&gt;
View more &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/benalexau&quot;&gt;Ben Alex&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
두 번째 자료는 Roo의 내부와 add-on 개발과 관련된 기술적 부분을 다루고 있습니다.
&lt;div style=&quot;width: 425px; text-align: left;&quot; id=&quot;__ss_2805173&quot;&gt;
&lt;a style=&quot;margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/benalexau/spring-roo-100-technical-deep-dive&quot; title=&quot;Spring Roo 1.0.0 Technical Deep Dive&quot;&gt;Spring Roo 1.0.0 Technical Deep Dive&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2009-12springroodeepdive-091231024216-phpapp02&amp;amp;stripped_title=spring-roo-100-technical-deep-dive&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2009-12springroodeepdive-091231024216-phpapp02&amp;amp;stripped_title=spring-roo-100-technical-deep-dive&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;&quot;&gt;
View more &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;documents&lt;/a&gt; from &lt;a style=&quot;text-decoration: underline;&quot; href=&quot;http://www.slideshare.net/benalexau&quot;&gt;Ben Alex&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
			<category>roo</category>
			<category>spring roo</category>
			<category>스프링루</category>
			<author>geekinside</author>
			<guid>http://www.ksug.org/102</guid>
			<comments>http://www.ksug.org/102#entry102comment</comments>
			<pubDate>Sat, 23 Jan 2010 09:59:51 +0900</pubDate>
		</item>
		<item>
			<title>[Spring Roo] Roo 국내 자료 모음</title>
			<link>http://www.ksug.org/101</link>
			<description>&lt;P&gt;참고로, 영문자료 모음은 &lt;A href=&quot;http://forum.springsource.org/showthread.php?t=71985&quot;&gt;http://forum.springsource.org/showthread.php?t=71985&lt;/A&gt; 에 있습니다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Max님 : &lt;A href=&quot;http://yunsunghan.tistory.com/tag/ROO&quot;&gt;http://yunsunghan.tistory.com/tag/ROO&lt;/A&gt;&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/382 href=&quot;http://yunsunghan.tistory.com/382&quot;&gt;Spring ROO A1 테스트 하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/388 href=&quot;http://yunsunghan.tistory.com/388&quot;&gt;Spring ROO A2 Member 도메인 테스트 하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/390 href=&quot;http://yunsunghan.tistory.com/390&quot;&gt;Spring ROO 파일구성 보기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/391 href=&quot;http://yunsunghan.tistory.com/391&quot;&gt;Spring ROO shell 명령 테스트 하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/426 href=&quot;http://yunsunghan.tistory.com/426&quot;&gt;Spring Roo 스크립트 활용하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/392 href=&quot;http://yunsunghan.tistory.com/392&quot;&gt;Spring ROO 와 DDP 구조 합성에 대한 기대&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/429 href=&quot;http://yunsunghan.tistory.com/429&quot;&gt;Spring Roo 잡소식&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/433 href=&quot;http://yunsunghan.tistory.com/433&quot;&gt;Spring Roo ITDs의 가독성&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/438 href=&quot;http://yunsunghan.tistory.com/438&quot;&gt;Roo addon-web-mvc-jsp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/440 href=&quot;http://yunsunghan.tistory.com/440&quot;&gt;Roo를 바라보는 시선&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/442 href=&quot;http://yunsunghan.tistory.com/442&quot;&gt;Spring Roo 잡소식(2)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/420 href=&quot;http://yunsunghan.tistory.com/420&quot;&gt;Roo - @RooWebScaffoldMetadata&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/421 href=&quot;http://yunsunghan.tistory.com/421&quot;&gt;Roo - Finder.aj 생성하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/449 href=&quot;http://yunsunghan.tistory.com/449&quot;&gt;Spring Roo 최신 버전 빌드하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/448 href=&quot;http://yunsunghan.tistory.com/448&quot;&gt;Spirng Roo dateFormat 옵션 추가 됨&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/407 href=&quot;http://yunsunghan.tistory.com/407&quot;&gt;Spring Roo 아키텍처 도식&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/452 href=&quot;http://yunsunghan.tistory.com/452&quot;&gt;Spring Roo 잡소식(3)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/455 href=&quot;http://yunsunghan.tistory.com/455&quot;&gt;Spring Roo 잡소식(4)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/438 href=&quot;http://yunsunghan.tistory.com/438&quot;&gt;Roo addon-web-mvc-jsp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/453 href=&quot;http://yunsunghan.tistory.com/453&quot;&gt;Spring Roo RC2[Revision 319] Demo Testing&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/459 href=&quot;http://yunsunghan.tistory.com/459&quot;&gt;Spring Roo 잡소식(5)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/460 href=&quot;http://yunsunghan.tistory.com/460&quot;&gt;Spring Roo 잡소식(6)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/463 href=&quot;http://yunsunghan.tistory.com/463&quot;&gt;Spring Roo 잡소식(7)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/469 href=&quot;http://yunsunghan.tistory.com/469&quot;&gt;Spring Roo 잡소식(8)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://yunsunghan.tistory.com/482 href=&quot;http://yunsunghan.tistory.com/482&quot;&gt;Spring Roo 프로젝트 진행 후기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Toby님&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://toby.epril.com/?p=761 href=&quot;http://toby.epril.com/?p=761&quot;&gt;Spring ROO 대충대충 분석 (1) 공개과정&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://toby.epril.com/?p=762 href=&quot;http://toby.epril.com/?p=762&quot;&gt;Spring ROO 대충대충 분석 (2) ROO란 무엇인가?&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://toby.epril.com/?p=764 href=&quot;http://toby.epril.com/?p=764&quot;&gt;Spring ROO 대충대충 분석 (3) ROO의 Inter-type declaration&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://toby.epril.com/?p=765 href=&quot;http://toby.epril.com/?p=765&quot;&gt;Spring ROO 대충대충 분석 (4) ROO의 미래와 의의&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://toby.epril.com/?p=856 href=&quot;http://toby.epril.com/?p=856&quot;&gt;테스트 할 수 없는 것을 테스트 하기. Spring ROO와 static method mocking.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Whiteship(백기선)님&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://whiteship.me/2213 href=&quot;http://whiteship.me/2213&quot;&gt;Roo 설치하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://whiteship.me/2214 href=&quot;http://whiteship.me/2214&quot;&gt;스프링 Roo petclic 예제 실행 성공&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;박성철님&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://gyumee.egloos.com/2373662 href=&quot;http://gyumee.egloos.com/2373662&quot;&gt;자기 전에 잠깐 살펴본 Spring Roo&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;자바지기(박재성)님&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://www.javajigi.net/pages/viewpage.action?pageId=263258156 href=&quot;http://www.javajigi.net/pages/viewpage.action?pageId=263258156&quot;&gt;Spring Roo를 적용하면서 느끼는 점&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
			<category>정상혁</category>
			<category>roo</category>
			<category>스프링루</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/101</guid>
			<comments>http://www.ksug.org/101#entry101comment</comments>
			<pubDate>Sat, 23 Jan 2010 06:57:56 +0900</pubDate>
		</item>
		<item>
			<title>Apache Ftp Server + Spring</title>
			<link>http://www.ksug.org/100</link>
			<description>&lt;p&gt;&amp;nbsp; Apache FTP 서버(&lt;a href=&quot;http://mina.apache.org/ftpserver/&quot;&gt;http://mina.apache.org/ftpserver/&lt;/a&gt; )는&amp;nbsp; Java기반의 오픈소스 FTP서버입니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Java기반의&amp;nbsp;모듈이라고 하면 성능이 안 나오지 않을까 걱정하시는 분도 계실 것 같습니다. 이전에 1.0.M3버전으로 제 PC에서 다른 FTP서버와 비교해서 테스트해본 결과는 아래와 같았습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;테스트 환경&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;OS : Windows XP&lt;/li&gt;
&lt;li&gt;CPU : Intel® Core™ 2 Duo CPU E6750, 2.66GHz&lt;/li&gt;
&lt;li&gt;RAM : 2GB&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;업로드 테스트 데이터&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;용량 : 126MB&lt;/li&gt;
&lt;li&gt;파일수 : 392개&lt;/li&gt;
&lt;li&gt;폴더 : 16개&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;img title=&quot;Ftp_performance.GIF&quot; class=&quot;attachment&quot; src=&quot;http://benelog.springnote.com/pages/3157714/attachments/1429048&quot; alt=&quot;Ftp_performance.GIF&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 테스트 결과로 윈도우에서 돌아가는 다른 FTP서버와 비교했을 때 가장 빠른 속도를 보여주는 예상밖의 성능이 나왔었습니다. Linux등에서는 어떤지 몰라도 크게 성능을 걱정할 수준은 아닐 것으로 예상됩니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;
Apache Ftp서버는 설정만으로도 FTP에 부가적인 기능을 많이 사용할 수 있습니다.&amp;nbsp; 예를 들면 Log4j의 설정을
이용해서 원하는 수준과 방식으로 로그를 기록할 수 있고, 사용자정보를&amp;nbsp; 입력,조회 등의 쿼리만 설정 파일에 넣어주면&amp;nbsp; DB로
사용자를 관리할 수 있게도 해줍니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 그리고 Java기반이다 보니,&amp;nbsp; 직접 코딩을 해서 확장을 하는 것도 손쉽습니다. Apache FTP 서버에서 정의한 인터페이스대로 코딩을 하고 이를 설정파일에다 추가할 수도 있죠. 대표적으로 &lt;a href=&quot;http://mina.apache.org/ftpserver/ftplet.html&quot; class=&quot;external&quot; title=&quot;http://mina.apache.org/ftpserver/ftplet.html&quot;&gt;Ftplet&lt;/a&gt;과 같은 인터페이스가 있습니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;활
용사례로,&amp;nbsp; Hadoop의 파일시스템인 HDFS(Hadoop Distributed File System)으로 파일을 올릴 수
있는 서버모듈도 이 Apache Ftp 서버를 이용해서 구현한 사례가 있습니다.&amp;nbsp; FTP client프로그램으로 붙어서 직접
HDFS로 파일을 올리거나, 다른 프로그램에서&amp;nbsp; ftp프로토콜을 이용해 HDFS에 접근할 수 있는 것이죠.&lt;sup class=&quot;footnote&quot;&gt;&lt;a id=&quot;footnote_link_100_1&quot; href=&quot;#footnote_100_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 100, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(100, 1)&quot; style=&quot;color: #f9650d; font-family: Verdana, Sans-serif&quot;&gt;&lt;span style=&quot;display: none&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 흥미로운 점은, 이 FTP서버에서는 스프링 방식의 설정을 지원한다는 것입니다. 예를 들면,&amp;nbsp; 데이터베이스로 사용자를 관리할때, 익숙한 bean태그를 이용해서 datasource의 선언을 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;lt;db-user-manager encrypt-passwords = &quot;clear&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;data-source&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:bean class=&quot;org.apache.commons.dbcp.BasicDataSource&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:property name=&quot;driverClassName&quot; value=&quot;${jdbc.driverClassName}&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:property name=&quot;url&quot; value=&quot;${jdbc.url}&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:property name=&quot;username&quot; value=&quot;${jdbc.username}&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:property name=&quot;password&quot; value=&quot;${jdbc.password}&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;beans:property name=&quot;initialSize&quot; value=&quot;${dbpool.initialSize}&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/beans:bean&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/data-source&amp;gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;.....&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;더욱 재미있게도, 배포된 소스 &lt;sup class=&quot;footnote&quot;&gt;&lt;a id=&quot;footnote_link_100_2&quot; href=&quot;#footnote_100_2&quot; onmouseover=&quot;tistoryFootnote.show(this, 100, 2)&quot; onmouseout=&quot;tistoryFootnote.hide(100, 2)&quot; style=&quot;color: #f9650d; font-family: Verdana, Sans-serif&quot;&gt;&lt;span style=&quot;display: none&quot;&gt;[각주:&lt;/span&gt;2&lt;span style=&quot;display: none&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;중 examples폴더를 보면, Spring DM을 이용해서 OSGI번들로
apache FTP서버를 활용하는 예제가 나옵니다. META-INF/spring/bundle-context.xml의 파일을 보면
아래와 같이&amp;nbsp;선언되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xmlns:osgi=&quot;http://www.springframework.org/schema/osgi&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ftp=&quot;http://mina.apache.org/ftpserver/spring/v1&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/beans/spring-beans.xsd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/osgi&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://www.springframework.org/schema/osgi/spring-osgi.xsd&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; http://mina.apache.org/ftpserver/spring/v1&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;u&gt;&lt;b&gt;http://mina.apache.org/ftpserver/ftpserver-1.0.xsd&lt;/b&gt;&lt;/u&gt; &quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:server id=&quot;server&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:listeners&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:nio-listener name=&quot;default&quot; port=&quot;2222&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ftp:listeners&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:ftplets&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:ftplet name=&quot;ftplet1&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&quot;ftplet&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ftp:ftplet&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ftp:ftplets&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:file-user-manager&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; url=&quot;org/apache/ftpserver/example/osgiservice/users.properties&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ftp:server&amp;gt;&lt;br /&gt;
&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;u&gt;&amp;lt;osgi:service interface=&quot;org.apache.ftpserver.FtpServer&quot;&amp;nbsp;&amp;nbsp; ref=&quot;server&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/osgi:service&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;osgi:reference id=&quot;ftplet&quot; interface=&quot;org.apache.ftpserver.ftplet.Ftplet&quot; /&amp;gt;&lt;/u&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&quot;org.apache.ftpserver.example.osgiservice.impl.FtpServerLifecycle&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; init-method=&quot;init&quot; destroy-method=&quot;destroy&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;lt;property name=&quot;server&quot; ref=&quot;server&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;lt;/beans&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; FTP 서버 역할을 하면서 확장된 기능이 필요하고, 모듈을 재배포하는 도중에도 멈추지 않아야하는  서비스를 만들어야 할 때가 생긴다면,&amp;nbsp; Apache Ftp Server + Spring DM의 조합을 사용해서 편하게 구현을 할 수 있을 것으로 보입니다.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;&lt;div class=&quot;footnotes&quot;&gt;
	&lt;ol class=&quot;footnotes&quot;&gt;
		&lt;li id=&quot;footnote_100_1&quot;&gt;
HDFS로 접근하는 FTP서버에 대한 자료&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://sites.google.com/a/iponweb.net/hadoop/Home/hdfs-over-ftp&quot; title=&quot;https://sites.google.com/a/iponweb.net/hadoop/Home/hdfs-over-ftp&quot; class=&quot;external&quot;&gt;HDFS over FTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gruter.co.kr/213&quot; class=&quot;external&quot; title=&quot;http://www.gruter.co.kr/213&quot;&gt;hadoop을 이용한 ftp server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt; &lt;a href=&quot;#footnote_link_100_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
		&lt;li id=&quot;footnote_100_2&quot;&gt;&lt;a href=&quot;http://mina.apache.org/ftpserver/apache-ftpserver-100-release.html&quot;&gt;http://mina.apache.org/ftpserver/apache-ftpserver-100-release.html&lt;/a&gt;에
서 다운 받을 수 있습니다. &lt;a href=&quot;#footnote_link_100_2&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;
&lt;/div&gt;
</description>
			<category>정상혁</category>
			<category>Apache Ftp Server</category>
			<category>FTP</category>
			<category>Spring DM</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/100</guid>
			<comments>http://www.ksug.org/100#entry100comment</comments>
			<pubDate>Fri, 17 Apr 2009 08:12:21 +0900</pubDate>
		</item>
		<item>
			<title>[Spring batch]차세대 배치시스템 구축 성공전략 - JCO컨퍼런스</title>
			<link>http://www.ksug.org/99</link>
			<description>&lt;P&gt;2009.04.30&amp;nbsp; 수정이력 :&lt;br /&gt;
&amp;nbsp;해당 프로젝트 사이트에 대해서&amp;nbsp;잘 못 전달될 수 있는&amp;nbsp;내용이 글에 포함되어서, 해당 부분은 삭제했습니다. 해당 사이트의 극히 일부 개발자의&amp;nbsp;단순한 언급, 그것도 농담일 수도 있는 내용이&amp;nbsp;다수의 반응처럼 오해될 수 있는 부분이 있었고, 공식 발표 내용에는 포함되지 않은 내용도 있어서 본의아니게 발표자나 관련 사업자분들께 누를 끼쳐드린 것 같습니다. 비록 익명으로 된 해당사례가 올라와 있지만, 제가 보다 신중을 기하지 못하여 마음을 상하신 분들이 있다면&amp;nbsp; 사과드립니다. 그리고&amp;nbsp;글 후반후에 제가 다른 발표에서 받은 질문과 일반적인 내용에 대해서 덧붙여서 언급한 내용이 있는데, 해당 사이트 사례와 전혀&amp;nbsp;관계가 없지만, 글을 빨리&amp;nbsp;읽으시는 분들께는 연결해서 생각할 수 있는 오해의 여지가 있을 것 같아서 그 부분도 삭제했습니다.&amp;nbsp; 이 포스트에 포함된 내용으로 사실과 다르게 사례가 전달된다면 전적으로 제 잘못입니다.&lt;br /&gt;
&amp;nbsp; 이 포스트를 포함하여 글의 내용에 대한 문의와 정정요청은 benelog[at]gmail[dot]com으로 해주시면 업무시간 외의 시간에는 최대한 빨리 답변드리겠습니다.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;/P&gt;
&lt;DIV&gt;
&lt;HR style=&quot;BORDER-RIGHT: black 0px; BORDER-TOP: black 1px dotted; DISPLAY: block; BORDER-LEFT: black 0px; BORDER-BOTTOM: black 0px; HEIGHT: 1px&quot;&gt;
&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&amp;nbsp;발표자료 : &lt;A href=&quot;http://www.jco.or.kr/conference/data/10th/Tiger-3.zip&quot;&gt;http://www.jco.or.kr/conference/data/10th/Tiger-3.zip&lt;/A&gt;&lt;br /&gt;
&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;br /&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 물개선생님 김승권님이 2009년 JCO 컨퍼런스에서 발표하신, 국내 대형 보험사에 Spring batch 기반으로 배치프레임웍을 적용한 사례입니다. 해당 보험사는 처리 자료 건수가 1억건 단위에 운영인력 50명, 800여건 작업을 돌리는 큰 규모의 배치 시스템을 가지고 있다고 합니다.&amp;nbsp;&lt;br /&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;그 프로젝트에서는 개발자들이 더 쉽게 프레임웍을 적용하기 위해서 Job의 유형별로&amp;nbsp;설정을 간편하게 만들 수 있는 FactoryBean을 제공했다고 합니다. &amp;nbsp; 그렇게 Job유형별로&amp;nbsp;설정이 정리되니, Spring의 설정파일을 읽어서 배치Job에 대한 정리된 정보와 통계까지 볼 수 있는 관리화면도 제공할 수 있게되는, 처음에는 생각하지 않았던 장점도 생겼다고 하네요. 저도 프로젝트에서는 같은 유형의 Job의 설정에는 중복코드가 없게 하기 위해서 유형에 따른 FactoryBean을 만들고 bean 설정에서 parent 속성을 이용했었는데,&amp;nbsp;그런 시도는 스프링배치를 실무에 적용할 때 프로젝트의 특수성을 반영하면서도 간편한 코드를 만들기 위한 필수적인 절차라고 생각되었었습니다.&lt;br /&gt;
&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 그리고, 중간의 Wrapping 계층을 두어서&amp;nbsp;최종 개발자들의 요구사항을 반영할 수 있는 확장점을 만들고, Spring batch의 API변화에 대처할 수 있도록 했다고 합니다. 재미있게도, 이 구조가 ItemProcessor 등 Spring batch 2.0구조와 상당히 비슷해서 프로젝트 내부의 정보가 스프링 쪽에 세어나간&amp;nbsp; 것이 아닌가 하는 농담도 나왔었다고 합니다. &lt;sup class=&quot;footnote&quot;&gt;&lt;a id=&quot;footnote_link_99_1&quot; href=&quot;#footnote_99_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 99, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(99, 1)&quot; style=&quot;color: #f9650d; font-family: Verdana, Sans-serif&quot;&gt;&lt;span style=&quot;display: none&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A href=&quot;http://static.springsource.org/spring-batch/migration/2.0-highlights.html&quot;&gt;http://static.springsource.org/spring-batch/migration/2.0-highlights.html&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A href=&quot;http://forum.ksug.org/viewtopic.php?f=6&amp;amp;amp;t=468&quot;&gt;http://forum.ksug.org/viewtopic.php?f=6&amp;amp;amp;t=468&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/748 href=&quot;http://chanwook.tistory.com/748&quot;&gt;Spring Batch 1.0에서 2.0으로 진화하기- 1. ItemReader/ItemWriter(1)&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/749 href=&quot;http://chanwook.tistory.com/749&quot;&gt;Spring Batch 1.0에서 2.0으로 진화하기- 1. ItemReader/ItemWriter(2)&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/752 href=&quot;http://chanwook.tistory.com/752&quot;&gt;Spring Batch 1.0에서 2.0으로 진화하기- 3. JobExecutionLisneter &amp;amp;amp; 4. ItemProcessor&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/754 href=&quot;http://chanwook.tistory.com/754&quot;&gt;Spring Batch 1.0에서 2.0으로 진화하기- 5. Configuration&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;&#039;&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; 그 외에도&amp;nbsp;기술 지원을 위한 프레임웍 운영팀의 역할이 커졌던 점과 프레임웍 적응을 위한 학습기간이 필요했던 점,&amp;nbsp; 개발계보다 훨씬 많은 건 수의 데이터가&amp;nbsp; Skip이 일어날 수 있는 운영계의 데이터 특성이 개발계에서 모두 반영되지 못해서 나중에 대처를 했었던 사례 등을 들을 수 있었습니다.&lt;br /&gt;
&lt;/P&gt;
&lt;P style=&quot;TEXT-ALIGN: right&quot;&gt;- 정상혁&amp;nbsp; (&lt;A href=&quot;http://benelog.egloos.com%29/&quot;&gt;http://benelog.egloos.com)&lt;/A&gt;&lt;br /&gt;
&lt;/P&gt;
&lt;P&gt;&lt;br /&gt;
&lt;/P&gt;&lt;div class=&quot;footnotes&quot;&gt;
	&lt;ol class=&quot;footnotes&quot;&gt;
		&lt;li id=&quot;footnote_99_1&quot;&gt;&#039; &lt;a href=&quot;#footnote_link_99_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
	&lt;/ol&gt;
&lt;/div&gt;
</description>
			<category>정상혁</category>
			<category>JCO</category>
			<category>Spring Batch</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/99</guid>
			<comments>http://www.ksug.org/99#entry99comment</comments>
			<pubDate>Tue, 14 Apr 2009 08:54:40 +0900</pubDate>
		</item>
		<item>
			<title>Blaze DS or LiveCycle Data Services</title>
			<link>http://www.ksug.org/98</link>
			<description>명확한 비교표를 제시하는군요. 비용과 기술 지원 조합에 따라 네 가지 선택사항이 있습니다. NIO 은 LiveCycle DS라도 Community Edition에서는 지원하지 않는군요. 더 자세한 내용은 원문(&lt;a title=&quot;[http://www.infoq.com/articles/Blaze-LiveCycle]로 이동합니다.&quot; target=&quot;_blank&quot; href=&quot;http://www.infoq.com/articles/Blaze-LiveCycle&quot;&gt;Blaze Data Services or LiveCycle Data Services?&lt;/a&gt;)을 보세요.&lt;br /&gt;
&lt;p&gt;&lt;img title=&quot;table&quot; style=&quot;border: 0px none ; display: inline; margin-left: 0px; margin-right: 0px;&quot; alt=&quot;table&quot; _href=&quot;img://table.png&quot; src=&quot;http://www.infoq.com/resource/articles/Blaze-LiveCycle/en/resources/table.png&quot; width=&quot;600&quot; border=&quot;0&quot; height=&quot;585&quot;&gt;&lt;/p&gt;
&lt;br /&gt;</description>
			<category>안영회</category>
			<category>Adobe</category>
			<category>Blaze DS</category>
			<category>LiveCycle Data Services</category>
			<author>영회</author>
			<guid>http://www.ksug.org/98</guid>
			<comments>http://www.ksug.org/98#entry98comment</comments>
			<pubDate>Tue, 17 Feb 2009 08:45:45 +0900</pubDate>
		</item>
	</channel>
</rss>
