🚨 팀 프로젝트를 진행하면서 게시 글 도메인을 맡았다. 간단한 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 관련 정리