상세 컨텐츠

본문 제목

3. Spring Batch ItemReader, ItemProcessor, ItemWrtier

Spring/SpringBatch

by husks 2016. 3. 31. 15:21

본문

반응형

배치 프로세싱 프레임워크의 중요한 역할은 거대한 양의 데이터를 읽고, 비즈니스 로직에 맞춰 프로세싱 및 데이터 변환 작업을 하고 그 결과를 특정 저장 장치에 저장하는 것입니다.

 

Spring Batch는 이러한 작업을 위해 세 종류의 인터페스이를 제공합니다.: ItemReader, ItemProcessor, ItemWriter

 

이번 글에서는 위 세가지의 인터페이스의 개념에 대하여 알아 보도록 하겠습니다.

 

1. ItemReader

 

ItemReader는 여러 종류의 Input 리소스(파일, 데이터베이스)에서 데이터를 읽어 오는 수단을 제공합니다.

 

ItemReader 인터페이스 정의는 다음과 같습니다.

 

public interface ItemReader<T> {

    T read() throws Exception, UnexpectedInputException, ParseException;

}

read() 메소드는 하나의 Item(아이템)을 리턴하고, 더이상의 읽을 아이템이 없는 경우에는 null을 리턴합니다.

(데이터가 없는 경우 Exception이 발생하지 않고 단순이 null 값이 리턴되는 점을 주목하시길 바랍니다.)

여기서 아이템은 파일 소스인 경우 파일의 한 라인의 데이터일수 있고, XML 파일에서는 하나의 element 값일 수 있습니다.

데이터베이스에서 읽어오는 경우에는 하나의 row가 아이템으로 표현될 수 있습니다.

 

다음은 자주 쓰이는 ItemReader의 구현체입니다.

 

  • FlatFileItemReader - 일반 파일로 부터 데이터를 읽어 오는 경우에 사용되는 reader입니다.
  • XMLItemReader - XML 파일을 파싱, 매핑, 검증하는데 사용되는 reader입니다.
  • 데이터베이스 - SpringBatch는 Cursor 유형과 페이징 유형의 ItemReader를 제공합니다.
    • JdbcCursorItemReader - Datasource로 부터 얻어진 connection으로 부터 리턴된 ResultSet을 직접 처리하는데 사용하는reader입니다.
    • HibernateCursorItemReader - Hibernate 기술을 사용하는 ItemReader입니다.
    • StoredProcedureItemReader - stored procedure를 실행하고 리턴된 cursor를 이용해 데이터를 읽어오는 경우에 사용합니다.
    • JdbcPagingItemReader
    • JpaPagingItemReader
    • IbatisPagingItemReader

 

 

2. ItemWriter

 

ItemWriter는 ItemReader 또는 ItemProcessor에 의해 넘겨지 데이터를 파일 또는 데이터베이스에 저장하는 역할을 합니다.

 

ItemWrtier 인터페이스 정의는 다음과 같습니다.

 

public interface ItemWriter<T> {

    void write(List<? extends T> items) throws Exception;

}

write() 메소드에서 주목할 점은 하나의 아이템이 아닌 아이템 리스트를 받아 배치 처리된다는 점입니다. (itemReader 에서 commit-interval 수 만큼 리스트로 넘어옴)

 

다음은 자주 쓰이는 ItemWriter의 구현체입니다.

 

 

  • FlatFileItemWriter - 데이터를 일반 파일에 저장하는 경우에 사용됩니다.
  • StaxEventItemWriter - 오브젝트을 XML 파일로 마쉘링하는 경우에 사용됩니다.
  • 데이터베이스 - FlatFileItemWriter 및 StaxEventItemWriter와는 달리 데이터베이스에 데이터를 저장하는 경우에는 이미 필요한 트랜잭션이 제공됨으로 별도의 데이터베이스 Writer를 제공되지 않습니다. 데이터를 저장하기 위해서는 기존의 DAO를 사용하거나, ItemWriter를 구현하는 DAO를 작성하여 처리하면 됩니다.
          유의할 점은 ItemWriter로 Hibernate 및 Jdbc batch mode를 사용하는 경우, 각각의 Item에 대하여 flush() 되어야 한다는 점입니다.
          예를 들어, 20개의 아이템을 한번에 데이터베이스에 저장한다고 가정할때, flush() 되는 시점에 에러가 발생한다면 Spring Batch Step 관점에서는 알 수 가 없다는 점입니다. 따라서, 보다 reliable한 배치 쓰기 작업을 위해서는 각각의 아이템에 대하여 flush()가 이루어져야 합니다.

3.ItemProcessor

ItemWriter에 의해 데이터를 저장소에 저장하기 전에 비즈니스 로직을 적용하고 싶다면 ItemProcessor를 사용하면 됩니다.

ItemProcessor는 다음의 인터페이스 정으를 가집니다.

 

public interface ItemProcessor<I, O> {

    O process(I item) throws Exception;
}

 


Foo 유형의 데이터를 Bar 유형의 데이터를 변환하거나, 저장소에 저장할 필요가 없는 데이터를 필터링하는데 주로 사용됩니다.

대부분의 비즈니스 시나리오에서 하나의 ItemProcessor로 충분하지만, 가끔씩 보다 복잡하고 세련된 작업을 위해서 여러개의 ItemProcessor가 연결될 수 있습니다.

 

public class Foo {}

public class Bar {
    public Bar(Foo foo) {}
}

public class Foobar{
    public Foobar(Bar bar) {}
}

public class FooProcessor implements ItemProcessor<Foo,Bar>{
    public Bar process(Foo foo) throws Exception {
        //Perform simple transformation, convert a Foo to a Bar
        return new Bar(foo);
    }
}

public class BarProcessor implements ItemProcessor<Bar,FooBar>{
    public FooBar process(Bar bar) throws Exception {
        return new Foobar(bar);
    }
}

public class FoobarWriter implements ItemWriter<FooBar>{
    public void write(List<? extends FooBar> items) throws Exception {
        //write items
    }
}

 


 

<job id="ioSampleJob">
    <step name="step1">
        <tasklet>
            <chunk reader="fooReader" processor="compositeProcessor" writer="foobarWriter" 
                   commit-interval="2"/>
        </tasklet>
    </step>
</job>

<bean id="compositeItemProcessor" 
      class="org.springframework.batch.item.support.CompositeItemProcessor">
    <property name="delegates">
        <list>
            <bean class="..FooProcessor" />
            <bean class="..BarProcessor" />
        </list>
    </property>
</bean>


출처: http://willygwu2003.blog.me/130171501341

반응형

관련글 더보기

댓글 영역