reference:
[SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel
Review
지난 시간에 Spring Batch Architecture와 실행 Flow를 알아보고, Tasklet 예제를 실행해보았다.

Batch 작업의 전체 단위인 Job, Job의 하위 개념으로 개별적인 작업 단위를 나타내는 Step이 있었다. (Job과 Step은 1:N이다.)
그리고 Step에는 Tasklet 모델과 Chunk 모델이 있다. (Step과 Tasklet 혹은 Step과 Chunk는 1:1이다.)
하나의 Job 안에서 Tasklet 모델을 사용하는 Step과 Chunk 모델을 사용하는 Step을 혼합하여 사용할 수도 있다.
이번에는 Tasklet 모델과 Chunk 모델에 대해 보다 자세히 살펴보자.
Tasklet Model
Tasklet은 특정 작업을 단일 단계에서 처리하는 방식으로, 단일 단계의 실행이 끝나면 한 Step이 종료된다.
Tasklet은 파일 삭제, 디렉토리 생성, 데이터베이스 초기화와 같이, 단순한 작업이나 반복적이지 않은 일회성 작업을 처리하기 용이하다.
Read -> Process(생략 가능) -> Write 과정을 따르는 청크 모델과 달리, Tasklet interface는 execute 매서드만을 포함하고 있다.
따라서 다양한 작업에 적용이 가능하며 구현이 간단하고 직관적으로 오류 처리를 할 수 있는 장점이 있다.
Chunk Model
Chunk는 전체 데이터를 지정한 크기(commit interval)만큼씩 작은 청크 단위로 나누어 Read(읽기) -> Process(처리) -> Write(쓰기) 과정을 진행하는 방식이다. (이 때, Process는 생략이 가능하다.)
이 과정을 전체 데이터에 대해 반복한다.

Chunk 모델은 대량의 데이터를 처리할 때 유용하다.
전체 데이터를 한 번에 메모리에 올리지 않고 청크별로 나누어 올리게 되기 때문에 메모리 관점에서 부담이 적다.
또 각 청크별로 커밋(commit)이 발생하기 때문에, 처리 중 오류가 발생해도 비교적 안전하다.
커밋된 청크는 안전하게 저장되고, 오류가 발생한 청크 이후부터 다시 처리할 수 있다.
만약 청크 단위로 병렬처리한다면 처리 시간 또한 줄일 수 있다.
Tasklet Interface와 구현 클래스
코드 관점에서 Tasklet에 대해 알아보자.
public interface Tasklet {
RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception;
}
앞서 언급했다시피, execute 단일 메서드만을 제공한다.
execute 메서드를 직접 구현해서 사용해도 되지만, Spring Batch에서 제공하는 Tasklet interface의 구현 클래스들도 있다.
- SystemCommandTasklet :
시스템 명령어를 실행하는 Tasklet이다.
예를 들어 파일 시스템에서 특정 스크립트를 실행하거나, 외부 명령어를 실행하는 작업을 수행한다.
명령어 실행에 대한 타임아웃을 설정하여, 일정 시간이 지나면 실행이 중단되도록 할 수 있다.
명령어 실행 결과에 따라 작업의 상태를 결정할 수 있다. (e.g. 명령어 실패 시 다시 시도)
Spring Batch의 org.springframework.batch.core.step.tasklet.SystemCommandTasklet 패키지에서 제공된다. - MethodInvokingTaskletAdapter :
POJO(Plain Old Java Object)클래스에 정의된 특정 메서드를 실행하는 Tasklet이다.
Spring에서 관리하는 Bean의 메서드를 호출하여 배치 작업 중 특정 로직을 실행할 때 유용하다.
기존의 비즈니스 로직이나 서비스 메서드를 Tasklet으로 활용할 수 있는 장점이 있다.
Spring Batch의 org.springframework.batch.core.step.tasklet.MethodInvokingTaskletAdapter 패키지에서 제공된다.
ChunkOrientedTasklet 구현 클래스
개념적으로는 Tasklet Model과 Chunk Model이 상반된 것이었지만, 실제 코드를 들여다보면 Chunk Model을 사용하기 위한 ChunkOrientedTasklet은 사실 Tasklet Interface의 구현 클래스이다.
public class ChunkOrientedTasklet<I> implements Tasklet {
...
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
...
}
}
Chunk 처리 과정에서 ItemReader, ItemProcessor, ItemWriter 인터페이스가 사용된다.
ItemReader Interface와 구현 클래스
ItemReader는 Chunk Model에서 데이터를 읽어오는 역할을 한다.
Chunk size(commit interval)만큼 읽을 때까지 반복한다.
데이터 소스로부터 데이터를 한 번에 하나씩 가져오는 데 사용되며, 데이터베이스, 파일, API 등 다양한 소스에서 데이터를 읽어올 수 있다.
public interface ItemReader<T> {
T read() throws Exception;
}
Spring Batch에서 제공되는 대표적인 구현 클래스에는 FlatFileItemReader, StaxEventItemReader, JdbcPagingItemReader / JdbcCursorItemReader,
MyBatisCursorItemReader / MyBatisPagingItemReader, JmsItemReader / AmqpItemReader 가 있다.
ItemProcessor Interface와 구현 클래스
ItemProcessor는 Chunk Model에서 데이터를 처리하는 역할을 한다.
읽은 데이터를 모두 처리할 때까지 반복한다.
읽어온 데이터를 변환하거나 가공하는 데 사용되며, 데이터를 필터링할 수도 있다.
필요 없다면 생략할 수 있다.
public interface ItemProcessor<I, O> {
O process(I item) throws Exception;
}
Spring Batch에서 제공되는 대표적인 구현 클래스에는 PassThroughItemProcessor, ValidatingItemProcessor, CompositeItemProcessor 가 있다.
ItemWriter Interface와 구현 클래스
ItemWriter는 처리된 데이터를 저장하는 역할을 한다.
한 번에 청크 단위로 데이터를 기록한다.
처리된 데이터를 데이터베이스, 파일, 메시지 큐 등에 기록록한다.
public interface ItemWriter<T> {
void write(List<? extends T> items) throws Exception;
}
Spring Batch에서 제공되는 대표적인 구현 클래스에는 FlatFileItemWriter, StaxEventItemWriter, JdbcBatchItemWriter, MyBatisBatchItemWriter, JmsItemWriter / AmqpItemWriter 가 있다.
'Spring Batch' 카테고리의 다른 글
| [Spring Batch - 07] MyBatisPagingItemReader와 MyBatisBatchItemWriter (3) | 2024.11.19 |
|---|---|
| [Spring Batch - 06] JpaPagingItemReader와 JpaItemWriter (1) | 2024.11.12 |
| [Spring Batch - 05] JdbcPagingItemReader와 JdbcBatchItemWriter (4) | 2024.11.05 |
| [Spring Batch - 04] FlatFileItemReader와 FlatFileItemWriter (1) | 2024.10.29 |
| [Spring Batch - 02] Tasklet 예제로 스프링 배치의 아키텍처와 동작 알아보기 (0) | 2024.10.15 |