이커머스 프로젝트중 상점에서 판매량 통계를 볼 수 있으면 좋겠다는 생각이들어 Spring Batch를 이용해 보기로하였다
하지만 Spring Batch는 대량의 데이터를 일괄적으로 처리하기위한 라이브러리라는 것만 알고 있어 먼저 학습을 해보려고한다
Spring Batch 란?
Spring Batch는 대량의 데이터를 일괄적으로 처리하고 반복적인 배치 작업을 효과적으로 수행할 수 있도록 설계된 프레임워크이다
스케줄러와 달리 배치 작업을 관리하는데 초점을 맞추고 있어 보통 스케줄러와 함께 사용해 일정한 주기마다 배치 작업을 수행한다
Spring Batch와 스케줄러는 다르다
Spring Batch의 구성
Spring Batch는 크게 Job과 Step으로 구성된다
- Job
- Job은 배치 작업의 단위이며 하나 이상의 Step으로 구성된다
- 실행되는 Step의 순서를 정의하고 관리한다
- Step
- Job 내부에서 실제 데이터가 처리가 이루어지는 단위이다
- Step은 Job에서 정의한 순서대로 실행되며 각각의 Step은 독립된 트랜잭션을 가질 수 있다
- Step을 처리하는 방식에는 Tasklet 방식과 Chunk 지향 방식이 있다
Step 처리 방식 - Tasklet & Chunk 지향
Tasklet 방식
Tasklet은 하나의 작업 단위를 의미하고 한 Step 에서 단순 반복이나 짧은 작업을 수행할때 사용한다
하나의 Step에 하나의 Tasklet을 수행하는 방식으로 단순한 작업에 유용하다
Chunk 지향 방식
Chunk 지향 방식은 데이터를 일정한 양 만큼 읽어와서 처리한 후 한번에 쓰는 방식이다
만약 처리할 데이터가 1만개가 있다고 가정했을때 1000개씩 한 묶음(Chunk) 으로 처리하는 방식이다
대량의 데이터 처리나 복잡한 로직을 수행할 때 효과적이다
Chunk 지향 방식의 3단계
- Read: 데이터를 읽어온다 (DB, 메시지 큐 등등)
- Process: 읽어온 데이터를 가공한다
- Write: 가공된 데이터를 저장한다
각 Chunk의 처리가 완료되면 Commit이 이루어진다
Chunk 란?
대량의 데이터를 쪼개 작은 묶음으로 나눈 것을 Chunk 라고한다
Chunk 지향 방식의 장점
대량의 데이터를 작음 묶음으로 쪼개어 처리하게된다면 여러가지 장점이있다
- Chunk 별로 트랜잭션 관리를 할수있다
- 중간에 오류가 발생해도 해당 Chunk만 롤백된다
- 성능 최적화가 가능하다
- 대량의 데이터를 한번에 처리하는 것이 아닌 일정 단위로 나누어 처리하므로 메모리 사용량을 줄일 수 있다
Spring Batch에서 알아야할 개념
JobInstance
JobInstance는 Job의 실행 단위를 의미한다
같은 Job 이라도 실행할 때마다 새로운 JobInstance가 생성된다
어제 실행한 Job과 오늘 실행한 Job의 JobInstance는 다르다
JobParameters
JobParameters는 JobInstance를 구분하기위해 사용하는 값이다
Job 실행시 전달되는 매개변수 역활을 하며 String, Double, Long, Date 4가지 형식만 지원한다
JobExecution
JobExecution은 특정 JobInstance의 실행 시도를 나타낸다
동일한 JobInstance라도 여러번 실행될 수 있어 실행될 때 마다 JobExecution이 생성된다
JobInstance는 Job의 실행 단위
JobExecution은 JobInstance의 실행 시도
JobLauncher
JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체이다
일반적으로 외부 요청(API 호출, 스케줄링)으로부터 Job 실행을 담당한다
StepExecution
StepExecution은 Step의 실행 시도를 나타낸다
Step이 실행될 때 마다 StepExecution이 생성되며
Job이 여러 개의 Step으로 구성되어 있을 때 이전 Step이 실패하면 이후 StepExecution은 생성되지 않는다
ExecutionContext
ExecutionContext는 Job, Step 간 데이터를 공유할 수 있는 저장소이다
- JobExecutionContext: Job 단위로 데이터를 Commit 시점에 저장한다
- StepExecutionContext: Step 실행 중 데이터를 저장할 수 있다
ExecutionContext를 활용하면 Step 간 데이터를 공유하거나
Job 실패 시 마지막 실행 값을 기반으로 복구할 수 있다
JobRepository
JobRepositoy는 Job 및 Step의 실행 정보를 저장하고 관리한다
Job 실행시 JobExecution과 StepExecution을 생성한다
Spring Batch의 실행 흐름
- JobLauncher가 Job을 실행하며 JobParameters를 전달한다
- JobRepository에서 실행할 Job의 정보를 가져오고 JobInstance와 JobExecution을 생성한다
- JobExecution이 시작하고 Job 내부 Step이 실행된다
- 각각의 Step이 실행될 때 StepExecution이 생성되며 Step의 실행 상태와 진행 상황을 기록한다
- 각각의 Step이 완료되면 JobRepository에 실행 결과가 저장된다
- 모든 Step이 완료되면 JobExecution이 완료 상태로 변경된다
- Job이 완료되면 JobRepository에 결과를 저장한다