Chunk 개념
- 여러 개의 데이터를 특정 단위로 묶은 것
- 대용량 처리를 위해 필요하다.
- 많은 데이터를 한번에 처리하면 OOM 이 발생하기 때문
- Chunk 단위로 쪼개서 여러번 처리함으로써 OOM 을 방지한다.
- 스프링 배치는 Chunk 단위로 트랜잭션을
알아서 적용
한다.
- Chunk 단위의 commit 과 rollback 이 발생한다.
- ItemReader (필수) 가 Chunk 에 설정한
특정 단위
가 될 때까지 데이터를 1개씩
읽는다.
특정 단위
까지 수집 된 데이터는 1개의 Chunk가 되어 ItemProcessor 에 전달된다.
- ItemProcessor (선택) 가 데이터를 가공 (transform) 해서
Chunk Size 단위
로 ItemWriter 에 전달한다.
- ItemWriter (필수) 가
Chunk
로 받은 데이터를 DB, File 등에 반영한다.
- 이를 그림으로 나타내면 아래와 같다.

아키텍쳐

ChunkOrientedTasklet
SpringBatch 는 Chunk 기반 작업을 지원하는, Tasklet의 구현체인 ChunkOrientedTasklet
을 제공한다.
- ItemReader, ItemProcessor, ItemWriter 를 통해 청크 기반 대용량 배치 처리를 지원한다.
- 내부적으로는
ChunkProvider
(ItemReader), ChunkProcessor
(ItemProcessor, ItemWriter) 가 사용된다.
- ChunkOrientedTasklet 의 execute 는 청크 단위로 실행된다.
- TransactionTemplate 에 의해 실행되기 때문에 트랜잭션이 적용되며, 이는 곧 청크 단위의 트랜잭션 (Commit, Rollback) 이 보장된다.
- 해당 내용은 다음 포스팅에서 자세히 다룬다.
- 강의 보면서 이해가 잘 안됐던 부분이었다.
ChunkProvider
ItemReader 를 사용하여 Source 로부터 데이터를 Chunk Size 만큼 읽고, Chunk 를 반환하기 위한 인터페이스
- 기본 구현체로
SimpleChunkProvider
, FaultTolerantChunkProvider
가 있다.
- SimpleChunkProvider
- 일반적으로 chunk 처리를 위해 사용되는 Provider
- FaultTolerantChunkProvider
- 실패에 대한 처리를 별도로 설정할 수 있는 Provider
- SimpleStepBuilder 에서
.faultTolerant()
메소드를 통해 생성할 수 있다.
- 추후 자세히 포스팅 예정
- SimpleChunkProvider 는 데이터를 읽기 위한 ItemReader와, 반복적으로 처리하기 위한 RepeatOperations 를 포함한다.
- Chunk 의 Size 만큼 데이터를 읽거나, 더 이상 읽을 데이터가 없으면 읽기를 중단한다.
- ChunkProvider 의
provide()
메소드가 호출될 때마다 매번 새로운 Chunk 객체가 생성된다.
ChunkProcessor
ItemProcessor 를 사용하여 데이터를 가공 (transform) 하고, ItemWriter 를 사용하여 데이터를 목적지에 저장하는 역할
- 기본 구현체로
SimpleChunkProcessor
, FaultTolerantChunkProcessor
가 있다.
- SimpleChunkProcessor 는 데이터를 가공하기 위한 ItemProcessor (선택) 와, 데이터를 저장하기 위한 ItemWriter (필수) 를 필드로 가진다.
ItemReader
다양한 source 로부터 데이터를 읽기 위한 인터페이스.
- Spring Batch 의 chunk 처리를 위해 필수적으로 존재해야한다.
- Spring Batch 에서는 다양한 기본 구현체들을 제공한다.
- 데이터를
1 건씩
읽어 Chunk 를 Chunk Size 만큼 채워서 생성한다.
- 플랫 (txt, csv) 파일, XML, JSON, DB, MessageQueue 를 통한 Reader 구현체들을 기본 제공한다
- ItemReader 를 상속하여 CustomItemReader 클래스를 직접 정의할 수도 있다.

ItemProcessor
- Spring Batch 의 chunk 처리를 위해 필수적으로 존재하지 않아도 된다.
- ItemProcessor 가 없으면 ItemReader 로부터 읽은 데이터를 그대로 ItemWriter 에 전달한다.
- Chunk (리스트) 로 받은 데이터를
1 건씩
가공 (transform) 하여 ItemWriter 에 전달한다.
ItemWriter
- Spring Batch 의 chunk 처리를 위해 필수적으로 존재해야한다.
- Chunk (리스트) 로 받은 데이터를
벌크 (bulk)
로 목적지에 저장한다.
- write 가 완료되면 commit 이 발생하고, 쓰는 도중 오류가 발생하면 rollback 이 발생한다.
- 즉, 트랜잭션은 Chunk 단위로 이루어진다.

ItemStream
- Spring Batch 가 기본 제공하는 ItemReader, ItemWriter 의 구현체들을 보면,
ItemStream
인터페이스를 함께 구현하는 것을 확인할 수 있다.
- ItemReader 와 ItemWriter 의 메타 데이터들을 저장하고, 작업 중 오류가 발생하면 해당 지점부터 재시작할 수 있도록 지원한다.
- 리소스의 open, close 등
초기화(init)
와 해제(release)
기능을 지원한다.
- ExecutionContext 를 파라미터로 받아 상태 정보를 update 한다.