본문 바로가기
개발/Spring Batch

[Spring Batch] 대용량 데이터 처리를 위해 Batch 를 알아보자 - 이론편

by seopport 2023. 11. 15.
728x90
반응형

들어가기 앞서,

스프링 부트는 실무에서 사용할 수밖에 없는 기술 중 하나입니다. 계정계 업무에서는 배치를 스케쥴러와 함께 사용하여 지정된 시간에 수행할 수 있습니다. 예를 들어 재무 파트에서는, 은행 마감 시 차변과 대변의 금액이 다른 경우 배치를 실행시켜 알림을 알려주고, 예외 처리를 할 수 있습니다. 또한 특정 일자나 특정 시간에 맞춰 메일 발송을 할 수 있는 로직을 구성한 경험이 있습니다. 대용량 데이터의 기준은 사람마다 다른 것으로 보입니다. 아래 커뮤니티에서는 100만 건이나 1억 이상건이 대부분이지만 개발자나 회사마다 조금씩 다르고 과거와 다르게 지금은 점점 더 성능이 향상되면서 기준을 조금 더 높게 잡는 것 같습니다. 
 
대용량의 데이터 기준 - Okky

 

OKKY - 대용량의 기준에 대해서 질문드립니다.

사용자에 의해서 DB에 축적되는 데이터들이 어느 정도가 되어야 대용량 데이터로 분류되는지 기준에 대해 실무에 대한 경험이 깊지 않아서 어느 정도인지 감이 잡히지 않아 질문드립니다.100만

okky.kr

 
여러 채용 공고를 보면 "대용량 데이터를 처리하기 위한 배치/SQL 사용 여부"라는 문구가 있습니다. 마침 Batch 공부를 하려고 하기도 했었기 때문에 스프링 배치를 활용하여 대용량 데이터 처리하는 방법을 정리해 보도록 하겠습니다. 
 
 

스프링 배치란(Spring Batch)?

  • 엔터프라이즈 시스템의 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 배치 프레임워크 입니다.
  • 배치 프로세싱은 일괄처리라는 뜻을 가지며, 일괄처리는 일련의 작업을 정해진 로직으로 수행하는 것입니다.
  • 스프링 배치는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공합니다.

Spring Batch Logo

 
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

 

Spring Batch를 언제 사용하면 좋을까?

  • 대용량의 비즈니스 데이터를 복잡한 로직으로 처리 해야 하는 경우
  • 특별한 일자나 시간에 스케쥴러를 통하여 자동화된 작업을 해야하는 경우
  • 대용량 데이터의 포맷 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야 하는 경우

 

Spring Batch Architecture

 
 

Figure 1. Spring Batch Layered Architecture
Figure 1. Spring Batch Layered Architecture

 

Application

  • 스프링 배치를 사용하여 개발자가 작성한 모든 배치 작업과 사용자 지정 코드를 포함합니다.

 

Batch Core

  • 배치 작업을 시작하고 제어하는 데 필요한 핵심 런타임 클래스를 포함합니다.
  • 여기에는 JobLauncher, Job 및 Step을 위한 구현이 포함됩니다.

 

Batch Infrastructure

애플리케이션 개발자(ItemReader 및 ItemWriter와 같은 리더 및 라이터)와 코어 프레임워크 자체(재시도, 자체 라이브러리)가 모두 사용하는 공통 리더 및 라이터 및 서비스(예: RetryTemplate)가 포함됩니다.
 
 

Spring Batch 용어

 

JoB

Figure 3. Job Parameters
Figure 3. Job Parameters

 

  • 배치처리 과정을 하나의 단위로 만들어 놓은 객체입니다.
  • 하나 이상의 Step을 가집니다.
  • 배치 처리 과정에 있어 계층 최상단에 위치합니다.

 

JobInstance

  • Job의 실행 단위입니다.
  • 11월 12일, 11월 13일 실행 시 각각의 JobInstance 가 생성됩니다.
  • 11월 12일 실행 실패 시, 11월 13일에 대한 데이터만 처리합니다.
  • 개발자가 설정을 통하여 유니크 인스턴스 식별 규칙을 바꿀 수 있습니다.

 

JobParameters

  • JobInstance를 구별할 때 사용합니다.
  • JobInstance에 전달되는 매개변수 역할 도 하고 있습니다.
  • String, Double, Long, Date 4가지 형식을 지원합니다.

 

JobExecution

  • JobInstance 에 대한 실행 시도에 대한 객체입니다.
  • 11월 12일 실행한 Joinstance 가 실패하여 재실행을 한다면, 동일한 JobInstance를 실행시키지만, 2번의 실행에 대한 JobExecution 은 개별로 생기게 됩니다.
  • JobExecution 은 JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고 있습니다.

 

Step

Figure 4. Job Hierarchy With Steps
Figure 4. Job Hierarchy With Steps

 

  • Job의 배치처리를 정의하고 순차적인 단계를 캡슐화합니다.
  • Job 은 최소 1개 이상의 Step을 가져야 합니다.
  • Job의 일괄 처리를 제어하는 모든 정보가 들어있습니다.

 

StepExecution

  • JobExecution과 동일하게 Step 실행 시도에 대한 객체를 나타냅니다.
  • Job 이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step 이 실패하게 되면 다음 단계가 실행되지 않기 때문에, 실패 이후 StepExecution 은 생성되지 않습니다.
  • JobExecution과 동일하게 실제 시작이 될 때만 생성됩니다.
  • JobExecution에 저장되는 정보 외에, Read 수, Write 수, Commit 수, Skip 수 등의 정보들도 저장이 됩니다.

 

ExecutionContext

  • Job에서 데이터를 공유할 수 있는 데이터 저장소입니다.
  • ExecutionContext는 JobExecutionContext와 StepExecutionContext 가 있습니다. 이 두 가지는 지정되는 범위가 다릅니다.
  • JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExecutionContext는 실행 사이에 저장이 되게 합니다.
  • ExecutionContext를 통해 Step 간 Data 공유가 가능하며 Job 실패 시 ExecutionContext 를 통한 마지막 실행 값을 재구성할 수 있습니다.

 

JobRepository

  • 위에서 말한 모든 배치 처리 정보를 담고 있는 메커니즘입니다.
  • Job 이 실행되게 되면 JobRepository에 JobExecution과 StepExecution 정보들을 저장하고 조회하며 사용하게 됩니다.

 

JobLauncher

  • Job과 JobParameters를 사용하여 Job을 실행하는 객체입니다.

 

ItemReader

  • Step에서 Item을 읽어오는 인터페이스입니다.
  • 다양한 인터페이스가 존재하며 다양한 방법으로 Item 을 읽어 올 수 있습니다.

 

ItemWriter

  • 처리된 Date를 Writer 할 때 사용합니다.
  • 처리 결과물에 따라 INSERT, UPDATE 될 수 있고, Queue를 사용한다면 Send 가 될 수도 있습니다.
  • Write 또한 Read와 동일하게 다양한 인터페이스가 존재한다.
  • 기본적으로 Item을 Chunk로 묶어 처리하고 있습니다.

 

ItemProcessor

  • Reader에서 읽어온 Item을 데이터 처리하는 역할입니다.
  • Processor 은 배치를 처리하는데 필수 요소는 아니며 Reader, Writer, Processor 처리를 분리하여 각각의 역할을 명확하게 구분하고 있습니다.

 

Spring Boot Batch의 종류

 

Tasklet 방식

  • Batch의 Step 단계에서 '단일한 레코드(Row)'나 '파일' 을 하나의 작업만 처리하는 방식을 의미합니다.
  • 단일 작업이 끝날 때까지 대기해야 하므로, 대량 처리가 필요하지 않을 때 주로 사용됩니다.
  • 일반적으로 비교적 간단한 작업, 예를 들어 파일을 읽고 처리한 다음 결과를 데이터베이스에 쓰는 등의 작업을 수행합니다.

Figure 2. Job Launcher Sequence
Figure 2. Job Launcher Sequence

 

Chunk 방식

Figure 3. Chunk-oriented Processing with Item Processor
Figure 3. Chunk-oriented Processing with Item Processor

  • Batch 의 Step 단계에서 '단일한 레코드(Row)를 묶어서' 여러 작업을 처리하는 방식을 의미합니다.
  • Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다.
  • ItemReader, ItemProcessor, ItemWriter를 사용하여 Chunk 단위로 데이터를 처리합니다. 사전에 해당 내용에 대한 이해가 필요합니다.
  • 대용량 데이터를 효율적으로 처리하며, 병렬 처리 및 페이징 읽기에 적합합니다.

 

글을 정리하며,

이번 글은 이론적인 부분을 정리하려고 노력하였습니다. 이렇게 글자로만 보면 조금 이해가 더딘 부분도 있고, 실제로 업무에서는 어떻게 사용되는지 참고하기에 부족할 수 있다고 생각합니다.

 

다음 게시글에 이어서 실제 개인 프로젝트로 간단한 예제를 만들어 보겠습니다.

 

References

Spring Batch - Reference Documentation

 

Spring Batch - Reference Documentation

If a group of Steps share similar configurations, then it may be helpful to define a “parent” Step from which the concrete Steps may inherit properties. Similar to class inheritance in Java, the “child” Step combines its elements and attributes wit

docs.spring.io

 
Azderica - Spring Batch 개념 잡기

 

[Spring] Spring Batch 개념 잡기 - Azderica

Spring Batch 개념 잡기 스프링 배치에 대한 기본 개념을 잘 이해하지 못하고 있음을 느껴 이에 따라 정리합니다. 정확히는 Spring Rest API와의 정확한 차이를 모른다는 생각이 들었습니다. Spring Batch란

azderica.github.io

 
The Domain Language of Batch

 

The Domain Language of Batch

This section describes stereotypes relating to the concept of a batch job. A Job is an entity that encapsulates an entire batch process. As is common with other Spring projects, a Job is wired together with either an XML configuration file or Java-based co

docs.spring.io

 
히진쓰의 서버사이드 기술 블로그

 

Spring Batch란? 이해하고 사용하기(예제소스 포함)

들어가기 앞서.. Spring Batch에는 굉장히 많은 설정과 기능들이 존재합니다. 해당 포스팅에서는 기초적인 Spring Batch에 대해서 설명하고 사용하는 예제에 대해서 설명을 하려고 합니다. Spring Batch를

khj93.tistory.com

 
기억보다 기록을 블로그

 

1. Spring Batch 가이드 - 배치 어플리케이션이란?

Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시

jojoldu.tistory.com

 

Contributor9 블로그

 

[Java] Spring Boot Batch 이해하고 설정하기 -1 : 정의 및 이해

해당 글에서는 Spring Boot Batch에 대해서 이해하고 주요 용어인 Job, Step, Tasklet, Chunk에 대해서 이해를 돕기 위해서 작성한 글입니다. 1) Spring Boot Batch 💡 Spring Boot Batch 란? - 대량의 데이터를 처리하

adjh54.tistory.com

 

Configuring and Running a Job

 

Configuring and Running a Job

Because the script launching the job must kick off a Java Virtual Machine, there needs to be a class with a main method to act as the primary entry point. Spring Batch provides an implementation that serves this purpose: CommandLineJobRunner. Note that thi

docs.spring.io

 

Configuring a Step

 

Configuring a Step

If a group of Steps share similar configurations, then it may be helpful to define a “parent” Step from which the concrete Steps may inherit properties. Similar to class inheritance in Java, the “child” Step combines its elements and attributes wit

docs.spring.io

 

728x90
반응형