<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss version="2.0">
	<channel>
		<title>한국스프링사용자모임 KSUG</title>
		<link>http://www.ksug.org/</link>
		<description />
		<language>ko</language>
		<pubDate>Thu, 23 Jul 2009 22:40:56 +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 />
		</image>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ksug" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><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="http://mina.apache.org/ftpserver/"&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="Ftp_performance.GIF" class="attachment" src="http://benelog.springnote.com/pages/3157714/attachments/1429048" alt="Ftp_performance.GIF"&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="http://mina.apache.org/ftpserver/ftplet.html" class="external" title="http://mina.apache.org/ftpserver/ftplet.html"&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="footnote"&gt;&lt;a id="footnote_link_100_1" href="#footnote_100_1" onmouseover="tistoryFootnote.show(this, 100, 1)" onmouseout="tistoryFootnote.hide(100, 1)" style="color: #f9650d; font-family: Verdana, Sans-serif"&gt;&lt;span style="display: none"&gt;[각주:&lt;/span&gt;1&lt;span style="display: none"&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 = "clear"&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="org.apache.commons.dbcp.BasicDataSource"&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="driverClassName" value="${jdbc.driverClassName}" /&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="url" value="${jdbc.url}" /&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="username" value="${jdbc.username}" /&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="password" value="${jdbc.password}" /&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="initialSize" value="${dbpool.initialSize}" /&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="footnote"&gt;&lt;a id="footnote_link_100_2" href="#footnote_100_2" onmouseover="tistoryFootnote.show(this, 100, 2)" onmouseout="tistoryFootnote.hide(100, 2)" style="color: #f9650d; font-family: Verdana, Sans-serif"&gt;&lt;span style="display: none"&gt;[각주:&lt;/span&gt;2&lt;span style="display: none"&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="http://www.springframework.org/schema/beans"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ftp="http://mina.apache.org/ftpserver/spring/v1"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="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; "&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ftp:server id="server"&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="default" port="2222" /&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="ftplet1"&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="ftplet" /&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="org/apache/ftpserver/example/osgiservice/users.properties" /&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="org.apache.ftpserver.FtpServer"&amp;nbsp;&amp;nbsp; ref="server"&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="ftplet" interface="org.apache.ftpserver.ftplet.Ftplet" /&amp;gt;&lt;/u&gt;&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class="org.apache.ftpserver.example.osgiservice.impl.FtpServerLifecycle"&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; init-method="init" destroy-method="destroy"&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="server" ref="server" /&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="footnotes"&gt;
	&lt;ol class="footnotes"&gt;
		&lt;li id="footnote_100_1"&gt;
HDFS로 접근하는 FTP서버에 대한 자료&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="https://sites.google.com/a/iponweb.net/hadoop/Home/hdfs-over-ftp" title="https://sites.google.com/a/iponweb.net/hadoop/Home/hdfs-over-ftp" class="external"&gt;HDFS over FTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gruter.co.kr/213" class="external" title="http://www.gruter.co.kr/213"&gt;hadoop을 이용한 ftp server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt; &lt;a href="#footnote_link_100_1"&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
		&lt;li id="footnote_100_2"&gt;&lt;a href="http://mina.apache.org/ftpserver/apache-ftpserver-100-release.html"&gt;http://mina.apache.org/ftpserver/apache-ftpserver-100-release.html&lt;/a&gt;에
서 다운 받을 수 있습니다. &lt;a href="#footnote_link_100_2"&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="BORDER-RIGHT: black 0px; BORDER-TOP: black 1px dotted; DISPLAY: block; BORDER-LEFT: black 0px; BORDER-BOTTOM: black 0px; HEIGHT: 1px"&gt;
&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&amp;nbsp;발표자료 : &lt;A href="http://www.jco.or.kr/conference/data/10th/Tiger-3.zip"&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="footnote"&gt;&lt;a id="footnote_link_99_1" href="#footnote_99_1" onmouseover="tistoryFootnote.show(this, 99, 1)" onmouseout="tistoryFootnote.hide(99, 1)" style="color: #f9650d; font-family: Verdana, Sans-serif"&gt;&lt;span style="display: none"&gt;[각주:&lt;/span&gt;1&lt;span style="display: none"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&amp;#13;&amp;#10;&lt;P&gt;&lt;A href="http://static.springsource.org/spring-batch/migration/2.0-highlights.html"&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="http://forum.ksug.org/viewtopic.php?f=6&amp;amp;amp;t=468"&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="http://chanwook.tistory.com/748"&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="http://chanwook.tistory.com/749"&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="http://chanwook.tistory.com/752"&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="http://chanwook.tistory.com/754"&gt;Spring Batch 1.0에서 2.0으로 진화하기- 5. Configuration&lt;/A&gt;&lt;/P&gt;&amp;#13;&amp;#10;&lt;P&gt;'&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="TEXT-ALIGN: right"&gt;- 정상혁&amp;nbsp; (&lt;A href="http://benelog.egloos.com%29/"&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="footnotes"&gt;
	&lt;ol class="footnotes"&gt;
		&lt;li id="footnote_99_1"&gt;' &lt;a href="#footnote_link_99_1"&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="[http://www.infoq.com/articles/Blaze-LiveCycle]로 이동합니다." target="_blank" href="http://www.infoq.com/articles/Blaze-LiveCycle"&gt;Blaze Data Services or LiveCycle Data Services?&lt;/a&gt;)을 보세요.&lt;br /&gt;
&lt;p&gt;&lt;img title="table" style="border: 0px none ; display: inline; margin-left: 0px; margin-right: 0px;" alt="table" _href="img://table.png" src="http://www.infoq.com/resource/articles/Blaze-LiveCycle/en/resources/table.png" width="600" border="0" height="585"&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>
		<item>
			<title>제10회 한국자바개발자 컨퍼런스</title>
			<link>http://www.ksug.org/97</link>
			<description>JCO 홈페이지를 방문하시면 보다 자세한 컨퍼런스 정보를 확인하실 수 있습니다. &lt;br /&gt;

* 홈페이지 URL: &lt;a href="http://www.jco.or.kr"&gt;http://www.jco.or.kr/&lt;/a&gt; &lt;br /&gt;

&lt;br /&gt;

&lt;a href="http://www.jco.or.kr"&gt;

    &lt;img src="http://www.jco.or.kr/conference/img10th/10th_jco_conf_notice.jpg" alt="제 10회 한국자바개발자 컨퍼런스" style="border: 0pt none ;" width="620" height="1522"&gt;

&lt;/a&gt;</description>
			<category>안영회</category>
			<author>영회</author>
			<guid>http://www.ksug.org/97</guid>
			<comments>http://www.ksug.org/97#entry97comment</comments>
			<pubDate>Mon, 09 Feb 2009 13:47:18 +0900</pubDate>
		</item>
		<item>
			<title>[Spring batch]배치 어플리케이션 실행 스크립트와 빌드</title>
			<link>http://www.ksug.org/96</link>
			<description>&lt;p&gt;&amp;nbsp; 스프링배치를 처음 접할 때는 만들어진 Job을 어떻게 빌드하고, 실행시킬지가 감이 잘 잡히지 않을 수도 있습니다.
Qurtz를 이용한 스케쥴링을 하고 Web Application Server안에서 실행시킨다면 다른 Web
application과 같이 배포시킬 수도 있을 것입니다. 그래도 &amp;nbsp;&lt;a href="http://www.ksug.org/69" class="external" title="http://www.ksug.org/69"&gt;스프링배치 연재(10) JobLauncher와 Job, Step&lt;/a&gt;에
서 소개한 것처럼 CommandLineJobRunner 를 사용하여 직접 console에서 실행시키는 것이 가장 기본적인
실행법이라고 생각됩니다. 그리고 스케쥴링도 하루에 4~5번 정도 실행되는 정도의 작업이라면, 초기 클래스 로딩시간에 대한 큰
부담이 없으므로 Cron을 배치잡을 실행하는 스크립트를 호출하는 것이&amp;nbsp; 더 간편하기도 합니다. 이처럼 command line에서
바로 배치잡을 실행시킬 때, Job이 참조하는 jar파일들을 같이 묶고, 실행할 때 그 jar들을 classpath에 지정하는
스크립트를 만드는 과정을 정리해 봅니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 먼저 배치Job을 실행시킬 수 있는 스크립트를 만들어 봅니다.
-classpath 지정을 특정 디렉토리 아래에 있는 *.jar파일을
다 포함시키도록 만드는 것이 편리합니다. Tomcat 같은 java application을 실행시키는 쉘스크립트를 보면, 이런
부분이 다 유사하게 들어가 있습니다.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 다음은 Windows 계열에서 실행시킬 수 있는
runJob.bat파일의 예제입니다. JAVA_HOME 환경변수에 실행하고자 하는 JAVA버전이 있는 디렉토리가 지정되어 있어야
합니다. 스크립트가 있는 곳 아래 /lib 폴더 아래에 job에서 참조하는 jar파일이 있는 것으로 설정했습니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;@echo off&lt;br /&gt;
set JAVA_CMD=%JAVA_HOME%\bin\java&lt;br /&gt;
set MAIN_CLASS=org.springframework.batch.core.launch.support.CommandLineJobRunner&lt;br /&gt;
set CLASSPATH=.&lt;br /&gt;
FOR %%F IN (*.jar) DO call :addcp %%F&lt;br /&gt;
&lt;br /&gt;
FOR %%F IN (lib\*.jar) DO call :addcp %%F&lt;br /&gt;
goto extlibe&lt;br /&gt;
&lt;br /&gt;
:addcp&lt;br /&gt;
set CLASSPATH=%CLASSPATH%;%1&lt;br /&gt;
goto :eof&lt;br /&gt;
&lt;br /&gt;
:extlibe&lt;br /&gt;
&lt;br /&gt;
"%JAVA_CMD%" -Xmx512M -cp "%CLASSPATH%" %MAIN_CLASS% %*&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp; 이 파일을 이용해서 특정 Job을 실행시키는 스크립트를 따로 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;cd /D D:\workspace\imaso-batch\deploy&lt;br /&gt;
runJob.bat applicationContext.xml teamDbToXmlJob %*&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;
CommandLineJobRunner의 형식과 마찬가지로 runJob.bat [설정파일명] [Job의 bean id]
[파라미터1] [파라미터2]... 의 형식입니다. 설정파일에는 해당하는 Job에 대한 설정과 공통적인 JobLauncher,
Database에 대한 설정 등 Job에서 필요한 모든 설정이 다 포함되어야 합니다. 공통적인 부분과 특정 Job에만 필요한
것을 잘 분리해서 include 등을 이용해서 applicationContext 파일을 구성하는 것이 여러 Job을 관리할 때
효율적인 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 다음은 리룩스나 유닉스에서 실행되는 runJob.sh 쉘스크립트의
예제입니다. run.bat와 마찬가지로 실행위치/lib에 참조하는 라이브러리의 jar파일이 했지만,
imaso-batch.jar라는 파일하나는 실행위치 디렉토리에 있는 것을 따로 지정하도록 했습니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;#!/bin/sh&lt;br /&gt;
BASEDIR=`dirname $0`&lt;br /&gt;
cd $BASEDIR&lt;br /&gt;
&lt;br /&gt;
CLASSPATH=$BASEDIR&lt;br /&gt;
CLASSPATH=$CLASSPATH:$BASEDIR/imaso-batch.jar&lt;br /&gt;
&lt;br /&gt;
for f in `find $BASEDIR/lib -type f -name "*.jar"`&lt;br /&gt;
do&lt;br /&gt;
&amp;nbsp;&amp;nbsp; CLASSPATH=$CLASSPATH:$f&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
JAVA_BIN=$JAVA_HOME/bin/java&lt;br /&gt;
OPT="-cp $CLASSPATH -Xmx512M"&lt;br /&gt;
&lt;br /&gt;
echo $JAVA_BIN&lt;br /&gt;
$JAVA_BIN $OPT org.springframework.batch.core.launch.support.CommandLineJobRunner&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; runJob.sh를 이용해서 특정 Job을 실행시키는 스크립트를 다음과 같이 만듭니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;#!/bin/sh&lt;br /&gt;
BASEDIR=`dirname $0`&lt;br /&gt;
cd $BASEDIR&lt;br /&gt;
sh runJob.sh applicationContext.xml teamDbToXmlJob "${1+$@}"&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp; 이제 이런 스크립트와 jar파일들을 같이 배포할 수 있도록 Maven에 설정을 추가합니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;
pom.xml에 배포시 필요한 jar파일들을 같이 복사할 수 있도록 &amp;lt;build/&amp;gt;절 밑에 다음과 같이
maven-dependency-plugin의 설정을 추가합니다. 예제에서는 ${basedir}/deploy/lib 폴더로
복사되게 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;version&amp;gt;2.0&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;executions&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;execution&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;id&amp;gt;copy-dependencies&amp;lt;/id&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;goals&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/goals&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;outputDirectory&amp;gt;${basedir}/deploy/lib&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;overWriteReleases&amp;gt;false&amp;lt;/overWriteReleases&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;overWriteSnapshots&amp;gt;false&amp;lt;/overWriteSnapshots&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;overWriteIfNewer&amp;gt;true&amp;lt;/overWriteIfNewer&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/execution&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;lt;/executions&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/plugin&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; 그리고 Job의 구성을 위해 작성한 xml파일과 class파일들을 jar로 묶을 수 있도록 jar plugin을 설정합니다. ${basedir}/deploy로 복사하도록 했습니다.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;maven-jar-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;outputDirectory&amp;gt;${basedir}/deploy&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;br /&gt;
&amp;lt;/plugin&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 마지막으로 처음에 작성한 스크립트 파일들이 ${basedir}/deploy로 복사되도록 resources-plugin 설정도 추가했습니다. 원래&amp;nbsp;&lt;a title="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Super_POM" class="external" href="http://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Super_POM"&gt;Maven Super POM&lt;/a&gt;에서 스크립트들의 디렉토리가 src/main/scripts로 지정이 되어 있는데, 어떤 플러그인에서 기본적으로 참조되는 지는 파악이 잘 안 됩니다. (아시는 분은 알려주셨으면 합니다.)&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;executions&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;execution&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;id&amp;gt;copy-resources&amp;lt;/id&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;phase&amp;gt;package&amp;lt;/phase&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;goals&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;goal&amp;gt;copy-resources&amp;lt;/goal&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/goals&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;configuration&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;outputDirectory&amp;gt;${basedir}/deploy/&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;resources&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;resource&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;directory&amp;gt;src/main/scripts&amp;lt;/directory&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/resource&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/resources&amp;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;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/configuration&amp;gt;&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; &amp;lt;/execution&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/executions&amp;gt;&lt;br /&gt;
&amp;lt;/plugin&amp;gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;
이렇게 설정한 후 mvn package를 실행하면 ${basedir}/deploy 아래에 스크립트, 참조라이브러리, 직접 작성한
application의 jar파일들이 같이 생성됩니다. 이 디렉토리를 개발팀에서 쓰고 있는 배포방식을 이용해서 서버로 복사하게
합니다. Hudson에서 제공하는 FTP업로드 기능 등도 이럴 때 활용할 수&amp;nbsp;있겠습니다. &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 배포된
서버에서 스케쥴링을 하고 싶다면 runJob.bat, runJob.sh나 이럴 이용한 스크립트를 crontab에 설정하면
됩니다. 실행되는 OS user나 JAVA_HOME 등의 환경변수값이 잘 넘어가는지 유의해야 합니다.&amp;nbsp;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; pom.xml파일이나 runJob.sh, runJob.sh의 스크립트는 &lt;a href="http://benelog.springnote.com/pages/2474228/attachments/1080304" class="external" title="http://benelog.springnote.com/pages/2474228/attachments/1080304"&gt;imaso-batch.zip&lt;/a&gt;에 포함되어 있습니다.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style="text-align: right;"&gt;- 정상혁, &lt;a href="http://benelog.egloos.com/"&gt;http://benelog.egloos.com&lt;/a&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;/p&gt;</description>
			<category>정상혁</category>
			<category>Spring Batch</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/96</guid>
			<comments>http://www.ksug.org/96#entry96comment</comments>
			<pubDate>Mon, 02 Feb 2009 08:09:21 +0900</pubDate>
		</item>
		<item>
			<title>스프링배치 국내 자료 모음</title>
			<link>http://www.ksug.org/94</link>
			<description>&lt;H4&gt;정상혁&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://benelog.egloos.com/1970645 href="http://benelog.egloos.com/1970645"&gt;이미 35개 이상의 Accenture 고객사에 Spring batch가 적용되고 있다&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/40 href="http://www.ksug.org/40"&gt;스프링배치 연재(1)&amp;nbsp;배치처리의 특징&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#568942&gt;&lt;A class=external title=http://www.ksug.org/42 href="http://www.ksug.org/42"&gt;스프링배치 연재(2) 대용량 처리 배치 프로그램을 만들 때 유의할 점&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/45 href="http://www.ksug.org/45"&gt;스프링배치 연재(3) 스프링배치 프로젝트와 주요 기능들&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/46 href="http://www.ksug.org/46"&gt;스프링배치 연재(4)&amp;nbsp;스프링배치의 구조와 구성요소들&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/48 href="http://www.ksug.org/48"&gt;스프링배치 연재(5) ItemReader와 ItemWriter&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/56 href="http://www.ksug.org/56"&gt;스프링배치 연재(6) 플랫파일 읽기와 쓰기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/58 href="http://www.ksug.org/58"&gt;스프링배치 연재(7) XML파일 읽기와 쓰기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/59 href="http://www.ksug.org/59"&gt;스프링배치 연재(8) JDBC를 이용한 Cursor 기반의 DB 조회&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/61 href="http://www.ksug.org/61"&gt;스프링배치 연재(9) JobRepository&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/69 href="http://www.ksug.org/69"&gt;스프링배치 연재(10) JobLauncher와 Job, Step&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/78 href="http://www.ksug.org/78"&gt;스프링배치 연재(11) 재시작과 재시도&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/80 href="http://www.ksug.org/80"&gt;스프링배치 연재(12) 이벤트 처리, 유효성 검사, 변환, 기존 클래스 활용&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/81 href="http://www.ksug.org/81"&gt;스프링배치 연재(13) 스프링배치의 형제들&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/82 href="http://www.ksug.org/82"&gt;스프링배치 연재(14) 드라이빙 쿼리와 iBatis의 활용&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/86 href="http://www.ksug.org/86"&gt;스프링배치 연재(15) 하이버네이트 활용과 여러파일 읽기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/91 href="http://www.ksug.org/91"&gt;스프링배치 연재(16) DB to XML 파일 만들기 예제&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/96 href="http://www.ksug.org/96"&gt;배치 어플리케이션 실행 스크립트와 빌드&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://chanwook.tistory.com/669 href="http://chanwook.tistory.com/669"&gt;엘레강스한 배치 추상화 프레임웍 - 스프링 배치&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/678 href="http://chanwook.tistory.com/678"&gt;[Beta 1.0]Spring Batch 프레임웍 레퍼런스 한글 편역 버전.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/693 href="http://chanwook.tistory.com/693"&gt;[Beta 2.0] Spring Batch 프레임웍 레퍼런스 한글 편역 버전.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/740 href="http://chanwook.tistory.com/740"&gt;[Beta 3.0] Spring Batch 프레임웍 레퍼런스 한글 편역 버전.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/671 href="http://chanwook.tistory.com/671"&gt;제 1부. 스프링 배치 기본 아키텍처와 잡(Job) 직접 실행해보기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/676 href="http://chanwook.tistory.com/676"&gt;제 2부. FlatFileItemReader와 그 친구들(파트1)&lt;/A&gt; &lt;A href="http://chanwook.tistory.com/676" rel=nofollow&gt;&lt;FONT color=#0066cc&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/677 href="http://chanwook.tistory.com/677"&gt;제 2부. FlatFileItemReader와 그 친구들(파트2)&lt;/A&gt; (&lt;A class=external title=http://chanwook.tistory.com/680 href="http://chanwook.tistory.com/680"&gt;소스 및 PPT&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/682 href="http://chanwook.tistory.com/682"&gt;제 3부. FlatFileItemWriter와 아이템 변환하기&lt;/A&gt; (&lt;A class=external title=http://chanwook.tistory.com/683 href="http://chanwook.tistory.com/683"&gt;소스 및 PPT&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/686 href="http://chanwook.tistory.com/686"&gt;제 4부. StAX 기반 아이템 처리&lt;/A&gt; (&lt;A class=external title=http://chanwook.tistory.com/691 href="http://chanwook.tistory.com/691"&gt;소스 및 PPT&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/689 href="http://chanwook.tistory.com/689"&gt;제 5부. 데이터베이스에 아이템 쓰고, 읽고~&lt;/A&gt; (&lt;A class=external title=http://chanwook.tistory.com/692 href="http://chanwook.tistory.com/692"&gt;소스 및 PPT&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://www.ksug.org/55 href="http://www.ksug.org/55"&gt;제 6부. 배치 반복 처리하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/698 href="http://chanwook.tistory.com/698"&gt;Spring Batch 쓰임새 분석 - 단순한 배치 반복하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/701 href="http://chanwook.tistory.com/701"&gt;Spring Batch 쓰임새 분석 - 자동적인 재시작&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/688 href="http://chanwook.tistory.com/688"&gt;Batch Processing Strategies at Spring Batch&lt;/A&gt;&amp;nbsp;&lt;A href="http://chanwook.tistory.com/688" rel=nofollow&gt;&lt;FONT color=#0066cc&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/694 href="http://chanwook.tistory.com/694"&gt;스프링 배치's 액터(Actor)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/748 href="http://chanwook.tistory.com/748"&gt;Spring Batch 1.0에서 2.0으로 진화하기- 1. ItemReader/ItemWriter(1)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/749 href="http://chanwook.tistory.com/749"&gt;Spring Batch 1.0에서 2.0으로 진화하기- 1. ItemReader/ItemWriter(2)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/752 href="http://chanwook.tistory.com/752"&gt;Spring Batch 1.0에서 2.0으로 진화하기- 3. JobExecutionLisneter &amp;amp; 4. ItemProcessor&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://chanwook.tistory.com/754 href="http://chanwook.tistory.com/754"&gt;Spring Batch 1.0에서 2.0으로 진화하기- 5. Configuration&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://whiteship.me/1794 href="http://whiteship.me/1794"&gt;The Domain Language of Batch - Spring Batch Chapter 2&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://whiteship.me/1795 href="http://whiteship.me/1795"&gt;ItemReader - Spring Batch Chapter 3&lt;/A&gt;&lt;/P&gt;
&lt;H4&gt;경구사님&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://blog.naver.com/kyong94s/53401317 href="http://blog.naver.com/kyong94s/53401317"&gt;Spring batch 개발환경 설정&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.jco.or.kr/conference/data/10th/Tiger-3.zip href="http://www.jco.or.kr/conference/data/10th/Tiger-3.zip"&gt;차세대배치시스템구축성공전략&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;- &lt;A class=external title=http://www.ksug.org/99 href="http://www.ksug.org/99"&gt;[Spring batch]차세대 배치시스템 구축 성공전략 - JCO컨퍼런스&lt;/A&gt;&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=212828165 href="http://www.javajigi.net/pages/viewpage.action?pageId=212828165"&gt;Spring Batch 시작하기&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;KSUG포럼&lt;/H4&gt;
&lt;P&gt;&lt;A class=external title=http://forum.ksug.org/viewtopic.php?f=6&amp;amp;amp;t=77 href="http://forum.ksug.org/viewtopic.php?f=6&amp;amp;amp;t=77"&gt;SpringBatch에 대한 경험담을 듣고 싶습니다.&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class=external title=http://forum.ksug.org/viewtopic.php?f=6&amp;amp;t=157 href="http://forum.ksug.org/viewtopic.php?f=6&amp;amp;t=157"&gt;Spring Batch ItemReader 구현체에 대한 궁금증&amp;nbsp;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
			<category>정상혁</category>
			<category>Spring Batch</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/94</guid>
			<comments>http://www.ksug.org/94#entry94comment</comments>
			<pubDate>Mon, 19 Jan 2009 07:12:33 +0900</pubDate>
		</item>
		<item>
			<title>Winter of Code 행사 공지</title>
			<link>http://www.ksug.org/93</link>
			<description>&lt;table bordercolorlight="skyblue" bordercolordark="skyblue" border="8" cellpadding="5" width="680"&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;

&lt;p class="MsoNormal"&gt;&lt;img title="top(1).jpg" class="attachment" src="http://hello0.springnote.com/pages/2384678/attachments/1087042"&gt;


&lt;/p&gt;

&lt;div style="margin-left: 40px; margin-right: 40px; line-height: 1.5em;"&gt;

&lt;font serif;="" face="Sans" size="2.8"&gt;

안녕하세요&lt;br /&gt;
Winter of Code 운영자 입니다.&lt;br /&gt;
&lt;br /&gt;Winter of Code란 학생-개발자간의 합작 프로젝트로 일정기간(1/31~3/18) 동안 프로젝트를 진행을 하면서 멘토와, 그리고 다른 참가자와 만나서 교류(네트워킹)하는 행사 입니다.


&lt;br /&gt;
&lt;/font&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;a style="color: rgb(0, 102, 153); text-decoration: underline;" href="http://devmento.co.kr/devmain/woc/wocproject/perform/perform_list.jsp" target="_blank"&gt;WoC 프로젝트 리스트 보기&lt;/a&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
특히 WoC 2008에서는, 참여, 공유, 개방이라는 키워드에 알맞게, 프로젝트를 진행하는 것 못지 않게, WoC 참가자들간의 교류를 지향 합니다. &lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 255);"&gt;&lt;br /&gt;
&lt;h3&gt;Code your Network!!&lt;/h3&gt;&lt;/span&gt;이 캐치프레이즈는 개발을 꿈꾸는 예비개발자들의 실력향상에 못지않게, &lt;span style="font-weight: bold;"&gt;같은 분야의 동료를 만나는 것의 중요성&lt;/span&gt;을 이야기 합니다.&lt;br /&gt;
WoC의 프로젝트기간이 끝난 이후에도, 직접 만들고 싶은 서비스나, 프로그램이 있을 때 WoC에서 함께 했던 동료들과 아이디어와 기술을 나누고, 함께 시도 할 수 있는 Network을 넓혀가는 행사로 만들어 가려고 합니다. &lt;br /&gt;
&lt;br /&gt;많은 참여 부탁 드립니다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;


&lt;a href="http://devmento.co.kr/devmain/woc/wocproject/perform/perform_list.jsp"&gt;

&lt;/a&gt;&lt;/font&gt;&lt;p class="MsoNormal"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;a href="http://devmento.co.kr/devmain/woc/wocproject/perform/perform_list.jsp"&gt;&lt;img src="http://devmento.co.kr/images/woc/main/woc_regist.gif"&gt;

&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;

&lt;font size="4"&gt;&lt;span style="font-weight: bold;"&gt;WoC에 참가를 하게 되면,, (WoC 혜택)&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/p&gt;
&lt;ul&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;프로젝트 진행을 통한 Spec up! &lt;/li&gt;
&lt;/font&gt;&lt;/ul&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;프로젝트 진행 과정에서 발생하는 어려운 문제를 해결해가면서 얻는 기술은 학생 때에 할 수 있는 최고의 Spec Up 기회입니다.&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;ul&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;멘토에게 듣는 개발 실무 &amp;nbsp; &amp;nbsp;&lt;/li&gt;
&lt;/font&gt;&lt;/ul&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;개발실무자인 멘토의 조언을 통해 실무에서 다져진 프로젝트 진행 방법, 그리고 현재 기업에서 가장 필요로 하는 입사자의 능력 혹은 성격 등에 대한 진솔한 조언을 들을 수 있습니다.&lt;br /&gt;
&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;
&lt;ul&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;개발에 관심 있는 친구, 동료를 만날 수 있는 곳 WoC &lt;/li&gt;
&lt;/font&gt;&lt;/ul&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;팀 프로젝트를 통해 인맥을 만들고, 훗날 취업, 서비스 개발의 길을 함께 할 수 있는 친구와 동료를 만날 수 있는 있습니다.&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/font&gt;&lt;div style="padding: 10px; background-color: rgb(250, 255, 169);"&gt;
&lt;span style="font-weight: bold;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;WoC 가이드 보기&lt;/font&gt;&lt;/span&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;a href="http://devmento.co.kr/devmain/woc/intro/woc_intro.jsp" target="_blank"&gt;참가방법 &lt;/a&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;a aiotitle="WoC 프로젝트 리스트" href="http://devmento.co.kr/devmain/woc/wocproject/perform/perform_list.jsp" target="_blank"&gt;WoC 프로젝트 리스트&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://devmento.co.kr/devmain/woc/woc_operation.jsp" target="_blank"&gt;운영안 &lt;/a&gt;&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;/font&gt;&lt;ul&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;WoC에서는 이러한 분들의 참여를 기다리고 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/font&gt;&lt;/ul&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;- 새로운 기술을 습득 하고 실력향상에 열정을 가진 분들&lt;br /&gt;
- 주변의 사람들과 함께 교류(네트워킹)하는 것을 즐기는 분들 &lt;br /&gt;
- 다양한 분야를 다양한 시각으로 바라보는 것을 좋아하는 분들&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;수행계획서 신청기간 :&lt;/b&gt; 08. 12/20~ 09. 1/18 (24시)&lt;br /&gt;
&lt;b&gt;프로젝트 신청기간 &lt;/b&gt;: 08. 12/20~ 09. 1/28 (13시)&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;font size="3"&gt;&lt;span style="font-weight: bold;"&gt;&amp;lt;추가 참가 혜택&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. 오프라인 강연 &lt;/span&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;학생들에게 도움이 되는 다양한 오프라인 강연을 준비하고 있습니다.&amp;nbsp; &lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;ul&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;기업 출신 멘토 강연 (예상주제: 기업개발문화, 기업에서 원하는 인재상, 팀 프로젝트 스킬 등) &lt;br /&gt;
&lt;/li&gt;&lt;li&gt;학생 벤처 성공비결 (난~ 단순히 하고 싶은 프로젝트로 회사를 차렸을 뿐이고! 대박이 났고!)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;개발자의 돋보이는 이력서 &lt;br /&gt;
&lt;/li&gt;&lt;li&gt;개발 서적 번역 스토리 (개발자들의 지적인일상) &amp;nbsp;&lt;br /&gt;
&lt;/li&gt;&lt;/font&gt;&lt;/ul&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;2. 우수작 시상&lt;/span&gt;&lt;br /&gt;
&lt;/font&gt;&lt;ul&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;li&gt;우수작 한국 소프트웨어 진흥원장상 수여 &lt;/li&gt;
&lt;li&gt;최우수상 300만원 (1팀)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;우수상 100만원 (2팀)&lt;br /&gt;
&lt;/li&gt;&lt;li&gt;특별상 20만원씩 (5팀) &lt;/li&gt;
&lt;/font&gt;&lt;/ul&gt;
&lt;div style="margin-left: 40px;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;참고: &lt;/font&gt;&lt;/span&gt;&lt;font serif;="" face="Sans" size="2.8"&gt;WoC 우수작 선정은 멘토와 운영위원회 그리고 참여하는 학생들의 의견을 모아 결정됩니다. 특히 특별상은 WoC 우수작의 백미로 WoC 프로젝트를 진행하는 과정에 열심히 그리고 즐겁게 참여한 팀들에게 드리는 상입니다. Ex: 교류상, 공유상, 인기상&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;3. 프로젝트 보조금 40만원 지급 &lt;/span&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;보조금은 개발 및 연구비용으로 사용처는 크게 오프라인 모임 식음료대와 프로젝트 진행용 도서구입비로 나누어 집니다. 자세한 보조금 사용 내역은 후에 멘토 및 학생프로젝트 팀리더에게 전달 예정입니다. &amp;nbsp;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;4. 사은품&lt;/span&gt;&lt;br /&gt;
&lt;/font&gt;&lt;div style="margin-left: 40px;"&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;- 취업 포탈 정보 교환권&lt;br /&gt;
- W 팩키지: 온?오프라인 행사 참가 시 따뜻한 무릎 담요와 멋진 모자티셔츠를 증정합니다. &amp;nbsp; &amp;nbsp;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;font serif;="" face="Sans" size="2.8"&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;5. 한빛 미디어 40% 할인혜택 (WoC 프로젝트 기간동안)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;

&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;</description>
			<category>안영회</category>
			<author>영회</author>
			<guid>http://www.ksug.org/93</guid>
			<comments>http://www.ksug.org/93#entry93comment</comments>
			<pubDate>Tue, 13 Jan 2009 15:12:25 +0900</pubDate>
		</item>
		<item>
			<title>[Spring batch] 스프링배치 연재(16) DB to XML 파일 만들기 예제</title>
			<link>http://www.ksug.org/91</link>
			<description>&lt;div class="txc-textbox" style="border: 1px solid rgb(254, 254, 184); padding: 10px; background-color: rgb(254, 254, 184);"&gt;
&amp;nbsp; 드디어 마지막회입니다.&amp;nbsp;DB테이블에서 부모-자식 구조의 데이터를 읽어와서 하나의 XML파일로 만드는 작업을 구성해 봤습니다. 코드의 단순함을 위해서 전형적인 N+1쿼리 문제점을 가지는 예제를 만들었는데,&amp;nbsp;공개해 놓고보니 무턱대고 이런 방식을 따라할 사람이 있을까봐 걱정이 되기도 합니다. 예제의 방식보다 더 나은 성능이 필요한 경우에는 DB에서 join할 키값을 기준으로 정렬해서 테이블별로 한번씩만 조회한 다음에 sort merge방식으로 부모-자식 테이블간의 짝을 맞춰주는 방법을 쓸 수도 있습니다.&amp;nbsp;하이버네이트를 활용할 수 있다면 batch size 속성을 지정하는 것이 도움이 될 수 있는 상황도 있을 것입니다.&amp;nbsp;(&lt;a href="http://chanwook.tistory.com/710"&gt;http://chanwook.tistory.com/710&lt;/a&gt;&amp;nbsp;참조) 저는 프로젝트에서 활용할 때, 기대 성능을 충족시키는데 지장이 없었던&amp;nbsp;작은 건수의 처리는 그냥 N+1쿼리방식을 쓰고 많은 건수를 읽는 작업은 sort merge방식을 사용했습니다. &lt;br /&gt;
&amp;nbsp; 그리고 XStream으로 XML파일을 생성할 때 특별한 설정을 안 하면, 태그 명 중에 들어간 언더바 1개(_)가 언더바 2개(__)로 바뀌어버리는데, 처음 써보는 사람들이 공통적으로 겪을 수 있는 시행착오일 것입니다.&lt;br /&gt;
&lt;/div&gt;
&lt;h4&gt;DB에서 2개 테이블을 엮어서 XML파일로 쓰기 예제&lt;/h4&gt;
&lt;p&gt;&amp;nbsp; DB에서 부모-자식 간의 관계로 된 테이블을 읽어서 하나의 XML로 만드는 작업은 실무에서 흔하게 만날 수 있는 배치처리 사례이다. 다음의 예제에서는 팀 테이블(team)과 선수(player)테이블에 DB에 있다고 가정하고 이를 하나의 XML로 만드는 작업을 진행해보고자 한다. 팀 테이블과 선수테이블은 당연히 1대 다 관계로 이루어져 있다. 테이블을 생성하고 테스트로 몇 개의 데이터를 넣어주는 스크립트가 첨부파일(&lt;a class="attachment" title="imaso-batch.zip" href="http://benelog.springnote.com/pages/2474228/attachments/1080304"&gt;imaso-batch.zip&lt;/a&gt;)에 포함되어 있다. (src/main/resources/data 폴더)&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img class="attachment" title="baseball.GIF" alt="baseball.GIF" src="http://benelog.springnote.com/pages/2474228/attachments/1079858"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 먼저 부모 테이블인 팀 테이블을 읽어오는 ItemReader를 작성해 보자. JdbcCursorItemReader클래스를 이용해서 쿼리와 그 결과를 Team의 도메인 오브젝트로 매핑할 수 있는 mapper를 지정한다. (리스트12)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;bean id="teamMasterReader" class="org.springframework.batch.item.database.JdbcCursorItemReader"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;property name="dataSource" ref="dataSource" /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;property name="mapper"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;bean class="org.springframework.jdbc.core.BeanPropertyRowMapper" &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;property name="mappedClass"&amp;nbsp; value="imaso.batch.domain.Team"/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;property name="sql"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;value&amp;gt; SELECT&amp;nbsp; team_id, team_name, symbol, rank FROM team&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 12 : JDBC커서 방식으로 Team테이블 조회&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp; 간단한 코딩을 위해서 mapper에 BeanPropertyRowMapper를 사용하고 mappedClass속성을 team테이블의 내용을 담는 도메인 오브젝트인 Team클래스로 지정했다. Team 클래스는 team 테이블의 컬럼명이 그 멤버변수로 선언되고 있고, getter,setter를 가진 단순한 클래스이다. Java의 일반적인 명명규칙에 맞추어서 언더바(_)가 없이 camel casing으로 표기되어 있다. BeanPropertyRowMapper는 언더바와 camel casing간의 변환을 자동으로 해 주기 때문에 team_id의 컬럼도 setTeamId메소드를 통해서 값이 채워지게 된다. 만약 성능을 조금이라도 향상시키고 싶다면 다소의 추가 코딩을 하더라도 별도의 RowMapper를 구현해서 사용하기 바란다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이제 team의 자식 테이블인 player를 읽을 차례다. 여러가지 방법이 있겠지만, DrvingQuery방식과 비슷하게 team 1건마다 그 팀에 소속하는 선수를 조회하는 쿼리를 던지는 방식을 사용해 보았다. 이를 위해 상위테이블만 읽어온 item object에서 그 자식 테이블을 읽어서 채워줄 수 있는 경우를 추상화하여 ItemWithChildrenReader라는 클래스를 작성해 보았다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;public abstract class ItemWithChildrenReader extends DelegatingItemReader{&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp; public Object read() throws Exception {&lt;br /&gt;
&amp;nbsp; Object item = super.read();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if(item==null) return null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setChildren(item);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return item;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; protected abstract void setChildren(Object item);&lt;br /&gt;
&amp;nbsp;&amp;nbsp; public ItemWithChildrenReader() {}&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 13: 부모-자식 테이블 조회기능을 추상화한 클래스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 이를 상속한 클래스에서 setChildren메소드를 구현하여 자식 테이블을 읽어서 넣도록 설계된 것이다.&lt;br /&gt;
&amp;nbsp; Team테이블에서 읽어온 값에서 Player테이블을 채워줄 수 있는 ItemReader는 리스트 14와 같이 구현하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;public class TeamReader extends ItemWithChildrenReader {&lt;br /&gt;
private RowMapper mapper;&lt;br /&gt;
private JdbcTemplate jdbcTemplate;&lt;br /&gt;
private String sql;&lt;br /&gt;
protected void setChildren(Object item) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Team team = (Team)item;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Object[] params = new Object[]{team.getTeamId()};&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; @SuppressWarnings("unchecked")&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;Player&amp;gt; playerList = jdbcTemplate.query(sql, params, mapper);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; team.setPlayerList(playerList);&lt;br /&gt;
}&lt;br /&gt;
&amp;nbsp;// private 멤버 객체에 대한 setter 생략&lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 14ㅣ Player를 읽어서 Team에 넣어주는 클래스&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; setChild메소드 안에서 JdbcTemplate, RowMapper를 이용하여 player테이블의 건들을 읽어와서 team객체에 넣어준다. 만약 두 테이블을 연결시키는 키 속성명, 결과가 들어갈 속성명까지도 설정파일로 빼고 BeanUtils클래스의 setProperty, getProperty들을 활용한다면 보다 일반화시킨 클래스를 만들 수도 있다.&lt;br /&gt;
TeamReader의 설정에는 앞에서 나온 Team테이블을 읽어오는 TeamMasterRead를 itemReader속성으로 지정해 준다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;bean id="teamReader"&amp;nbsp; class="imaso.batch.item.TeamReader"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;property name="itemReader" ref="teamMasterReader" /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;lt;property name="sql"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;value&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SELECT team_id, player_id ,player_name, main_position&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; FROM player&amp;nbsp; WHERE team_id = ?&lt;br /&gt;
&amp;nbsp; &amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;!-- mapper, jdbctemplate에 대한 설정은 생략 --&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 15 : TEAM과 PLAYER를 같이 읽어오는 클래스의 설정&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 만약 위의 구현처럼 쿼리를 건마다 하나씩 던지고 싶지 않다면, 다소 구현이 복잡해 지더라도 team과 player 테이블 모두 team_id를 기준으로 정렬해서 조회한 후에 sorted merge 방식과 유사하게 양쪽 item들의 team_id값을 비교해 가면서 team에다 player를 붙여주는 구현도 가능하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; 그 다음은 읽어온 내용을 XML파일로 쓰는 기능은 StaxEventItemWriter와 XStream 라이브러리를 같이 사용해서 구성했다. XStream 라이브러리를 보다 잘 활용하기 위해서 반드시 프로젝트가 의존하고 있는spring-oxm을 최신버전인 1.5.4로 참조해서 쓰기 바란다. 스프링배치의&amp;nbsp; 샘플 프로젝트에서는 1.0.0버전을 참조하고 있는데, 당연히 최신버전에 비해 기능이 많이 빠져있다. 그리고 앞으로 설명한 아노테이션을 이용한 태그명 설정을 사용하기 위해서는 spring-oxm-tiger 라이브러리도 포함시켜야 한다. 예제에서 사용한 Maven2의 pom.xml파일은&amp;nbsp;첨부파일 내에 포함되어 있다.&lt;br /&gt;
&amp;nbsp;생성시킬 XML파일의 형태는 team태그 밑에 team 컬럼의 속성들이 들어가고 player테이블의 내용은 team 태그 밑에서 player태그로 여러 번 반복된다. (리스트 16)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;content&amp;gt;&lt;br /&gt;
&amp;lt;team&amp;gt; &amp;lt;team_id&amp;gt;1&amp;lt;/team_id&amp;gt; &amp;lt;team_name&amp;gt;Lotte&amp;lt;/team_name&amp;gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;symbol&amp;gt;Giants&amp;lt;/symbol&amp;gt;&amp;lt;rank&amp;gt;1&amp;lt;/rank&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;player&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;playerId&amp;gt;0&amp;lt;/playerId&amp;gt; &amp;lt;player_name&amp;gt;이대호&amp;lt;/player_name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;main_position&amp;gt;3루수&amp;lt;/main_position&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/player&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;player&amp;gt;....&amp;lt;/player&amp;gt; &amp;lt;player&amp;gt;....&amp;lt;/player&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;team&amp;gt;...&amp;lt;/team&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;team&amp;gt;...&amp;lt;/team&amp;gt;&lt;br /&gt;
&amp;lt;/content&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img class="attachment" title="baseballXml.GIF" alt="baseballXml.GIF" src="http://benelog.springnote.com/pages/2474228/attachments/1080044"&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;리스트 16 : 생성할 XML파일&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
앞의 teamReader에서 읽어온 내용을 쓰기 위한 StaxEventItemWriter을 리스트17과 같이 설정한다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;bean id="teamXmlWriter" &amp;nbsp; class="org.springframework.batch.item.xml.StaxEventItemWriter"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="resource"&amp;nbsp; value="file:target/team.xml" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="serializer" ref="teamSerializer" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="rootTagName" value="content" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name="overwriteOutput" value="true" /&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;bean id="teamSerializer"&amp;nbsp; class="org.springframework.batch.item.xml.oxm.MarshallingEventWriterSerializer"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;constructor-arg ref="teamMarshaller"/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 17 : StaxEventItemWriter의 설정&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;루트태그명을 rootTagName에서 content로 지정하고 xml을 생성하는데 필요한 요소들을 serializer속성-&amp;gt; MarshallingEventWriterSerializer 클래스-&amp;gt; teamMarshaller 빈으로 연결시켜 주는 것까지는 기본적인 사용법과 별차이가 없다.&lt;br /&gt;
여기서 도메인 오브젝트인 Team과 Player클래스에서 태그를 연결하기 위한 설정을 편하게 하기 위해서 아노테이션을 사용했다. AnnotationXStreamMarshaller를&amp;nbsp; 사용하면 도메인 오브젝트 내에서 리스트18처럼 태그를 지정해 줄 수 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;public class Team {&lt;br /&gt;
@XStreamAlias("team_id") private int teamId;&lt;br /&gt;
@XStreamAlias("team_name") private String teamName;&lt;br /&gt;
private String symbol;&lt;br /&gt;
private int rank;&lt;br /&gt;
@XStreamImplicit private List&amp;lt;Player&amp;gt; playerList;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 18 : 태그명을 어노테이션으로 지정&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp; @XStreamAlias 어노테이션을 이용해서 멤버변수의 이름과 태그명이 다른 경우에는 태그명을 명시해 준다. playerList필드처럼 Collection이면서, 그 필드의 이름 자체는 태그로 옮기어 지지 않을 경우에는 @XStreamImplicit 어노테이션을 이용한다. 즉, 우리가 만들고자 하는 샘픔에서 playerList속성과 대응되는 부분이 &amp;lt;playerList&amp;gt;&amp;lt;player/&amp;gt;&amp;lt;player/&amp;gt;&amp;lt;/playerList&amp;gt; 의 형식처럼 player태그를 playList태그가 한번 감싸고 있는 것이 아니고 바로 &amp;lt;player/&amp;gt;가 반복되는 형태이기 때문에 @XStreamImplicit가 붙어야 하는 것이다. Player클래스에서는 team_id 멤버 변수는 아예 태그로 옮기어 지지 않으므로 @XStreamOmitField 어노테이션을 붙여서 이를 명시했다. XStream의 annotation에 대한 자세한 설명은 &lt;a href="http://xstream.codehaus.org/annotations-tutorial.html"&gt;http://xstream.codehaus.org/annotations-tutorial.html&lt;/a&gt;페이지를 참고하기 바란다.&lt;br /&gt;
&amp;nbsp; 어노테이션을 사용하지 않는다면 AnnotationXStreamMarshaller의 상위클래스인&amp;nbsp; XStreamMarshaller 를 사용하고,&amp;nbsp; implicitCollection, omittedFields의 속성에 Map의 형태로 생략할 필드들을 지정할 수 있다.&lt;br /&gt;
&amp;nbsp; 또 하나 주의할 점은 태그명에 언더바(_)가 들어가면 XStream에서는 디폴트로 그것을 언더바2개(__)로 바꾸어 준다는 점이다. 이 것은 XStream의 XmlFriendlyReplacer라는 클래스에서 하는 작업인데, 불행히도 현재의 AnnotationXStreamMarshaller클래스에서는 이 클래스를 바꿔치기 할 수 있는 기능이 없다. 그래서 AnnotationXStreamMarshaller를 상속하는 별도의 클래스를 만들고 XmlFriendlyReplacer를 끼워넣을 수 있도록 구현을 했다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;public class ExtendedXStreamMarshaller extends AnnotationXStreamMarshaller{&lt;br /&gt;
private XmlFriendlyReplacer replacer;&lt;br /&gt;
protected void marshalSaxHandlers(Object graph,&lt;br /&gt;
ContentHandler contentHandler, LexicalHandler lexicalHandler)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; throws XmlMappingException {&lt;br /&gt;
SaxWriter saxWriter = new SaxWriter(replacer);&lt;br /&gt;
saxWriter.setContentHandler(contentHandler);&lt;br /&gt;
getXStream().marshal(graph, saxWriter);&lt;br /&gt;
}&lt;br /&gt;
//replacer에 대한 setter 생략&lt;br /&gt;
}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트 19&amp;nbsp;: XmlFriendlyReplacer 를 지정할 수 있는 확장 클래스&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp;XmlFriendlyReplacer상속한 DummyReplacer를 만들고 여기서는 언더바를 더블언더바로 바꾸는 동작을 수행하지 않도록 만든 후 이를 setter로 설정했다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;bean id="teamMarshaller" class="imaso.batch.item.support.ExtendedXStreamMarshaller"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;property name="annotatedClasses"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;list&amp;gt;&amp;lt;value&amp;gt;imaso.batch.domain.Team&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;imaso.batch.domain.Player&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;lt;/list&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;lt;property name="replacer"&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;bean class="imaso.batch.item.support.DummyReplacer"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/property&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트&amp;nbsp;20 : Marshaller설정&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&amp;nbsp; annotatedClasses속성으로 Team과 Player클래스를 지정해서 어노테이션을 XStream에서 인식할 수 있도록 해준다.&lt;br /&gt;
&amp;nbsp; StaxEventItemReader에는 이 밖에도 다양한 형태의 Xml 생성을 돕는 속성들이 있다. Root태그 밑에 여러 속성들이 있다면 rootElementAttributes 속성에 Map형식으로 이를 지정할 수 있다. 예들 들어 “&amp;lt;content id=”baseball”&amp;gt;”으로 XMl이 시작한다면 id가 key이고 baseball이 value인 Map을 지정해 주면 된다. 그리고 headerItems속성으로는 루트 태그 아래에 추가로 들어갈 다른 태그들을 넣을 수 있다. 이와 함께 XStream에서 제공하는 Converter인터페이스를 구현하고 XStreamMarshaller 의 converters 속성으로 그것을 등록해 주면, 객체가 태그로 바뀌는 형식을 보다 정교하게 구현할 수도 있다. 자세한 내용은 첨부파일에 있는 예제를 참고하기 바란다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ItemReader와&amp;nbsp;ItemWriter를 연결시키는 Step과 Job의&amp;nbsp;설정을 하면 모든 작업은 끝이 난다. 주의할 점은 SimpleStepFactoryBean에서는 ItemReader가 Writer가 바로 동시에 ItemStream이라면 자동으로 stream속성에 등록이 되는데, 다른 ItemStream객체가 있다면 따로 지정을 해 주어야 한다는 것이다. DelegatingItemReader안에 감싸져서 들어가는 itemReader와 같이, Step에 직접 등록되는 ItemReader가 아닌 경우도 여기에 해당한다. 리스트12와 15에서 보이듯이,&amp;nbsp; teamMasterReader도 teamReader에 감싸져 있는 클래스인데, itemStream인 JdbcCursorItemReader클래스이므로, Step설정에서 streams에 지정되어 있어야지 open,update,close와 같은 메소드들이 제대로 호출될 수 있다.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;bean id="teamDbToXmlStep" parent="simpleStep"&amp;gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;property name="itemReader" ref="teamReader"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;property name="itemWriter" ref="teamXmlWriter"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;lt;property name="streams" ref="teamMasterReader"/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style="text-align: center;"&gt;리스트21: Step의 설정&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;첨부파일&lt;/h4&gt;
&lt;p&gt;&lt;a class="attachment" title="imaso-batch.zip" href="http://benelog.springnote.com/pages/2474228/attachments/1080304"&gt;imaso-batch.zip&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align: right;"&gt;-정상혁,&amp;nbsp;&amp;nbsp;&lt;a href="http://benelog.egloos.com/"&gt;http://benelog.egloos.com&lt;/a&gt;&lt;/p&gt;
</description>
			<category>정상혁</category>
			<category>Spring Batch</category>
			<author>benelog</author>
			<guid>http://www.ksug.org/91</guid>
			<comments>http://www.ksug.org/91#entry91comment</comments>
			<pubDate>Mon, 12 Jan 2009 08:12:25 +0900</pubDate>
		</item>
		<item>
			<title>[Beta 1.0] Spring Web-Flow 프레임웍 레퍼런스 한글화(편역).</title>
			<link>http://www.ksug.org/90</link>
			<description>Spring Web-Flow 레퍼런스 편역 본입니다. 2.0.5 버전 기준입니다.&lt;br /&gt;
&lt;br /&gt;
SWF 2.x에서는 EL과 플로우 정의 언어도 더 풍부해졌고, 통합, 특히 MVC와 통합도 훨씬 깔끔하게 통합 할 수 있는 것을
볼 수 있습니다. 이제 MVC와 좀더 유기적으로 맞물려서 사용할 수 있게 됐습니다. 스프링 자바스크립트는 좀더 살펴봐야겠습니다.
그래도 기본 구조는 1.x와 거의 동일하기 때문에 1.x를 학습하셨다면, 쉽게 2.x를 보실 수 있을 것 같습니다.&lt;br /&gt;
&lt;br /&gt;
본 문서는 1, 8, 12, 13, 15을 제외한 전 장을 포함하고 있습니다. 빠진 내용들이 핵심적인 내용은 아니니 중요한 내용은 충분히 학습하실 수 있습니다. &lt;br /&gt;
&lt;br /&gt;
감사합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;a href="http://springframework.tistory.com/attachment/496191562f4fcCZ.pdf"&gt;&lt;img src="http://cfs.tistory.com/blog/image/extension/pdf.gif" alt="" style="vertical-align: middle;" /&gt; spring-webflow-reference-kr-beta-1.0.pdf&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;</description>
			<category>박찬욱</category>
			<category>reference 한글화</category>
			<category>spring web-flow</category>
			<author>찬욱</author>
			<guid>http://www.ksug.org/90</guid>
			<comments>http://www.ksug.org/90#entry90comment</comments>
			<pubDate>Mon, 05 Jan 2009 13:50:28 +0900</pubDate>
		</item>
		<item>
			<title>올해의 스프링 기술 top5, 내년 유망 스프링 기술 top5 (박찬욱 편)</title>
			<link>http://www.ksug.org/88</link>
			<description>&lt;font color="#888888"&gt;안녕하세요. KSUG 박찬욱입니다. 저도 올 해와 내년 유망주를 나누기가 어려워 하나의 목록으로 작성했습니다. 올 해 관심사들이 내년에는 실제 적용 가능환 수준으로 심화되는 과정이라고 볼 수 있을 것 같습니다.&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Spring Web Flow(SWF)&lt;/span&gt;&lt;br /&gt;
개인적으로 SWF를 살펴 봤던 시점이 작년의 1.x였는데 어느덧 2.x가 공개가 됐습니다. 작년 1.x일 때 로드 존슨이 SWF는 앞으로 SpringSource의 주력이 될 것이라는 말을 했었는데요, 역시나 그 말처럼 지금 SWF의 위상은 상당히 높아졌습니다. &lt;br /&gt;
&lt;br /&gt;1.x가 위자드 형식의 흐름(flow)를 갖는 conversation 구현에 집중 됐다면, 2.x부터는 Spring MVC, JavaScript, Faces 등 다른 모듈과의 통합을 기반으로 한 Client와의 통합 프레임웍으로 발전하고 있습니다. 특히 spring mvc와 java script와의 통합 강화로 이제 Spring MVC와 유기적으로 협력해서 적용할 수 있게 됐습니다. &lt;br /&gt;
&lt;br /&gt;특히 Spring-js는 서버 단 프로그래밍 모델 제시가 주를 이웠던 과거에 비해 클라이언트 단의 프로그래밍 모델까지 제시하는 좋은 기회가 될 것으로 보입니다. 사실 Controller+form tag로는 부족했었죠^^. 다양한 Ajax 프레임웍들과의 통합이 지원되고, 사용사례 등이 공유되기 시작하면 Spring-mvc 도입 시 자연스레 Spring-js로 클라이언트 단 로직을 처리(역할이 어느 정도까지 갈지는 모르겠습니다. 현재는 Dojo toolkit 기반 Ajax 요청 처리와 유효성 검증 등이 제공 됩니다.)하고, 여기에 더해서 SWF로 conversation 구현과 flow 제어를 구현하게 될 수 있겠죠. 3.0에서는 Spring-js가 core로 넘어 온다니 역시 다음 한 해에도 기대를 갖고 지켜볼만한 것 같습니다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;2. Spring core 발전&lt;/span&gt;&lt;br /&gt;
올해 공개된 Spring 2.5에서는 애노테이션 기반 설정이 보다 심하되고, 강화됐습니다. 설정의 단순화만을 강조하는 것이 아니라, @MVC 처럼 프로그래밍 모델 자체를 개선해주는 효과를 얻고 있습니다. '설정'이라는 말이 주는 부담과는 달리, 애노테이션을 사용해서 최소한의 설정으로 최대의 효과를 얻을 수 있는 모델을 제시하고 있습니다. 단지 설정 기법이 XML에서 애노테이션 기반으로 변경된 것이 아니라, 메타 정보를 활용한 새로운 프로그래맹 모델을 제시하는 기회로 활용하고 있는 것이죠.&lt;br /&gt;
&lt;br /&gt;이번 Spring One America에서도 밝혀 졌듯이 3.0에서는 많은 내용이 개선될 것 같습니다. REST지원, EL 지원 등 3.0에서 도입되거나 개선된 다양한 특징에 대해서는 이미 다녀오신 분들의 글을 참조하시면 될 것 같습니다. &lt;br /&gt;
&lt;br /&gt;여기서 제가 주목하는 점은 Spring 3.0 도입에 대한 Spring 포트폴리오들의 의지입니다. 아직 3.0 정식버전이 나오지도 않았지만, 포트폴리오의 주요 프로젝트에 해당 하는 프로젝트들(SWF, Spring Security, Spring batch 등)이 이미 3.0에 맞는 기능을 소개하거나 조만간 공개되는 버전에 바로 적용하는 모습을 보여주고 있습니다. 발빠른 행보를 보이고 있으니 3.0은 보다 빠르게 현장 도입 수준에 오르지 않을까 생각됩니다^^.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;3. Spring batch&lt;/span&gt;&lt;br /&gt;
Spring의 다른 프로젝트들도 마찬가지지만, Spring&amp;nbsp; batch는 특히 현장의 경험을 추상화해 이를 기반으로 프레임웍을 구성했다는 점이 가장 인상적입니다.&amp;nbsp; 특히, Job, Step과 배치 실행과 관리에 대한 추상화된 개념을 통해서 처음 배치 업무 구성에 접하는 사람도 개념적인 판단기준을 가지고 학습할수 있는 상황을 제공한다는 점에서 매력적입니다. 아직 첫 번째 돌도 안된 프로젝트지만, 조만간(2009년 3월)이면 벌써 2.0 정식 버전이 나오고, 이미 현장에서도 여러모로 적용했다는 소식을 접할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;2.0이 나오면 커스텀 네임스페이스나 애노테이션 기반 설정이 가능해져 근본적으로 복잡한 배치 잡 구성을 조금은 쉽게 구성할 수 있을 듯 합니다. 또한 Scalability 측면에서도 Spring Batch 기반의 다양한 구현 패턴(Partitioning, Chunking processing, parallel processing 등)의 공유로 Spring Batch의 활용성이 더 높아질 것으로 기대됩니다. 또한 API도 훨씬 직관적이고, 개발이 편리하도록 개선되었고, 관리 인터페이스 또한 추가 됐습니다.(또는 정식버전 전까지 추가될 예정입니다.) 현재는 2.0M3가 나온 상태고, 정식 버전은 3월에 나올 예정이라니 조금만 기다려 주시죠^^.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;4. Spring dm server&lt;/span&gt;&lt;br /&gt;
올 한해 가장 큰 화두 중 하나로 OSGi를 꼽을 수 있습니다. 임베디드 시장에서 이미 확고한 위치를 점령한 OSGi가 본격적으로 엔터프라이즈 시장에 진출하게 된 시점이 됐습니다. 물론 아직까지는 실험적인 단계라고 생각합니다. 현장 적용을 통해서 쌓여진 노하우(베스트 프랙티스)가 거의 없고, OSGi 환경에서 OSGi의 장점을 누리면서 개발할 수 있는 환경이 아직은 부족하다고 생각합니다. Maven이나 PMD 등이 있지만, 둘 다 엔터프라이즈 환경에서 개발을 지원하기에는 불편하거나, 부족한 상황입니다. &lt;br /&gt;
&lt;br /&gt;이런 상황에서 Spring dm server의 존재는 엔터프라이즈 환경에서의 OSGi 지원 가능성을 옅볼 수 있게 해줬습니다. 내부적으로 OSGi 환경을 제공하거나 단순히 배포 가능한 컨테이너 제공만 하는 것이 아니라, OSGi 프로그래밍 모델과 Spring의 프로그래밍 모델을 통합할 수 있는 기반을 제공(Spring-DM과 함께) 합니다. dm server는 SSTS와 SpringSource Enterprise Repository 등을 활용해서 OSGi 기반 개발 환경을 지원하고 있습니다. 이에 더불어 별도의 manifest 헤더와 배포 단위를 제공하는 등, 저수준 OSGi 명세를 기준으로 개발할 때 느끼는 불편함을 해결할 방법을 제시하고 있습니다. &lt;br /&gt;
&lt;br /&gt;물론 이마저도 아직은 많이 불안한게 사실입니다. dm server를 사용해서 개발하고, 배포해보려면 단순히 따라하기도 쉽지 않습니다^^. 올 한 해는 OSGi의 엔터프라이즈 환경 적용을 시험한 무대였다면, 내년에는 본격적으로 적용하는 다양한 방안에 대해서 연구되고, 공유될 수 있는 한 해가 될 것 같습니다. 역시 기대되는 내년 한 해가 될 것 같습니다.&lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. tc server&lt;/span&gt;&lt;br /&gt;
이제 SpringSource는 아파치 톰캣(Tomcat)의 가장 '큰 손'이 됐습니다. 최근 2 년간의 톰캣 개발/버그 수정 중 대부분을 SpringSource가 제공했다고 합니다. 내년에 Spring tc server가 공개되면 어쩌면 Spring 기반으로 개발하면서도 WAS를 사용해야 하는 요구사항이 줄어들 수 있는 기회가 될 지도 모르겠습니다. 아직 내용 공개된 내용이 거의 없지만, 내년 초 가장 큰 관심사임은 분명해 보입니다. &lt;br /&gt;
&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6.Grails와 함께하는 Spring&lt;/span&gt;&lt;br /&gt;
올 해 말을 가볍게 강타한 내용입니다. Spring One America를 다녀오신 분들의 소감을 들어보면 감동이었다는 표현까지도 들을 수 있습니다. 이 역시 향후 전망을 가능케 할 수 있는 자료가 전무하지만, Grails로 기존 프로그래밍 모델을 개선할 수 있는 방안을 어떻게 도출해낼지 너무나 기대됩니다. 스크립트 언어의 장점을 Spring에 어떻게 접목시킬 지 기대되는 바입니다.&lt;br /&gt;
&lt;/font&gt;</description>
			<category>박찬욱</category>
			<category>spring ranking</category>
			<author>영회</author>
			<guid>http://www.ksug.org/88</guid>
			<comments>http://www.ksug.org/88#entry88comment</comments>
			<pubDate>Fri, 02 Jan 2009 09:00:00 +0900</pubDate>
		</item>
	</channel>
</rss>
