오늘은 스프링 배치에 대해서 포스팅하려고 합니다. 스프링 배치가 무엇이고 왜 사용하는지에 대해 설명드리겠습니다.
Spring Batch는 대용량 데이터를 처리하기 위한 프레임워크(이 작업을 "자동화"하여 "시스템의 부하를 줄이고 효율적인 데이터 처리"가 가능하여 사용)로서, 스프링 프레임워크 위에서 동작합니다. Batch 작업이라고 하면, 논리적, 물리적으로 관련된 일련의 데이터를 그룹화하여 일괄 처리하는 작업입니다. Scheduler 기능과는 엄연히 다른 기능인데, Spring Batch에서도 스케줄러 기능과 함께 사용할 수 있습니다.
Spring Batch 특징
- 확장성과 성능: Spring Batch는 대용량의 데이터를 효율적으로 처리할 수 있는 기능을 제공합니다 (멀티스레딩, Chunk 기반 처리, 병렬 처리 등)
- 에러 처리와 복구: 데이터 처리 중에 발생할 수 있는 에러를 관리하고 복구하는 메커니즘을 제공합니다
- 스케줄링: 작업을 일정한 주기로 스케줄링하여 자동으로 실행할 수 있는 기능을 제공. 이를 통해 정기적으로 반복되는 작업을 효과적으로 관리합니다
- 트랜잭션 관리: 각 배치 단계(Step)를 독립적인 트랜잭션으로 실행하거나 하나의 트랜잭션으로 묶어 실행 가능. 이를 통해 데이터 일관성을 유지하고 안정성을 확보합니다
- 설정 및 관리의 용이성: Spring 프레임워크의 일부로서 Spring의 설정 스타일을 따르며, 설정 파일을 통해 배치 작업을 구성할 수 있어 개발자가 작업 흐름과 로직에 집중이 가능합니다
- 강력한 리스너와 로그: 작업의 다양한 단계에 대한 리스너를 정의하여 이벤트를 처리할 수 있으며, 로깅과 모니터링을 위한 기능을 제공합니다
Architecture & Component
- JobLauncher: Batch Job을 실행시키는 역할 수행. Job과 Parameter를 받아서 실행하면 JobExecution을 반환합니다
- JobRepository: 수행되는 Job에 대한 정보를 담고 있는 저장소. Job이 수행, 종료, 실행 횟수 및 결과 등 Batch 수행과 관련된 모든 Meta Data가 저장됩니다
- Job: 실행시킬 작업. 논리적인 Job 실행의 개념
- JobParameter: Batch Job을 실행하는데 사용하는 파라미터의 집합, JobInstance를 생성하고 구별하는 데 사용되는 파라미터
- JobInstance: 특정 Job의 실행 인스턴스
- Step: Batch Job을 구성하는 독립적인 하나의 단계, Job은 1개 이상의 Step으로 구성됩니다
- Item: 처리할 데이터의 가장 작은 구성 요소 ex) DB의 row
- ItemReader: Step 안에서 File 또는 DB 등에서 Item을 읽어 들임. 더이상 읽어올 Item이 없을 때에는 read() 메소드에서 null값을 반환하며 그 전까지는 순차적인 값을 리턴합니다
- ItemWriter: Step 안에서 File 또는 DB 등으로 Item을 저장합니다
- ItemProcessor: Item reader에서 읽어들인 Item에 대하여 필요한 로직처리 작업을 수행합니다
Batch 방식의 종류
- Tasklet: Batch의 각 Step에서 단일 레코드나 파일을 하나의 작업만 처리하는 방식, 각각의 처리를 하나의 트랜잭션에서 처리하기에 대용량 데이터 처리에는 적합 X
- Chunk: 데이터를 일정한 크기로 나눈 데이터셋인 Chunk 방식은 “Reader-Processor-Writer” 방식으로 병렬처리 수행 (대용량 처리에 적합)
Meta Table
- 배치 작업의 상태를 관리하기 위한 메타 데이터를 저장하는 테이블 (자동으로 생성)
- BATCH_JOB_INSTANCE: job이 실행되며 생성되는 최상위 계층의 테이블로서 JobInstance 클래스와 매핑
- BATCH_JOB_EXECUTION: job이 실행되는 동안 시작/종료시간, job 상태 등을 관리하고, JobExecution 클래스와 매핑
- BATCH_JOB_EXECUTION_PARAMS: job을 실행하기 위해 주입된 parameter의 정보가 저장되어 있고, JobParameters 클래스와 매핑
- BATCH_JOB_EXECUTION_CONTEXT: job이 실행되며 공유해야 할 데이터를 직렬화해서 저장하고, JobExecutionContext 클래스와 매핑
- BATCH_STEP_EXECUTION: StepExceution 객체와 관련된 모든 정보가 저장되어 있습니다
- BATCH_STEP_EXECUTION_CONTEXT: step이 실행되며 공유해야 할 데이터를 직렬화해서 저장합니다
<참고 자료>
https://dkswnkk.tistory.com/707
https://adjh54.tistory.com/169