Step을 확장하기 위해 가장 먼저 생각나는 확장포인트는 AbstractStep 일것이다. 하지만 이녀석을 확장한다면 스프링 배치의 스텝을 사용하지 않는것과 같다. 왜냐하면 스텝의 중요한 기능들은 ItemOrientedStep에서 구현하고 이녀석은 AbstractStep 을 확장한 것이기 때문이다.
두번째로는 AbstractStepFactoryBean이 있다. 이녀석을 확장하는것 역시 AbstractStep을 확장하는것과 별반 다르지 않다.

그렇다면 ItemOrientedStep을 확장해야 하는가? 그것또한 쉽지않다. ItemOrientedStep만으로는 skip정책과 retry 정책등과 같은 필수적인 기능들을 제공하지 않기 때문이다. 이러한 정책들은 AbstractStepFactoryBean을 상속한 SimpleStepFactoryBean과 또 이 클래스를 상속한 SkipLimitStepFactoryBean에서 세팅해준다.

이쯤에서 드는 생각은 ItemOrientedStep과 SkipLimitFactoryBean을 확장하면 될것같다는 생각이 들것이다. 하지만 이것또한 답은 아닌것 같다 왜냐하면  AbstractStepFactoryBean은 FactoryBean 인터페이스를 구현한다. 그런데  AbstractStepFactoryBean에서 구현한 getObject메소드를 final로 막아버렸다. 그래서 SkipLimitFactoryBean을 확장한다고 해도 ItemOrientedStep을 확장한 스텝을 생성할 수가 없다

이쯤에서 한번 생각해볼 문제가 왜 데이브는 getObject메소드를 오버라이딩 하지 못하게 막았을까하는 점이다. 분명 우리보다 뛰어난 사람일 텐데 그렇게 한 이유가 분명히 있을것이다

여기까지가 저번주 목, 금 이틀동안 삽질한 결과이다. 답은 전혀다른 곳에 있었다. 생각을 유연하게 하고 기술에 얽매이지 않으면 답이 보일것이다.
calendar 를 이용하여 년도와 월을 가지고 해당월의 말일을 구하려 한다면
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 년도);
calendar.set(Calendar.MONTH, 월);
calendar.getActualMaximum(Calendar.DATE)를 이용해서 구할 수 있지만
2월달의 경우
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 2);
이렇게 구할 경우 자동적으로 월의 세팅값이 3월로 변경된다. 그래서
calendar.set(Calendar.YEAR, 2008);
calendar.set(Calendar.MONTH, 2);
calendar.set(Calendar.DATE, 1);

명시적으로 일의 값을 1로 세팅을 해놓으면 제되로 된 결과값이 나온다
이유는 date를 명시적으로 세팅하지 않을경우 jdk내부적으로 30일을 세팅하는것 같다 그래서 2월의 경우엔 자동적으로 3월로 넘어가는 것 같다 따라서 꼭 1일이 아니라 1~28일의 값중 어떤 값이라도 date를 세팅해 놓는다면 제대로 된 말일을 구할 수 있다.


참고 http://cognitivecache.blogspot.com/2008/08/log4j-writing-to-dynamic-log-file-for.html
db2는 데이터를 수정, 삭제, 조회할때 스키마를 설정해줘야 한다.
예를 들면 select * from schema.teble_name 이런식이다.
조회 문에 스키마명을 설정해주지 않기 위해서는 jdbc url에  currentSchema를 설정해주거나 아니면 프로퍼티로 키값을 currentSchema로 해서 설정해 줄 수가 있다.


url에는 이런식으로 해주면 된다.
 <property name="jdbcUrl" value="${batch.jdbc.url}:currentSchema=${batch.schema};" />
<aop:aspect id="..." ref="...">
    <aop:... pointcut="execution(.....)"
</aop:aspect>

표현식의 기본구조는
   execution(수식어패턴? 리턴타입패턴 패키지패턴?이름패턴(파라미터패턴))
위와같다

패턴 * : 모든값
패턴 .. : 0개이상

and(&&) 와 or(||) 를 이용하여 표현식을 연결할 수 있다

Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan

That is, while there is value in the items on
the right, we value the items on the left more.

그제 술마시는데 갑자기 묻는다 agile manifesto가 모냐?
참 설렁설렁 살아왔다 agile공부도 해보고 나름 좋아하는 방법론이라 생각해왔는데 manifesto조차 모르고 있었다. manifesto에대해 깊이 생각해 본적도 없다.
이젠 제대로 함 살아보자

무지 단순한 소스지만 내 스스로 만들어본 첫번째 스프링 배치 프로그램이다.
파일로부터 데이터를 읽어서 다른 파일에 기록하도록 작성했다.
이 작업을 위해 domain객체, fieldSetMapper객체, fieldSetCreator, 로깅을 위한 advice 만 구현하면된다. 물론 비즈니스 로직이 없어서 간단할 수도 있겠지만..

jobRepository로 디비를 사용하지 않고 메모리를 사용하고 싶었다. 이에 대한 내용이 레퍼런스에 나온다.
 
<bean id="jobRepository" class=".....MapJobRepositoryFactoryBean">

이렇게 설정하면 된단다. 근데 이렇게 하면 에러난다. transactionManager가 필수란다. 결국 트랜잭션 매니저를 설정했다.

<bean id="jobRepository" class="......MapJobRepositoryFactoryBean"
p:transactionManager-ref="transactionManager"
lazy-init="true" autowire-candidate="false" />

MapJobRepositoryFactoryBean 내부를 보면 repository로 맵을 이용하는데 트랜잭션 매니저는 왜 필요한것인지..
어렵다
spring batch 다운로드 : http://static.springframework.org/downloads/nightly/release-download.php?project=BATCH

1. 다운받은후 압축을 풀면 samples/spring-batch-samples 디렉토리에 샘플코드가 있다.

2. maven을 이용하여 이클립스 프로젝트를 생성한다.

2.1 커맨드 창에서 samples/spring-batch-samples 디렉토리로 이동한다.

2.2 mvn eclipse:eclipse 를 치면 이클립스 환경파일들이 생성되고 .classpath에 라이브러리들도 셋팅이 된다.

3. 이클립스에서 환경정보를 셋팅해야 한다. .classpath에서 라이브러리들을 셋팅할 때 사용되는 변수가 M2_REPO를 참조하도록 되어있기 때문이다.

4. 여기까지 완료되면 테스트 프로그램을 실행시켜 각 예제를 수행해 볼 수 있다.

샘플을 설치하는 중에 maven을 처음 사용해봐서 삽질 좀 했다. 먼저 이클립스 프로젝트를 생성하는 명령어를 몰라서 헤매고 repository가 어디에 생성되는지 몰라서 한참을 찾아 헤맸었다. 명령어는 위에서 적었고 repository는 maven home/conf/settings.xml에서 <localRepository>repository 경로</localRepository> 를 설정해서 해결했다 이값을 설정하지 않을경우에 나같은 경우는 C:\Documents and Settings\Administrator\.m2\repository 이 위치가 repository 경로로 되었다
앞으로는 스프링에 대해서 알고싶은게 있으면 요기서 알아내면 되겠네.. ㅋㅋ

사용자 삽입 이미지

ibm dw에서 vi에 익숙하지 않은 나같은 사람을 위해 컨닝페이퍼를 만드는 아티클을 공개했다
한글로 번역되어있어 보기도 좋다 ㅋㅋ

vi 입문 -- 컨닝 페이퍼 이용하기

+ Recent posts