본문 바로가기
Spring/Batch

[Spring] Spring Batch란?

by 기몬식 2023. 12. 18.

최근 회사 프로젝트에서 스프링 배치를 활용하여 모바일 Push 알림 관련 배치/온라인 작업을 진행했습니다.
비교적 간단한 작업이라 큰 어려움은 없었지만 처음 사용해보는 스킬이기 때문에 공부용으로 해당 글을 작성하게 됐습니다.

Batch Application

배치 애플리케이션이란 대량의 데이터를 처리하거나 반복적인 작업을 수행하는 목적을 가지는 애플리케이션을 의미합니다.
주기적으로 반복 되는 작업을 자동으로 수행하며 일련의 단계로 구성되어 있는 작업들을 수행합니다.

위와 같은 작업들은 배치 애플리케이션으로 따로 분리해서 관리해야 하는데는 다음과 같은 중요한 이유가 있습니다.

 

일반적으로 사용되는 웹 애플리케이션은 실시간으로 사용자와 상호 작용 하기 위한 비즈니스 로직들을 수행합니다. 이를 위해 네트워크 I/O, 데이터베이스 I/O 또는 외부 서비스로부터의 I/O 등의 작업을 수행하며 서버는 리소스를 사용하는데 이 때 대용량 데이터 처리와 같은 고비용의 배치 작업을 진행하게 된다면 서버는 정상적으로 동작하기 어려워 집니다. 작업 성격이 상이합니다. 웹 애플리케이션은 비즈니스 로직에 최적화하여 응집도 높은 서비스를 제공해야합니다. 즉 효율적인 비즈니스 로직을 처리하며 사용자에게 빠른 응답을 제공합니다.

 

하지만 배치 애플리케이션은 비즈니스 로직에 최적화하여 대용량 데이터를 일괄적으로 작업(Batch)하는데 중점을 둡니다. 때문에 응답 시간은 상대적으로 중요하지 않으며 데이터 처리에 대한 안정성과 성능이 요구됩니다. 또한 대용량 데이터 처리, 시스템 간 데이터 전송 등 배치 애플리케이션은 다양한 업무 분야에서 사용되기 때문에 배치 애플리케이션을 구성할 때는 고려해야 하는 몇 가지 중요한 조건들이 있습니다.
아래는 일반적으로 배치 애플리케이션을 설계할 때 고려해야 하는 조건들입니다.


  1. 대용량 데이터 처리: 배치 애플리케이션은 데이터를 가져오거나, 전달하거나, 계산하는 등의 대용량 데이터를 처리하는데 특화 되어야 합니다.
  2. 자동화: 배치 애플리케이션은 스케줄링을 통해 자동으로 동작하며 오류가 발생했을 때 이를 감지하고 적절한 조치를 취할 수 있도록 오류 처리 및 복구 기능에 대한 자동화 메커니즘을 제공해야합니다. 시스템의 치명적인 문제 해결을 제외하곤 사용자의 개입 없이 자동으로 실행 되어야 합니다.
  3. 성능: 배치 애플리케이션은 지정한 시간 안에 처리를 완료하거나 다른 애플리케이션에 영향을 주지 않도록 수행되어야 하기 때문에 대용량 데이터를 효율적으로 처리할 수 있도록 설계 되어야 합니다.
  4. 신뢰성: 배치 애플리케이션은 실행되는 동안의 상태와 로그를 모니터링할 수 있어야 합니다. 이를 통해 문제 발생 시 빠르게 대응할 수 있어야 합니다.

Spring Batch

위에서 배치 애플리케이션이 무엇인지, 왜 필요한지, 어떤 조건을 가지고 있는지를 알아봤습니다.
그렇다면 위와 같은 조건을 만족하는 스프링에서 제공하는 배치 애플리케이션 프레임워크인 스프링 배치에 대해 알아 보겠습니다.

Architecture

먼저 스프링 배치는 장성과 다양한 사용자 그룹을 위해 위와 같이 주요 세가지 컴포넌트로 구성 되어 있는 계층형 아키텍처로 설계되었습니다. Application 계층은 모든 배치 작업(job)과 사용자 정의 코드가 포함되어 있습니다. Batch Core 계층은 배치 작업을 실행하고 제어하는데 필요한 핵심 런타임 클래스가 포함되어 있습니다. JobLauncher, Job 및 Step에 대한 구현이 포함되며 Application과 Core 계층은 모두 공통 Infrastructure 위에 구축됩니다.
마지막으로 Infrastructure 계층은 배치 작업의 실행, 관리, 모니터링 등과 관련된 기능을 담당합니다. 또한 ItemReaderItemWriter와 같은 애플리케이션 개발자들이 직접 사용하는 공통 서비스가 포함되어 있습니다.

Domain Language

스프링 배치는 기본적으로 Job과 Step으로 구성되어 있습니다. Job과 Step 외로 배치 작업이 실행되기 위해 구성 되는 주요 인스턴스도 살펴 보겠습니다.

Job

Job은 하나의 배치 작업 단위를 나타내는 용어로 특정한 비즈니스 로직이나 프로세스를 실행하는데 사용됩니다.
단순한 Step 인스턴스의 컨테이너 개념으로 여러 개의 Step 으로 구성될 수 있습니다. 작업의 흐름따라 논리적으로 Step을 실행시키고 실패 시 Step을 재시작시키는 것과 같은 모든 구성을 정의합니다.

JobInstance

JobInstance는 Job 의 논리적인 실행을 추상화한 인스턴스입니다. 모든 Job은 각 실행에 대한 JobInstance를 생성하며 메타데이터를 저장합니다. 이로써 각각의 Job은 독립적으로 추적되고 실행에 대한 성공 또는 실패에 대한 메타 데이터를 확인할 수 있습니다.

JobParameters

JobParameters는 Job 실행에 전달 되는 파라미터를 표현하는 인스턴스로 JobInstance에 대해 고유한 값을 가지며 해당 JobInstance의 실행을 식별하는데 사용됩니다. 즉 동일한 Job을 여러 번 실행할 때 각각의 실행을 구분하기 위해 사용하는 메커니즘으로 Job과 JobParameters를 통해 JobInstance를 식별합니다. 하지만 모든 JobParameters가 JobInstacne를 식별하기 위해 사용되지 않습니다. 하지만 단순 매개변수로서 사용하는 것 또한 허용합니다.

JobExecution

JobExecution은 특정 JobInstance의 실행됨을 나타내기 위한 인스턴스입니다. 각 JobExecution은 실행된 특정 JobInstance를 추적하고 해당 실행의 성공 또는 실패와 같은 메타데이터를 포함합니다. 이후 메타데이터는 JobRepository에 저장되고 관리되며 배치 작업의 실행 이력과 관련된 정보를 추적하는데 사용됩니다.

다음은 JobExecution에서 괸리하는 주요 메타데이터에 대한 설명입니다.


  • status: 배치 작업의 실행 상태를 나타내는 BatchStatus 객체입니다. STARTED, FAILED, COMPLETED와 같은 속성을 가지고 있습니다.
  • startTime: 실행이 시작된 현재 시스템 시간을 나타냅니다. 작업이 아직 시작되지 않은 경우 이 필드는 비어 있습니다.
  • endTime: 성공 여부에 관계없이 실행이 완료된 현재 시스템 시간을 나타냅니다. 작업이 아직 완료되지 않은 경우 필드는 비어 있습니다.
  • exitStatus: 실행 결과를 나타냅니다. 호출자에게 반환되는 종료 코드가 포함되어 있으며 작업이 아직 완료되지 않은 경우 필드는 비어 있습니다.
  • createTime: JobExecution이 생성된(persisted) 현재 시스템 시간을 나타냅니다.
  • lastUpdated: JobExecution이 마지막으로 업데이트(persisted) 된 시간을 나타냅니다. 작업이 아직 시작되지 않은 경우 이 필드는 비어 있습니다.
  • executionContext: 실행 간에 유지되어야 하는 사용자 데이터가 포함된 "속성 모음"입니다.
  • failureExceptions: 작업 실행 중에 발생한 예외 목록입니다.

Step

Step은 Job의 각 실행 단위를 나타냅니다. 일반적으로 하나의 Step은 특정한 처리를 담당하며 Job이 실행될 때 이러한 Step들이 순차적으로 실행됩니다. 각 Step은 특정한 비즈니스 로직을 담당하여 구성되며 이런 Step들을 조합하여 복잡한 배치 작업을 효과적으로 처리할 수 있도록 지원합니다. 이러한 구조를 통해 배치 잡을 모듈화하고 각각의 단계를 재사용하거나 수정하기 쉽게 만듭니다.

StepExecution

StepExecution는 Step를 실행하려는 단일 시도를 나타냅니다. JobExecution과 유사하게 Step이 실행될 때마다 새로운 StepExecution이 생성 되며 만약 이전 Step이 실패하여 StepExecution이 생성되지 않을 경우에는 지속 되지 않습니다.
StepExecution은 해당 Step과 JobExecution에 대한 참조와 커밋 및 롤백 횟수, 시작 및 종료 시간과 같은 트랜잭션 관련 데이터가 포함됩니다. 또한 각 StepExecution에는 다시 시작하는데 필요한 통계 또는 상태 정보와 같은 모든 메타데이터가 포함되어 있습니다.

다음은 StepExecution에서 괸리하는 주요 메타데이터에 대한 설명입니다.


  • status: 실행 상태를 나타내는 BatchStatus 객체입니다. STARTED, FAILED, COMPLETED와 같은 속성을 가지고 있습니다.
  • startTime: 실행이 시작된 현재 시스템 시간을 나타냅니다. 단계가 아직 시작되지 않은 경우 이 필드는 비어 있습니다.
  • endTime: 성공 여부에 관계없이 실행이 완료된 현재 시스템 시간을 나타냅니다. Step이 아직 종료되지 않은 경우 이 필드는 비어 있습니다.
  • exitStatus: 실행 결과를 나타냅니다. 호출자에게 반환되는 종료 코드가 포함되어 있으며 작업이 아직 완료되지 않은 경우 필드는 비어 있습니다.
  • executionContext: 실행 간에 유지되어야 하는 사용자 데이터가 포함된 "속성 모음"입니다.
  • readCount: 성공적으로 읽은 아이템의 수입니다.
  • writeCount: 성공적으로 작성된 아이템의 수입니다.
  • commitCount: 이 실행을 위해 커밋된 트랜잭션 수입니다.
  • rollbackCount 단계에서 제어하는 비즈니스 트랜잭션이 롤백된 횟수입니다.
  • readSkipCount: 아이템 읽기가 실패하여 스킵된 수입니다.
  • processSkipCount: 아이템 프로세스가 실패하여 스킵된 수입니다.
  • filterCount: ItemProcessor에 의해 필터된 아이템 수입니다.
  • writeSkipCount: 아이템 쓰기가 실패하여 스킵된 수입니다.

ExecutionContext

ExecutionContext는 배치 작업과 관련된 JobExecution 또는 StepExecution에 저장된 메타 데이터를 저장하고 공유하는데 사용됩니다. ExecutionContext을 통해 각 Step이 실행되는 동안 데이터를 유지하고 다른 Step과 정보를 공유할 수 있습니다. 또한 배치 작업의 각 Stepd의 상태를 유지하고 싶을 때도 사용되는데 예를 들어, 어떤 작업이 중간에 실패했을 때 ExecutionContext을 사용하여 해당 Step이나 Job의 실행 상태를 기록하고 나중에 이를 확인할 수 있습니다.

JobRepository

배치 작업의 메타데이터를 저장하고 실행 상태를 추적하며 이력을 관리하는 중요한 Infrastructure 컴포넌트입니다. JobLauncher, Job 및 Step 구현을 위한 CRUD 작업을 제공하며 Job이 처음 시작되면 저장소에서 JobExecution을 가져옵니다. 또한 실행 과정에서 StepExecution 및 JobExecution 구현은 저장소에 전달되어 유지됩니다.

JobLauncher

JobLauncher는 Job을 실행하기 위해 제공되는 인터페이스로 배치 잡을 시작하는데 필요한 Job과 JobParameters를 받아 실행 시키고 JobExecution 객체를 반환하여 실행 상태와 결과를 확인할 수 있습니다.

public interface JobLauncher {

public JobExecution run(Job job, JobParameters jobParameters)
            throws JobExecutionAlreadyRunningException, JobRestartException,
                   JobInstanceAlreadyCompleteException, JobParametersInvalidException;
}

이미지 출처


오탈자 및 오류 내용을 댓글 또는 메일로 알려주시면, 검토 후 조치하겠습니다.

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

[Spring] Spring Batch Job 등록부터 실행까지(1)  (1) 2024.01.22
[Spring] Spring Batch 시작하기 01  (1) 2024.01.14