step에서 tasklet 방식으로 구성하는 방법과 ItemReader/ItemProcessor/ItemWriter 단위로 청크 지향 프로세싱을 구성하는 방법이 있다.
public interface ItemReader<T> {
T read() throws Exception;
}
public interface ItemWriter<T> {
void write(List<? extends T> items) throws Exception;
}
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
단계 내에서 단일 태스크를 수행하기 위한 것으로 임의의 Step을 실행할 때 읽기/처리/쓰기를 하나의 작업으로 처리하는 방식
*tasklet 클래스가 재사용이 될 수 있는 상황에 적합하다.
한 번에 모든 행을 읽고 처리하고 쓰는 대신 한 번에 고정 된 양의 레코드(청크)를 읽고 처리하는 방식이다. 트랜잭션 경계 내에서 청크 단위(아이템이 트랜잭션에서 커밋되는 수)로 데이터를 읽고 생성하는 기법이다. 청크를 지정하게 되면 한 건에 실패에 대한 청크부터 뒤에까지만 영향을 받게 되어 실패한 청크 앞의 영역은 영향을 받지 않는다. 또한 청크만큼만 트랜잭션 시간을 가져가기 때문에 트랜잭션 시간을 짧게 가져갈 수 있다. 일괄 데이터 변경이나 어떤 데이터 변화를 주는 작업에 사용하면 좋다.
1) Tasklet을 implements한 tasklet 클래스에서 execute()를 재 정의한다. execute() 메서드에서는 청크 단위로 처리하는 작업을 한다.
-> Provider 클래스의 provide()를 호출해서 ItemReader에서 청크 사이즈 만큼 데이터를 가지고 온다.
-> Process 클래스의 process()를 호출해서 ItemReader에서 가져온 데이터를 가공하고, ItemWriter의 write()를 통해 데이터를 저장한다.
2) ChunkProvider를 implements한 Provider 클래스에서 Chunk 만큼에 데이터를 읽어서 tasklet로 업데이트할 데이터를 리턴해주는 역할을 하는 provide() 메서드를 재 정의한다.
3) ChunkProcessor, InitailizingBean을 implements한 Processor 클래스에서 process() 메서드를 재 정의한다. process() 메서드에서는 ItemWriter 하기 전에 빈으로 등록된 데이터를 읽고 데이터를 가공하는 처리를 해준다.
4) process()에서 가공이 끝나면 ItemWriter의 write() 메서드를 통해 데이터를 저장한다.
*참고 자료
https://oingdaddy.tistory.com/181
https://hororolol.tistory.com/513
https://k9e4h.tistory.com/392
https://wan-blog.tistory.com/55
https://techblog.woowahan.com/2662/