본문 바로가기

Spring

[Spring Batch] Batch 이해하기

스프링 배치에 대해 공부하기 전, Spring Web MVC를 공부하며 항상 궁금했던 것이 있었다. 웹은 클라이언트와 서버 간 핸드셰이크 과정을 거쳐 통신하며, 클라이언트의 요청으로 서버는 클라이언트에게 필요한 데이터를 전달한다. 그럼 클라이언트의 요청이 없는 작업의 경우, 예를 들어 '특정시간에 통계 데이터를 만든다던가', '대용량의 데이터를 처리해야하던가' 등, 해당 작업을 진행하기 위해서는 관리자가 매번 개입하여 작업을 처리하도록 서버에 요청을 보내야 하는 것일까? 이러한 작업을 웹 방식으로 구현한다면 해당 작업을 처리하는 시간동안 다른 사람의 요청은 처리하지 못해 비효율적일 것이다. 그러나 위의 작업은 스프링 배치로 해결이 가능했다.  배치에 대해 공부하며 학습한 내용들을 이번 블로그에 정리해 보려고 한다.

 

패스트 캠퍼스 강의를 참고하며 학습하였습니다.


1. 배치 프로세싱이란?

배치프로세싱은 '일괄처리' 라는 뜻으로, 여러 작업들을 미리 정해진 로직에 따라 순서대로 처리하는 것을 말한다. 배치 프로세싱은 사용자의 실시간 요청에 따라서 처리되는 방식이 아니다. 사용자의 개입 없이 특정한 시점에 대용량의 데이터를 다루어야 하거나, 주기적으로 처리해야 되는 작업들이 배치 작업에 해당한다. 배치 작업의 수행 주기에 따라서 구분할 수도 있다. 연말정산, 결제 정산 작업과 같은 정기배치, 푸시알림과 같은 특정 조건이 충족했을 때 발생하는 이벤트성 배치, 사용자 요청 시 수행되는 On-Demand 배치 등이 있다.

 

 

2. 배치는 언제 사용하는 것일까?

배치프로그램은 여러 작업을 빠르고 효율적으로 처리해야할 때 주로 사용한다. 해야할 작업을 자동화하여 사용자의 시간과 노력을 줄일 수 있고, 대용량의 데이터를 관리할 때 안전성을 보장할 수 있기 때문에 적절하다.

  • 대용량 데이터 : 대량의 데이터를 가져오거나, 전달하거나, 계산하는 등의 처리를 할 수 있어야 한다.
  • 자동화 : 심각한 오류가 발생하는 상황을 제외하고는 사용자 개입 없이 실행되어야 한다.
  • 견고성 : 잘못된 데이터를 충돌/중단 없이 처리할 수 있어야 한다.
  • 신뢰성 : 오류 발생 시에 무엇이 잘못되었는지 위치나 시간 등을 추척할 수 있어야한다.
  • 성능 : 지정한 시간 안에 처리가 완료되어야 하고, 동시에 실행되는 다른 애플리케이션을 방해하지 않도록 수행되어야 한다.

3. Spring Batch

Spring Batch는 엔터프라이즈 시스템의 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크이다. 로그관리, 추적, 트랜잭션 관리, 작업처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등의 기능을 제공하고 Spring의 특성을 그대로 가져왔기 때문에 DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있다. Spring Batch는 배치 작업이 실패했을 경우 실패한 지점에서 부터 재실행하고, 중복된 데이터의 처리 경우 예외를 발생시키며 리소스 낭비를 막는다.

※ Spring Batch와 Quartz를 같이 사용하는데 Batch는 대용량 데이터의 배치 처리에 관한 기능을 지원하고, Quartz는 스케줄러의 기능을 지원한다. 

  ▷ Batch - Batch Job을 관리하는 역할

  ▷ Quartz - Batch Job을 실행시키는 역할

 

4. Spring Batch의 3가지 레이어

Application : 개발자가 작성한 모든 배치 작업과 사용자 정의 코드 포함

Batch Core : 배치 작업을 시작하고 제어하는데 필요한 핵심 런타임 클래스 포함(Job, Step, JobLauncher, JobParameters)

Batch Infrastructure : 개발자와 어플리케이션에서 사용하는 일반적인 Reader Writer(File, DB)

 

5. Spring Batch Job 구성 및 개념

https://www.techgeeknext.com/spring-boot/spring-batch-architecture

1. Job

  • 처음부터 끝까지 독립적으로 실행할 수 있으며 고유하고 순서가 지정된 여러 스텝들의 모음
  • 배치 처리과정을 하나의 단위로 만들어 놓은 것을 말한다.

2. JobInstance

  • Job의 실행단위로, 하나의 Job을 실행할 때 JobInstance가 생성된다.
  • 해당 인스턴스는 같은 Job에 한해서(JobParameters로 구분) 하나만 생성이 되기 때문에 이미 처리한 인스턴스는 다시 처리되지 않는다. 
  • Job 실행에 실패하면 재실행

3. JobParameters

  • JobInstance를 구별할 때 사용
  • String, Double, Long, Date 4가지 형식을 지원한다. 그외의 형식은 지원하지 않는다.

4. JobExecution

  • JobInstance에 대한 실행 시도에 대한 객체
  • 실패하여 재실행 시킨 경우 동일한 JobInstance나 2번 실행에 대한 JobExcution은 개별로 생기게 된다.
  • JobInstance는 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담는다.

5. Step

  • 배치 처리를 정의하고 제어하는 독립된 작업의 단위로 Job의 각 단계를 의미

Tasklet 기반

→ 간단히 정의한 하나의 작업만을 처리

Chunk 기반

→ 한번에 하나씩 데이터를 읽고(Chunk Size 만큼) chunk를 만든 후 chunk 단위로 트랜잭션을 처리

6. StepExecution

  • Step 실행 시도에 대한 객체
  • 이전 단계의 Step이 실패하면 StepExecution은 생성되지 않는다.
  • 실제 시작이 될 때만 생성된다.
  • StepExecution JobExecution 저장되는 정보 외에 read , write , commit , skip 등의 정보들이 저장된다.

7. ExecutionContext

  • Job에서 데이터를 공유할 수 있는 데이터 저장소
  • Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지 종류가 있으나 이 두가지는 지정되는 범위가 다르다.
  • JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExcutionContext는 실행 사이에 저장이 되게 된다.
  • ExecutionContext 통해 Step Data 공유가 가능하며 Job 실패시 ExecutionContext 통한 마지막 실행 값을 재구성할 있다.

8. JobRepository

  1. Job을 처음 실행하면 BATCH_JOB_INSTANCE에 저장되게 된다
  2. Job의 실제 실행 기록은 BATCH_JOB_EXECUTION에 저장
  3. BATCH_JOB_EXECUTION_CONTEXT -> 배치를 여러번 수행할 때 유용하게 사용할 수 있다.
  4. BATCH_JOB_EXECUTION_PARAMS -> JOB이 매번 실행될때마다 실행된 잡 파라미터의 정보를 저장

※기본적으로는 RDB환경에서 구성이 되지만, 테스트 환경에서 사용할 수 있는 인메모리 방식도 존재한다.

9. JobLauncher

  • JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체
  • job 현재 스레드에서 수행할지, 스레드 풀을 이용할지, job 수행할 필요로하는 파라미터는 유효한지 이러한 작업들도 함께 실행 

10. ItemReader

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

11. ItemWriter

  • 처리된 Data를 Write할 때 사용한다.
  • 처리 결과물에 따라 Insert, Update, Queued의 Send 등이 될 수 있다.
  • 기본적으로 Item Chunk 묶어 처리하고 있다.

12. ItemProcessor

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

참고하면 좋은 사이트

 

Batch Processing Operating System - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

[Spring] Spring Batch 개념 잡기 - Azderica

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

azderica.github.io

 

Spring Batch Architecture

Spring Batch architecture acting as a base for TERASOLUNA Server Framework for Java (5.x) is explained. What is Spring Batch Spring Batch, as the name implies is a batch application framework. Following functions are offered based on DI container of Spring

terasoluna-batch.github.io