SpringBatch에서 CompositeItemWriter활용

Chapter 6. ItemReaders and ItemWriters

스프링 배치 래퍼런스 문서에 간단한 소개가 있다. write메소드만 적절히 잘 굴러갈수 있지만, 특정 Writer중 문제가 생긴다. 파일을 써야할때는 별도의 파일에 대한 open, close에 대한 전후 처리 기능이 필요한데, 그냥 위와 같은 간단히 구현하면 Exception을 내고 장렬히 산화 한다.

파일처리를 하는 Writer를 살펴보면

public class FlatFileItemWriter<T> extends ExecutionContextUserSupport implements ResourceAwareItemWriterItemStream<T>,
        InitializingBean {
......

 

public interface ResourceAwareItemWriterItemStream<T> extends ItemStream, ItemWriter<T> {
    void setResource(Resource resource);
}
public interface ItemStream {
 ......
}

FlatFileItemWriter는 ItemWriter말고 ItemStream을 구현해 놓고 파일처리를 추상화 했다. 결국 레퍼런스에 있던 CompositeItemWriter를 쓴다면 문제가 생긴다. SpringBatch는 배치처리를 하기 위한 충분한 인프라를 제공한다. 추상화가 잘되어 있음으로 ItemWriter건 ItemProcesor건 ItemReader건 추가적인 기능인경우는 인터페이스로 잘구현해 놓으면 적절한 행위를 할수 있게 되어 있다.

public class CompositeItemWriter<T> implements ItemStreamWriter<T>, InitializingBean {
   ......
}

job안에 step에서 Stream타임의 Writer일때 별도의 처리를 해주는 기능을 쓰기 위해서는 Composite타입에서도 ItemStream가 올수 있음을 알려줘야 한다. 그래서 Batch에는 간단히 구현해 놓았다.

    <bean id="sendAppToPushServerWrtier" class="org.springframework.batch.item.support.CompositeItemWriter">
        <property name="delegates">
            <list>
                <bean class="com.nhncorp.ins.mnext.batch.http.HttpCallWriter">
                    <property name="delayTimemillis" value="1000"/>
                    <property name="callUrlFormat"
                        value="http://xxx/xxxxx/xxxxx?xx=%22{}%22" />
                </bean>
                <bean class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
                    <property name="resource" value="#{jobParameters['smsListResultLoc']}" />
                    <property name="lineAggregator">
                        <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator">
                            <property name="delimiter" value=","></property>
                            <property name="fieldExtractor">
                                <bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                                    <property name="names" value="empNo,result"></property>
                                </bean>
                            </property>
                        </bean>
                    </property>
                </bean>
            </list>
        </property>
    </bean>

위와 같은 CompositeItemWriter를 써보도록 하자. 이제 끝!