Framework/Spring

공식 문서를 통해 스프링 배치(Spring Batch)에 대해 간략하게 알아보기

TwinParadox 2021. 6. 20. 19:06
728x90

Batch Processing

일괄 처리 작업

어떤 서비스를 즐기다 보면 전산 작업 시간 등등에 진행되는 작업이 이 배치 작업이다. 예시로 들면 이런 게 있다.

 

  • 대용량의 데이터를 복잡한 작업으로 처리하는 경우
  • 주간, 월간 지표 집계와 같은 특정 시점에 정해진 작업이 수행되는 경우
  • 대용량 데이터 유효성 검사 등의 작업을 트랜잭션 안에서 처리 및 기록해야 하는 경우

 

위 작업을 일반 어플리케이션에서 할 수는 없기 때문에, 이를 위한 별도의 배치 처플리케이션을 구현하고 해당 어플리케이션을 기동하는 편이다. 그렇기 때문에 다양한 작업을 배치 작업을 이용해 처리하고 있고, Srping에서는 Spring Batch를 통해 제공하고 있다.

 

 

Batch 원칙

  • 일반적으로 같은 서비스 환경에서 동작하는 서비스와 배치는 서로 영향을 미치므로, 배치와 서비스에 영향을 최소화하는 구조와 환경에 맞는 디자인이 필요하다.
  • 배치 어플리케이션 내 로직은 단순하게 가져가야 한다.
  • 데이터 처리 로직과 저장소는 물리적으로 가까운 곳에 위치시킨다.
  • DB I/O, 네트워크 I/O, 파일 I/O 등, 시스템 리소스의 사용을 최소화하면서 최대한 많은 데이터에 대해 메모리 위에서 처리한다.
  • 처리 시간이 많이 걸리는 작업은, 시작하기 전 충분한 메모리를 할당해서 메모리 재할당에 시간을 소모되지 않도록 한다.
  • 데이터 무결성을 위해 검사와 기록 코드 추가

 

 

Spring Batch를 활용한 배치 작업

  • 주기적인 배치 작업
  • 동시적인 배치 작업(병렬 처리)
  • 단계별 엔터프라이즈 메세지 기반 처리
  • 대규모 작업에 대한 병렬 배치
  • 실패 후 수동 / 예약 재시작
  • 단계별 순차 처리
  • 롤백 발생 시 레코드를 건너뛰는 등의 부분 처리
  • 배치 작업 처리 단위가 작은 경우, 기존 저장 프로시져/스크립트가 있는 경우 전체 배치에 대해 트랜잭션 처리

 

 

Spring Batch 구조

Spring Batch Architecture

Application

개발자가 작성한 배치 작업과 사용자 정의 코드

 

Batch Core

배치 작업을 시작/제어에 필요한 핵심 런타임 클래스들

예를 들어, JobLauncher, Job, Step와 같은 것들

 

Batch Infrastructure

개발자와 어플리케이션에서 사용하는 일반적인 Reader/Wrtiter와 RetryTemplate 같은 서비스

 

 

Spring Batch Job

배치 작업은 읽기 - 처리 - 쓰기 흐름을 기본적으로 가져간다. Spring Batch에서는 이 흐름에 맞게, Reader/Processor/Writer 객체를 가지고 있고, 다음과 같은 구조를 가진다.

Spring Batch Job

  • Job : Step = 1 : M
  • Step과 Reader/Processor/Writer는 각각 1:1

 

Job

배치 처리 과정 자체를 하나의 단위로 표현하는 객체로, 전체 배치 처리에 있어서 항상 최상단 계층

Spring Batch에서는 Job은 여러 Step 인스턴스를 포함하는 컨테이너

Job의 builder는 여러 개가 존재하며 보통, JobBuilderFactory로 원하는 형태로 생성

 

 

Step

앞서 이야기한 배치 작업인 읽기 - 처리 - 쓰기의 묶음.

Chunk processing 이라고도 하는데, Spring 공식 문서에 따르면 다음과 같은 컨셉을 가지고 있다.

List items = new Arraylist();

for(int i = 0; i < commitInterval; i++){
    Object item = itemReader.read()
    Object processedItem = itemProcessor.process(item);
    items.add(processedItem);
}

itemWriter.write(items);

여러 번의 읽기 및 처리 작업을 진행하고 사전에 지정한 commitInterval을 넘기면 쓰기 작업을 수행하는 컨셉으로 이해하면 된다.

 

 

Reader - Processor - Writer

public interface ItemReader<T>
T read()

public interface ItemProcessor<I,O>
O process(I item)

public interface ItemWriter<T>
void write(java.util.List<? extends T> items)

ItemReader

읽어들인 데이터를 반환하며, 전체 데이터의 마지막인 경우 null을 반환

이 메서드의 반환은 ItemProcessor의 입력으로 사용

 

ItemProcessor

ItemReader에게서 Object를 넘겨받아 원하는 방식으로 가공하고 ItemWriter에 넘겨주는 역할을 수행하며, 한 번에 하나의 Item을 처리

Input은 ItemReader에게서 받고, Output은 ItemWriter에 넘겨주는 형식

 

ItemWriter

ItemReader나, ItemProcessor에게서 받아온 데이터를 리스트에 쌓아서 commit-interval에 정의된 개수만큼 모였을 때 write 메서드를 실행한다. commit-interval의 경우 Step의 Chunk에서 정의한다.

 

ItemReader와 ItemWriter에 대해서 Spring Batch에서 제공하는 구현체들은 다음과 같은 것들이 있다.

  • CompositeItemXXX
  • FlatFileItemXXX
  • HibernateItemXXX
  • JdbcBatchItemXXX
  • JsonFileItemXXX
  • MongoItemXXX

 

 

Reference

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

 

728x90
728x90

'Framework > Spring' 카테고리의 다른 글

Spring Batch 5.x에 적응하기  (0) 2024.03.03