개발 일기

[Spring Batch] 배치 처리와 스프링 배치 그리고 스케줄러 본문

Back-End/Spring

[Spring Batch] 배치 처리와 스프링 배치 그리고 스케줄러

개발 일기장 주인 2024. 9. 17. 20:01

https://spring.io/projects/spring-batch

 

Spring Batch

A lightweight, comprehensive batch framework designed to enable the development of robust batch applications vital for the daily operations of enterprise systems. Spring Batch provides reusable functions that are essential in processing large volumes of re

spring.io

 

우선 배치에 대해 이해해보자

배치 처리(Batch Processing)과 스프링 배치(Spring Batch)

배치 처리(Batch Processing)은 컴퓨터가 주기적으로 대량의 반복적인 데이터 작업을 완료하기 위해 사용하는 방식으로 일괄적으로 모아서 한번에 처리하는 작업을 의미한다. 데이터를 실시간으로 처리한다거나 특정 일자나 특정 시간에 작업을 한다는 것과는 차이가 있다. 배치 처리 아래와 같은 특징이 있다.

  • 대량의 데이터를 처리한다.
  • 일괄 처리한다.
  • 대량이 데이터를 특정 시간에 일괄로 처리해서 그 외의 시간에는 해당 작업으로 인한 자원 소비가 없다.

배치는 데이터를 효율적으로 빠르게 처리하는 것도 좋지만, 현재 작업이 얼마나 진행되었는가? 그리고 했던 작업을 또 다시 중복해서 하지 않도록 처리하는 것이 중요!
크게 읽어와서 처리한 후 업데이트 하는 과정을 거치는데 이때 읽어올때 한번에 읽어오지 않는다.  대량의 데이터를 한 번에 읽어오지 않고 청크(chunk) 단위로 처리하는 이유는 주로 메모리 사용과 속도 문제 때문이다.

스프링 배치(Spring Batch)는 위와 같은 배치 작업을 구현하는 것을 도와주는 스프링 생태계의 프레임워크(프로젝트) 중 하나이다. 

 

스프링 배치(Spring Batch)와 스케줄러(Scheduler)

https://docs.spring.io/spring-batch/reference/spring-batch-intro.html

스프링 공식 문서를 찾아보니 아래와 같은 작업들에서 Spring Batch가 쓰인다고한다.

또한 스케줄러에 대한 언급 또한 있었다.

 Spring Batch is not a scheduling framework. There are many good enterprise schedulers (such as Quartz, Tivoli, Control-M, and others) available in both the commercial and open source spaces. Spring Batch is intended to work in conjunction with a scheduler rather than replace a scheduler.

라고 했는데 Spring Batch와 Scheduler에 차이점이 있음을 언급했고 Spring Batch와 Scheduler 둘 중에 선택하여 서로 대체재가 되는 것이 아닌 둘이 함께 쓰여질 수 있는 상호 보완적인 관계라고 되어 있었다.

스프링 스케줄러는 스프링 배치 프로젝트 아래에 있는 기능이 아니라 스프링 프레임워크 프로젝트에 포함된 기능이다.
정해진 시간에 작업을 실행하거나 주기적인 작업을 처리하는 스케줄링 도구로 정해진 시간에 배치 작업이나 기타 작업을 트리거하는 역할을 하는 것이다.

 

사용 시나리오 

공식 문서에서 사용 시나리오도 있었다. 데이터베이스, 파일 또는 큐에서 대량의 레코드를 읽어와서 어떤 방식으로든 데이터를 처리한 후 수정된 형태로 데이터를 다시 업데이트 하는 작업이다.

나는 구독 서비스에서 자정에 만료 날짜를 조회해서 만료 여부를 데이터베이스에 반영해주는 작업을 할때 해당 배치를 사용할 예정이다.

 

스프링 배치 내부 구조도

https://docs.spring.io/spring-batch/reference/job.html

  • JobLauncer : 하나의 배치 작업(Job)을 실행 시키는 시작점
  • Job : “읽기 → 처리 → 쓰기” 과정을 정의한 배치 작업
  • Step : 실제 하나의 “읽기 → 처리 → 쓰기” 작업을 정의한 부분으로, 1개의 Job에서 여러 과정을 진행할 수 있기 때문에 1 : N의 구조를 가진다.
  • ItemReader : 읽어오는 부분
  • ItemProcessor : 처리하는 부분
  • ItemWriter : 쓰는 부분
  • JobRepository : 얼만큼 했는지, 특정 일자 배치를 이미 했는지 “메타 데이터”에 기록하는 부분