Spring Batch

01. Batch와 Spring Batch

  • -

이번 포스트 시리즈에서는 Spring Batch에 대해서 살펴보자.

 

Batch?

 

Batch란?

우리는 프로그래밍 과정에서 '배치 돌린다'라는 말을 종종 하게 된다. 아마도 암묵적으로 '시간이 오래 걸리는 작업을 새벽이나 주말처럼 시스템이 한가한 시간에 처리'하는 것을 말할 것이다.

좀 딱딱하게 이야기해보면 Batch란 사용자와의 상호작용 없이 대량의 데이터를 자동으로 처리하는 작업을 말한다. 

위와 같은 작업을 처리하기 위해 batch는 통산 다음의 3가지 과정으로 구성된다.

  1. 데이터베이스, 파일, 큐에서 대량의 레코드 읽기
  2. 읽어온 데이터를 특정 비지니스 로직에 따라 처리
  3. 처리된 결과를 수정된 형태로 다시 저장

예를 들어 MySql의 기본 Database인 Sakila를 이용한 시나리오를 생각하보면 "Sakil DVD 대여점은 매월 말일 자정에 포인트 정산작업을 한다"고 하자. 이런 작업이 배치의 대표적인 예이다. 

참고로 매월 말일 자정에 실행하는 것은 배치랑은 상관 없긴 하다. 그걸 별도의 Scheculer이지 배치의 본질은 아니다. 여기서는 '한달에 한번 작업하면 얼마나 많은 정보가 쌓였을까?' 가 포인트이다.

일반적으로 배치 작업은 다음의 특성을 갖는다.

  • 대용량 데이터 처리: 수천 ~ 수억 건의 데이터를 한 번에 처리
  • 자동화된 실행: 주로 야간이나 시스템 부하가 적은 시간대에 자동 실행
  • 오프라인 처리: 사용자가 기다리지 않고 백그라운드에서 실행(일반적인 웹 요청 처리와 비교되는 부분이다.)
  • 주기적 실행: 매일, 매주, 매월 등 정해진 주기로 반복 실행

 

Batch의 필요성

그런데 이런 작업은 기본 프로그래밍 스킬로 간단히 할 수 있지 않을까? pseudo-code로 만들어보면 대충 다음과 같이 생각할 수 있겠다.

private void 월말결산(String yearMonth) {
    // 1. 해당 월의 모든 결제 내역을 조회한다.
    // 2. 각 결제 내역에 대해 포인트 적립률을 계산한다.
    // 3. 포인트 적립 내역을 PointHistory 테이블에 저장한다.
    // 4. 적립된 내용을 고객에게 메일로 알린다.        
}

그런데 이런 코드는 Batch를 배우지 않더라도 그냥 충분히 작성할 수 있지 않을까? 특별한 것은 없는것 같은데?

기본적으로는 월말결산의 코드에 문제 없다면 정산 작업은 잘 진행될 것이다. 하지만..

  1. 만약 데이터 건수가 1억건 정도였다면 어떨까? 메모리가 잘 버텨줄 수 있을까?
  2. 9천9백9십만건 처리 후 예외가 발생한다면 처음 부터 다시 시작해야 할까?
  3. 고객에게 메일이 가고 있었을텐데 재시작했을 때 중복해서 메일이 가지는 않을까?

이런 상황에서 발생할 수 있는 문제들에 대해 고민하면서 작업하는 것이 Batch 작업이다. 그런데 생각만 해도 머리아플 것 같다.

 

Spring Batch

Spring Batch는 Batch 작업을 처리하기 위한 프레임워크이다. 당연히 Batch는 비지니스 로직(포인트 정산)과는 별개이기 때문에 별도의 Framework를 통해 처리하는 것이 유리할 것이고 Spring Batch는 이런 귀찮고 어려운 일을 대신 해준다.

  • 청크 단위 처리
    Spring Batch는 일정 chunk 단위로 작업을 처리하기 때문에 아무리 많은 데이터가 오더라도 문제되지 않는다.
  • 재시작 가능
    Spring Batch는 작업이 실패하더라도 실패한 지점부터 다시 시작할 수 있다.
  • 실행 이력 관리
    Spring Batch는 실행 이력을 관리하는 구조가 미리 작성되어 중복 처리를 방지할 수 있다.

이 외에도 간단한 설정으로 병렬 처리를 지원하고 skip, retry 등 다양한 예외 처리 방식등을 제공한다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.