Spring Batch 구조 살펴보기

huGgW·2024년 3월 11일

Spring Batch란?

Spring Batch는 대량의 데이터 처리와 배치 처리를 위해 설계된 경량화된 배치 프레임워크입니다. 대용량 데이터 처리나 반복적인 업무 처리가 필요할 경우 이를 효율적으로 처리할 수 있게 해줍니다. Spring Batch는 로깅 및 추적, 트랜잭션 관리, 작업 진행 관련 통계, 작업 재시작 및 건너뛰기, 자원 관리 등 다량의 데이터를 처리하는데 필요한 기능을 제공합니다. 또한, 작업을 분산 처리할 수 있어 대량의 데이터를 빠르게 처리할 수 있습니다. 이때 Spring Batch는 스케줄러와는 다릅니다. Spring Batch는 스케줄러와 함께 작동함으로써 데이터를 처리하는데 도움을 주는 프레임워크입니다.

Spring Batch의 구조

Spring Batch의 구조
Spring Batch는 크게 JobLauncher, Job, Step, JobRepository로 구성되어 있습니다. JobLauncher는 실제로 Job을 실행시키는 부분이며, Job은 하나의 배치 작업을 나타내는 단위입니다. Step은 Job에서의 각 독립적인 작업 단계를 나타내는 단위로, Job은 하나 이상의 Step으로 구성되어 있습니다. 그리고 이러한 Job과 Step의 작업 진행 상황을 JobRepository가 관리하게 됩니다.

Job, JobInstance, JobExecution, JobParameter


Job은 하나의 Batch 작업을 나타내는 것으로, 하나의 배치 프로세스에 대한 정보들을 담고 있는 객체라고 생각할 수 있습니다. 이때 하나의 배치 프로세스는 크게 세 가지의 정보를 필요로 하는데, 작업의 이름, 작업을 이루는 세부 단계들인 Step들의 구성, 작업의 재시작 여부입니다.

Job이 작업 정보를 저장하고 있는 객체라면, JobInstance는 실행될 작업 단위를 나타내는 논리적인 객체입니다. 매 시간 실행되어야 하는 작업을 예시로 생각한다면, Job은 이 작업에 대한 전반적인 설정을 담고 있고, JobInstance는 특정 시간에 실행되는 작업을 나타내는 객체입니다.

JobInstance가 실행되는 작업의 단위라면, 이들의 구분은 어떻게 이루어질까요? 구분을 위하여 인자로 주어지는 것이 JobParameter입니다. 위에서 든 예시를 다시 보자면, 각 JobInstance는 현재 시각인 datetimeJobParameter로 받아 각 작업 단위를 구분할 수 있는 것입니다. (물론, 함수에 인자를 넘겨주는 것과 같이 구분과 관계없이 자유롭게 넘겨줄 수 있습니다.)

JobExecution은 실제로 실행되는 작업에 대한 객체입니다. 쉽게 생각하자면 시도를 하고 상태, 시작시간, 종료시간, 생성시간 등의 결과를 저장해주는 객체라고 생각할 수 있을 것입니다.

Step, StepExecution


Step은 작업 내의 독립적인 작업 단계를 나타내는 것으로, 하나의 작업 단계에 대한 정보를 담고 있는 객체라고 생각할 수 있습니다. Step을 통해 하나의 큰 작업(Job)을 여러 단계로 세분화할 수 있습니다. 이 때 Step은 실행되는 작업 단계를 나타내고, StepExecution은 실제 작업 단계의 시도를 나타내는 객체입니다.
Step은 크게 두 가지 방법으로 정의를 할 수 있는데, Tasklet 방식과 Chunk base 방식입니다.

Tasklet


TaskletStep에서 실행할 하나의 과정을 정의하는 객체입니다. Step은 단 하나의 Tasklet으로만 정의할 수 있기 때문에, 주로 Tasklet에는 여러 Step중 해당하는 Step이 담당하는 하나의 과정을 정의하게 됩니다. Tasklet은 하나의 과정을 서술하고 있기 때문에 작업을 간단하게 정의 가능하고 전체 작업을 재사용 가능하다는 장점이 있습니다. 주로 간단하고 적은 양의 데이터를 처리할 때 사용합니다.

Chunk base


Chunk base는 다량의 데이터를 chunk로 나누어 처리해야 하는 작업의 경우 사용하게 됩니다. 크게 3가지 구성 요소로 Step이 나뉘게 되는데요, 데이터를 나누어 읽어오는 ItemReader, 읽어온 데이터를 알맞게 처리해주는 ItemProcessor, 처리된 데이터를 저장하는 ItemWriter 3가지로 나뉘게 됩니다.

기타 자세한 구조와 예시 코드를 살펴보고 싶으시면 아래 자료들을 참고해보시면 좋습니다!

0개의 댓글