✅ 배치 프로그램이란?
✔️ 정해진 시간에 일괄적으로 작업을 처리하는 것
✔️ 대체로 대용량 데이터를 처리할 때 사용한다.
✔️ 서비스를 운영하는 관점에서 주기적으로 작업을 처리하기 위해서는 배치 프로그램을 사용해야 한다.
✅ 배치 프로그램이 필요한 상황
✔️ 필요한 데이터를 모아서 처리해야 할 때
✔️ 일부러 지연시켜 처리할 때
- ex) 주문한 상품을 바로 배송 처리 하지 않고, 일정 시간 뒤 처리
✔️ 자원을 효율적으로 활용하기 위해
- ex) 트래픽이 적은 시간 대에 서버 리소스를 활용
✅ 데이터 처리 배치 프로그램 사용 사례
✔️ 각 서비스의 데이터를 데이터 웨어하우스에 저장할 때 = ETL(Extract-Transform-Load)
✔️ 아마존에서 연관 상품을 추천하는 데이터 모델을 만들 때
✔️ 유저의 Retension 등 마케팅에 참고할 데이터 지표를 집계할 때
✅ 서비스 배치 프로그램 사용 사례
✔️ 메시지, 이메일, 푸시 등을 발송할 때
✔️ 데이터를 마이그레이션 할 때
✔️ 실패한 트랜잭션을 재 처리할 때
✔️ 쿠폰, 포인트 등이 만료되었을 때 소진시키는 처리를 할 때
✔️ 월말 또는 월초에 특정 데이터를 생성할 때 - 월별 거래 명세서
✅ 배치 어플리케이션의 조건
✔️ 대용량 데이터 : 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 한다.
✔️ 자동화 : 심각한 문제 해결을 제외하고는 사용자 개입 없이 실행되어야 한다.
✔️ 견고성 : 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 한다.
✔️ 신뢰성 : 무엇이 잘못되었는지를 추적할 수 있어야 한다. (로깅, 알림)
✔️ 성능 : 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 애플리케이션을 방해하지 않도록 수행되어야 합니다.
✅ Spring Batch
✔️ Spring Batch는 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크
✔️ 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공
✔️ 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공
✅ Spring Batch 아키텍처
💡 Spring Batch가 제공하는 Core와 Infrastructure를 활용해 Application을 구현한다.
✅ Spring Batch 용어
✔️ Job
- 전체 배치 프로세스를 캡슐화한 도메인
- Job은 배치 처리 과정을 하나의 단위로 만들어 표현한 객체이고 여러 Step 인스턴스를 포함하는 컨테이너
- Step의 순서를 정의한다.
- JobParameters를 받는다.
@Bean
public Job footballJob(JobRepository jobRepository) {
return new JobBuilder("footballJob", jobRepository)
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.build();
}
✔️ JobRepository
- 다양한 배치 수행과 관련된 수치 데이터와 Job의 상태를 유지 및 관리한다.
- 일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유한다.
- 실행된 Step, 현재 상태, 읽은 아이템 및 처리된 아이템 수 등이 모두 JobRepository에 저장된다.
✔️ JobLauncher
- Job을 실행하는 역할을 담당한다. Job.execute을 호출하는 역할이다.
- Job의 재실행 가능 여부 검증, 잡의 실행 방법, 파라미터 유효성 검증 등을 수행한다.
- 스프링 부트의 환경에서는 부트가 Job을 시작하는 기능을 제공하므로, 일반적으로 직접 다룰 필요가 없는 컴포넌트다.
- Job을 실행하면 해당 잡은 각 Step을 실행한다. 각 스텝이 실행되면 JobRepository는 현재 상태로 갱신된다.
✔️ JobInstance
- Job의 실행 단위를 나타낸다. Job을 실행시키면 하나의 JobInstance가 생성된다.
- 1월 1일, 1월 2일 실행하면 각각의 JobInstance가 생성되며, 1월 1일 실행한 JobInstance가 실패하여 다시 실행을 시키더라도 이 JobInstance는 1월 1일에 대한 데이터만 처리한다.
✔️ JobParameters
- JobInstance를 구별할 때 사용한다.
- 개발자 JobInstance에 전달되는 매개변수의 역할도 있음
- String, Double, Long, Date 4가지 형식을 지원
✔️ JobExecution
- JobInstance에 대한 실행 시도에 대한 객체
- 실패하여 재실행 시킨 경우 동일한 JobInstance이나 2번 실행에 대한 JobExecution은 개별로 생성된다.
- JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고있다.
✔️ Step
- Job의 배치 처리를 정의하고 순차적인 단계를 캡슐화한다.
- Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄처리를 제어하는 모든 정보가 들어있다.
- Step에는 Tasklet, Chunk 기반으로 2가지가 있다.
✔️ Tasklet
- Step이 중지될 때까지 execute 메서드가 계속 반복해서 수행하고 수행할 때마다 독립적인 트랜잭션이 얻어진다. 초기화, 저장 프로시저 실행, 알림 전송과 같은 잡에서 일반적으로 사용된다.
- 하나의 트랜잭션에서 데이터를 처리하며 보통 단순한 처리에서 사용된다.
✔️ Chunk
- 한 번에 하나씩 데이터(row)를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것
- Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 된다.
- Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter라는 3개의 주요 부분으로 구성될 수 있다.
- commitInterval만큼 데이터를 읽고 트랜잭션 경계 내에서 chunkSize만큼 write를
한다.
✔️ StepExecution
- Step 실행 시도에 대한 객체
- 이전 단계의 Step이 실패하면 StepExecution은 생성되지 않는다.
- 실제 시작이 될 때만 생성된다.
= StepExecution은 JobExecution에 저장되는 정보 외에 read 수, write 수, commit 수, skip 수 등의 정보들이 저장된다.
✔️ ExecutionContext
- Job에서 데이터를 공유할 수 있는 데이터 저장소
- StepExecution 개체 또는 JobExecution 개체로 범위가 지정된 영구 상태를 저장할 수 있는 공간을 제공하기 위해 프레임워크에 의해 지속되고 제어되는 키/값 쌍의 모음
- Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지 종류가 있으나 이 두가지는 지정되는 범위가 다름
- JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExecutionContext는 실행 사이에 저장이 되게 됩니다.
- ExecutionContext를 통해 Step간 Data 공유가 가능하며 Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성할 수 있습니다.
✔️ ItemReader
- Step에서 Item을 읽어오는 인터페이스
- 모든 Item을 읽어서 사용하면 null을 반환한다.
- ItemReader에 대한 다양한 구현체들이 정의되어 있음
✔️ ItemWriter
- 처리된 데이터를 write 할 때 사용
- write는 처리 결과물에 따라 Insert, Update, Send(Queue 사용 시)가 될 수 있다.
- 기본적으로 Item을 Chunk로 묶어 처리한다.
- ItemWriter는 다음에 수신해야 하는 입력에 대해 알지 못하며 현재 호출에서 전달된 항목만 알고있다.
✔️ ItemProcessor
- Reader에서 읽어온 Item을 처리하는 역할
- ItemReader가 한 항목을 읽고 ItemWriter가 한 항목을 쓰는 동안 ItemProcessor는 다른 비즈니스 처리를 변환하거나 적용할 수 있는 액세스 지점을 제공
- 항목을 처리하는 동안 항목이 유효하지 않은 것으로 확인되면 null을 반환한다. null이 반환되면 해당 항목을 처리할 수 없음을 나타낸다.
✅ Spring Batch 스키마 구조
- 배치를 실행하고 관리하기 위한 메타데이터를 저장
- 데이터베이스를 구축하여 해당 메타데이터들을 활용할 수 있다.
- Spring Batch Framework가 실행 시 메타 데이터 테이블들을 사용하므로 초기 설정 필요
- Spring Batch Framework에 속하는 부분으로 수정하지 않고 조회하는데만 사용된다.
- Job의 이력, 파라미터 등 실행 결과를 조회할 수 있다.
- 배치 결과에 대해서 로그, 별도의 실행 이력을 남기는 경우가 대부분이므로 조죄할 일이 많지 않다.
참고 Reference