이전 글 - SpringBatch 실행법 & 아키텍처 알아보기
오늘은 Spring Batch를 처리할 수 있는 2가지 방법인 Chunk Model과 Tasklet Model에 대해 알아보자.
: 스프링 배치에서 Chunk Model은 대량의 데이터를 일정 단위인 청크로 나누어 처리하는 방식
Chunk Model
의 중심에는 ChunkOrientedTasklet
이 있다.
이 클래스는 청크 기반의 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 한다.
청크 크기(한 번에 처리할 레코드 수)는 commit-interval 설정값을 통해 조정 가능하다.
- ItemReader: 청크 크기만큼 데이터를 읽어들인다.
- ItemProcessor: 읽어들인 데이터를 비즈니스 로직에 맞게 변환하거나 가공한다.
- ItemWriter: 처리된 데이터를 저장하거나 파일로 기록한다.
ItemReader
는 데이터를 읽어오는 역할을 담당하며, 스프링 배치에서는 다양한 ItemReader 구현체를 제공하여, 여러 데이터 소스로부터 데이터를 읽어올 수 있다.
ItemReader - 주요 구현체
FlatFileItemReader
CSV 파일과 같은 플랫 파일(*구조화 되지 않은 파일)에서 데이터를 읽는다. 구분자(Delimiter)를 기준으로 나누어 객체로 매핑한다.
StaxEventItemReader
XML파일을 StAX기반으로 읽어 들인다.
JdbcPagingItemReader
/JdbcCursorItemReader
: JDBC를 사용하여 SQL을 실행하여 데이터베이스 레코드를 읽는다.
JdbcPagingItemReader
는 JdbcTemplate을 이용하여 각 페이지별로 SELECT SQL을 나누어 처리하는 방식이다.
JdbcCursorItemReader
는 JDBC Cursor를 이용하여 하나의 SELECT SQL로 데이터를 읽는다.
MyBatisCursorItemReader
/MyBatisPagingItemReader
MyBatis를 사용하여 데이터베이스에서 데이터를 읽는다.
JmsItemReader
/AmqpItemReader
JMS 또는 AMQP 기반의 메시지 큐에서 데이터를 읽는다.
ItemReader
는 ItemReader로부터 읽어들인 청크 데이터를 가공하거나 변환하는 역할을 하며 구체적인 구현체를 구현하여 스프링배치에 전달한다.
public class MyItemProcessor implements
ItemProcessor<MyInputObject, MyOutputObject> { // (1)
@Override
public MyOutputObject process(MyInputObject item) throws Exception { // (2)
MyOutputObject processedObject = new MyOutputObject(); // (3)
// 비즈니스 로직 코드
return processedObject; // (4) 변환된 데이터를 반환
}
}
(1) ItemProcessor 인터페이스 구현:
제네릭을 사용해 입력 데이터와 출력 데이터 타입을 정의
(2) process 메소드:
입력을 아규먼트로 받아 비즈니스 로직을 적용해 입력 데이터를 가공하고 변환
(3) 출력 객체 생성:
ItemProcessor처리 결과로 반환할 새로운 출력 객체를 생성
(4) 출력 객체 반환:
process 메소드에서 변환된 데이터를 반환 후 다음 단계인 ItemWriter로 전달
ItemProcessor - 주요 구현체
PassThroughItemProcessor
아무 작업도 수행하지 않는 기본 프로세서. 입력 데이터가 그대로 출력 데이터로 반환되며, 데이터 변환이 필요 없을 때 사용된다.
ValidatingItemProcessor
입력된 데이터를 유효성 검사하는 프로세서. Spring Batch 전용 org.springframework.batch.item.validator.Validator 인터페이스를 구현해야한다.
CompositeItemProcessor
동일한 입력 데이터에 대해 여러 ItemProcessor를 순차적으로 실행할 수 있는 프로세서.
ItemWriter - 주요 구현체
FlatFileItemWriter
처리된 Java객체를 CSV 파일과 같은 플랫 파일 형식으로 출력한다.
StaxEventItemWriter
자바 객체를 XML 파일 형식으로 출력한다.
JdbcBatchItemWriter
JDBC를 통해 SQL을 실행하고 자바 객체를 데이터베이스에 배치로 저장한다.
MyBatisBatchItemWriter
MyBatis를 사용하여 자바 객체를 데이터베이스로 저장한다.
JmsItemWriter / AmqpItemWriter
JMS 또는 AMQP 메시지 큐로 자바 객체의 메시지를 전송한다.
스프링 배치에서 Tasklet Model은 하나의 작업을 단일 태스크로 처리하는 방식이다.
청크 단위의 처리가 딱 맞지 않을 때, 단일을 작업 처리할 때 유용하다.
Spring Batch에서 Tasklet을 구현하기 위해서는 Tasklet
인터페이스의 execute
메서드를 구현해야한다.
이 메서드는 작업을 실행하며, 그 결과로 RepeatStatus.FINISHED 또는 RepeatStatus.CONTINUABLE을 반환한다.
public class MyTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// 비즈니스 로직 처리
System.out.println("Tasklet executed");
return RepeatStatus.FINISHED;
}
}
Tasklet Model - 주요 구현체
SystemCommandTasklet
시스템 명령어를 비동기적으로 실행하는 Tasklet이다.
명령어를 실행하는 동안 타임아웃 설정이 가능하며, 타임아웃 시 시스템 명령의 실행 스레드를 취소할 수 있다.
MethodInvokingTaskletAdapter
POJO 클래스의 특정 메소드를 실행하기 위한 Tasklet이다.
targetObject 속성에 대상 클래스의 Bean을 지정하고, targetMethod 속성에 호출할 메소드를 지정한다.
Chunk Model
은 데이터를 일정한 크기(청크)로 나누어, ItemReader, ItemProcessor, ItemWriter의 순서로 데이터를 처리한다.
Tasklet Model
은 단일 작업(태스크)을 한 번에 처리하는 방식으로 주로 독립적인 단일 작업이나 작은 데이터를 처리하는 데 적합하며, 반복적인 데이터 처리보다는 단순 작업에 사용된다.
Chunk Model
은 ItemReader, ItemProcessor, ItemWriter라는 컴포넌트를 활용하여 데이터를 처리한다.
Tasklet Model
은 Tasklet 인터페이스를 구현하여 한 번에 하나의 작업을 처리한다.
Chunk Model
은 메모리 효율이 높고, 안정적으로 대량 데이터를 처리할 수 있고 청크단위로 처리하기 때문에 성능에 유리하다.Tasklet Model
은 처리할 데이터가 작거나 단순 작업을 수행할 때 유용하다.Chunk Model
은 대용량 데이터 처리가 필요한 경우에 적합하다. 예를 들어, CSV 파일이나 데이터베이스에서 대량의 데이터를 읽고 처리한 후 저장하는 작업에 주로 사용된다.Tasklet Model
은 단순하고 독립적인 작업을 수행할 때 적합하다. 예를 들어, 파일 이동, 로그 기록, 시스템 명령어 실행과 같은 단일 작업을 수행할 때 사용된다.결론적으로 대량 데이터를 처리해야 할 때는
Chunk Model
을 사용하고, 단순한 작업을 수행할 때는Tasklet Model
을 선택하는 것이 좋다.
참고글 - [SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel
깃허브 - https://github.com/hysong4u/springbatch
너무 열심히 하는 울 하연님 너무 진짜 ㅠㅠ