Spring Batch 이론
Spring Batch 이론에 대해 알아보겠습니다.
이 글은
Spring Boot 3.0.6
Spring Batch 5.0.1
Spring 6.0.8
Java 17
기준으로 작성되었습니다. Spring Batch 4.x 와 Spring Boot 2.x 와는 다른 점이 많으니 해당 버전은 다른 글을 참고해 주세요~!
Spring 배치란?
Spring Batch는 대용량의 데이터 처리를 위한 오픈소스 배치 프레임워크로, 스프링 프레임워크와 통합되어 사용됩니다.
Spring Batch는 성능, 확장성, 안정성, 재시작 기능 등 배치 작업에서 요구되는 다양한 기능들을 제공합니다.
또한, 스프링 프레임워크와 함께 사용되면 스프링의 다양한 기능들과 연동이 가능해져 배치 작업을 보다 효과적으로 구현할 수 있습니다.
Spirng 배치 용어정리
Job
배치의 실행 단위
하나의 Job 에는 N개의 Step이 존재할 수 있습니다.
각 Step의 흐름(Flow)에 대한 제어를 할 수 있습니다.
JobLauncher에 의해 실행될 수 있습니다.
JobLauncher
JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체입니다.
JobInstance
JobInstance는 Job의 실행의 단위입니다.
JobParameter가 동일하면, 동일한 JobInstance로 판단됩니다.
JobParameters
JobInstance를 구분하기 위한 값이며 실행 시점에 parameter를 전달할 수 있습니다.
JobParameter에 의해 각 JobInstance를 구분합니다.
JobRepository
JobRepository는 배치처리에 대한 정보를 담고 있습니다. Job이 실행되면
JobRepository에 JobExecution과 StepExecution을 생성하게 되며
JobRepository에서 Execution 정보들을 저장하고 조회하며 사용하게 됩니다.
Job 및 Step 실행 정보들을 메타 테이블에 저장하는 역할을 합니다.
JobExecution
Job 실행에 대한 정보를 담고 있습니다.
Version, JobInstanceID, 생성시간, 실행시작시간, 종료시간, 상태, 최종 수정일 등의 정보를 담고 있습니다.
ExecutionContext
Execution Context는 JobExecution과 StepExecution 객체에 각각 존재합니다.
JobExecution은 Job 전체의 실행 정보를 담고 있으며, StepExecution은 Step 실행에 대한 정보를 담고 있습니다.
Execution Context는 Key-Value 형태로 데이터를 저장하며, JobExecution 혹은 StepExecution 객체를 생성할 때 초기화됩니다.
Step
Step은 Job의 배치처리를 정의하고 순차적인 단계를 캡슐화합니다. Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄 처리를 제어하는 모든 정보가 들어있습니다.
StepExecution
Step 실행에 대한 정보를 담고 있습니다.
Version, StepName, JobExecutionID, 생성일, 실행시작일시, 실행종료일시, 상태 등 Step에 대한 전반적인 정보를 담고 있습니다.
Tasklet
Step 안에서 수행될 단일 작업을 정의합니다. 즉, Step 실행 시 하나의 Tasklet을 실행하고,
Tasklet이 모두 완료되면 Step이 종료됩니다.
Tasklet은 개발자가 정의한 로직을 수행하며, 실행 중에 필요한 데이터를 직접 읽고 처리하고 저장할 수 있습니다.
Chunk
Chunk 방식은 Step 안에서 처리해야 하는 대용량 데이터를 일정한 크기로 나누어 처리하는 방식입니다.
Chunk 방식은 ItemReader에서 데이터를 읽어 들이고, ItemProcessor를 통해 가공한 후, 일정한 크기로 묶어서 ItemWriter에 전달하여 저장합니다.
Chunk 방식은 대량의 데이터를 효율적으로 처리할 수 있으며, 데이터 처리 과정 중 실패한 경우 해당 Chunk를 다시 실행하거나, 실패한 Chunk부터 다시 시작할 수 있습니다.
ItemReader
데이터 소스에서 데이터를 읽어오는 역할을 합니다.
주로 데이터베이스, 파일, 웹서비스 등 다양한 소스에서 데이터를 읽어올 수 있으며,
읽어온 데이터를 Chunk 단위로 ItemProcessor에 전달합니다.
ItemProcessor
읽어온 데이터를 가공하는 역할을 합니다.
ItemReader에서 읽어온 데이터를 처리하여 필요한 형태로 변경하거나, 필터링 등의 작업을 수행할 수 있습니다.
처리된 데이터는 다시 ItemWriter에 전달됩니다.
ItemWriter
가공된 데이터를 저장하는 역할을 합니다. 주로 데이터베이스, 파일, 웹서비스 등 다양한 저장소에 데이터를 저장할 수 있으며,
Chunk 단위로 데이터를 저장합니다. 또한, 실패 시에 대처하는 방법도 제공합니다.
메타데이터 테이블
위의 용어 설명에서와 같이 Spring Batch에서는 Job, Step 별로 실행정보와 해당 Job에 대한 정보를 가지고 있습니다.
해당 정보들은 메타데이터 테이블에 저장됩니다.
해당 ERD를 보면 위의 용어 설명에서 보이던 JobExecution, StepExecution에 대한 정보들이 보입니다.
하나의 Job이 실행되면 JobParameters 별로 JobInstance가 생기고 실행 정보들이 위 메타테이블에 저장됩니다.
해당 테이블은 자동으로 생성되게 할 수도 있는 걸로 알고 있지만, 직접 생성하는 게 편합니다.
DDL은 Spring batch core에 있습니다.
각 벤더사 별로 schema-벤더사명. sql 파일에서 확인할 수 있습니다. ex) schema-mysql.sql
테이블을 생성하고 나면 스프링 배치를 사용할 준비가 되었습니다~
다음 글에서는 스프링 배치를 실행하는 방법에 대해 알아보겠습니다.