🚨 팀 프로젝트를 진행하면서 게시 글 도메인을 맡았다. 간단한 CRUD만 구현하면 될거라 생각했었는데, 사용자가 게시 글에 작성한 약속 시간이 지나면 게시 글의 상태를
모집 중 -> 모집 완료로 변경해야 할 필요성을 느껴 Spring Batch에 대해 학습하려고 한다.

Batch의 사전적 의미를 살펴보면 어떤 기능을 하는 프레임워크인지 대략적으로 알 수 있다.
말 그대로 일괄 처리를 위한 프레임워크!

공식문서에 따르면 Spring Batch는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다.
Spring Batch는 배치가 실패하여 작업 재시작을 하게 된다면 처음부터가 아닌 실패한 지점부터 실행하게 된다.
기본적으로 배치 프로그램은 아래와 같이 Read-Processing-Write로 동작한다.

유사한 트랜잭션을 하나로 묶어 처리해줌으로써 반복적인 작업을 자동화한다.
: 전체 배치 프로세스를 캡슐화한 엔티티, 배치 처리 과정을 하나의 단위로 만들어 놓은 객체.

Job은 Step 인스턴스의 컨테이너 개념으로 사용한다. 여러 Step을 결합하고, 재시작 같은 속성을 구성할 수 있다. : Job 실행의 단위.
job이 각각 실행할 때마다 따로 추적할 수 있도록 매 실행마다 생성된다. 특정 job과 식별 가능한 JobParameters에 상응하는 JobInstance는 단 한 개뿐이다.💡 새
JobInstance를 사용한다는 것은 처음부터 시작을 의미하고, 이미 있는 Instance를 쓴다는 것은 멈췄던 곳에서부터 시작을 의미한다.
: JobInstance에 전달되는 매개변수 역할, JobInstance를 구분하는 식별자 역할

: Job에 대한 실행 시도 정보를 담은 객체.
JobExecution은 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고 있다. JobInstance는 실행이 성공적으로 끝나지 않는다면 완료되지 않은 것으로 간주하는 것과 달리 JobExecution는 실패와 성공에 상관없이 하나의 실행 정보로 저장한다.
JobExecution는 실패하였다. job이 실행되었으므로 JobInstance이 생성되었지만 작업이 실패하였기 때문에 2번째 실행에서는 여전히 1번 인덱스를 가진 JobInstance이 사용되었다. 작업에 성공하면 다음 실행은 새로운 JobInstance을 생성한다.: 배치 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화 한 도메인 객체. Job은 하나 이상의 Step을 가져야 한다.
: Step에 대한 실행 시도 정보를 담은 객체.

Step이 시작되었을 때만 StepExecution을 생성한다.Step이 실패하였다면, StepExecution을 생성하지 않는다.: 프레임워크에서 유지/관리하는 key-value의 컬렉션. StepExecution객체 또는 JobExecution객체에 속하는 상태를 저장한다.
ExecutionContext을 통해 Job, Step간 데이터 공유가 가능하며, Job 실패 시 이 것을 통해 마지막 실행 값을 재구성할 수 있다.: Commit 시점에 저장
: 실행 사이에 저장
: 위에 업근된 모든 저장(Persistence)매커니즘을 담당.
Job을 실행할 때 Repository에서 JobExecution을 조회하고, 실행 중에는 JobExecution, StepExecution 구현체를 Repository에 넘겨 저장한다.💡 ServerApplication단에
@EnableBatchProcessing을 추가하면 자동으로JobRepository을 컴포넌트로 설정한다.
: 주어진 JobParameters로 Job을 실행하는 간단한 인터페이스.
: Step에서 아이템을 한 번에 하나씩 읽어오는 작업을 추상화한 개념.
ItemReader는 null을 반환한다.: Step에서 배치나 청크 단위로 아이템을 출력하는 작업을 추상화한다.
ItemWriter는 다음에 받을 입력이 무엇인지 알지 못하며 현재 받은 아이템만 알고 있다.: 아이템을 처리하는 비즈니스 로직을 나타내는 추상화 개념
ItemProcessor가 null을 반환하면, 해당 아이템이 유효하지 않고 Write되면 안된다는 것을 의미한다.
TaskletStep은 Tasklet을 가진 객체다. 기본적으로 무한히 반복하는 형태로 동작을 하며, TaskletStep은 하나의 Tasklet만 수행한다.
💡TaskletStep 반복 실행 여부
- RepeatStatus.Finished, Null: 반복 수행하지 않고 종료.
- RepeatStatus.Continuable : Teaklet 반복
: 단일 객체를 바탕으로 비즈니스 로직을 수행한다.
🚨 대용량 데이터를 사용하기에는 Tasklet 방식에는 무리가 있기 때문에 대용량 데이터를 처리해야 하는 일에는 Chunk 처리 방식을 지향한다.
Spring Batch는 대부분 Chunk 지향 처리 방식을 사용한다. 해당 방식은 한 번에 데이터를 하나씩 읽어와 트랜잭션 경계 내에서 쓰여질 Chunk를 만드는 것이다.

💡 트랜잭션을 커밋하기 위해 처리할 아이템 수가 정해져 있고, 아이템 수의 단위를 Chunk라고 한다.
참고
Spring Batch 공식문서
토리맘 한글라이즈 프로젝트
Spring Batch : TaskLetStep 관련 정리