본문 바로가기
Spring/Batch

[Batch] 스프링 배치 개념, 특징과 용어 정리

by 흑시바 2023. 4. 22.

✏️ 배경

처음 고도화를 맡게 된 프로젝트에서는 배치 처리가 @Scheduled를 사용한 단순한 스케줄링이 전부였다.

이러한 단순한 스케줄링에는 여러 가지 문제점이 있었다.

 

1. 처리 도중 문제가 발생하면 모든 데이터가 롤백되어 처음부터 다시 처리해야 된다.

2. 언제 어디서 어떠한 이유로 에러가 발생했는지 알 수 없어서 로그를 추적하기가 어렵다.

3. 배치가 성공 및 실패 여부를 나중에 알게 되어 즉시 반응하기가 어렵다.

 

이러한 문제점을 해결하고자 스프링 배치를 도입했고 기존 배치 서비스를 개선할 수 있었다.

 

스프링 배치 활용하면서 스프링 배치의 유용한 점들을 직접 경험하게 되었고, 다음에 더 잘 활용하기 위해

스프링 배치 기술에 대한 정리 및 학습을 목적으로 Batch 카테고리를 만들게 되었다.

 

🔎 Batch

배치(Batch)는 대량의 반복적인 일련의 작업을 정해진 로직(순서)대로 수행하는 일괄처리하는 것을 의미한다.

보통 다음과 같은 경우에 배치 프로그램을 많이 사용한다.

- 대용량의 비즈니스 데이터를 처리하는 경우
- 특정 시각에 스케줄링을 통해 자동화된 작업을 해야 하는 경우
- 데이터 포맷을 변경, 유효성 검사 등 트랜잭션 안에서 처리 후 기록하는 경우

대표적인 예시로는 급여, 재고 처리, 보고서 생성, 데이터 변환 등이 있다.

🙄 [경험 예시] 필자는 프로젝트에서 매 시간 갱신되는 기상청 데이터를 스케줄링하여 작동 중인 Iot 장치들의 설정 값들을 기상청 데이터의 온도, 습도에 따라 변경해 주는 작업을 배치로 구성했다.

 

🔎 Spring Batch

Spring Batch는 엔터프라이즈 시스템의 일상적인 운영에 필수적인 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크이다.


Spring Batch는 다음과 같은 특징을 가지고 있다.

1. 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기 및 리소스 관리 등 대용량 레코드를 처리하는 데 필수적인 기능을 제공한다.


2. 최적화 및 파티셔닝 기술을 통해 매우 높은 볼륨 및 고성능 배치 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다.

3. 기존 스프링 프레임워크의 기능(의존성 주입, 테스트 도구) 사용이 가능하다.

 

🔎 기본 용어 정리

Job

- 전체 배치 처리 과정을 하나의 단위로 만들어서 표현한 객체

- 여러 Step 인스턴스를 포함하는 컨테이너이다.

JobInstance

- 배치에서 Job이 실행될 때 하나의 Job 실행 단위이다.

- Job을 실행시키면 하나의 JobInstance가 생성된다.

JobParameters

- Job을 실행하는데 사용하는 파라미터의 집합

- Job이 실행되는 동안에 JobInstance의 식별 외에도 매개변수 역할을 한다.

- String, Double, Long, Date 4가지 형식만 지원한다.

JobExecution

- JobInstance에 대한 실행 시도에 대한 객체이다.

- 실행에 대한 JobExecution은 개별로 생성된다.

- JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 가진다.

ExecutionContext

- Job에서 데이터를 공유할 수 있는 데이터 저장소이다.

- JobExecutionContext, StepExecutionContext 2가지 종류가 있으며 지정되는 범위가 다르다.

- JobExecutionContext의 경우 Commit 시점에 저장되지만, StepExecutionContext는 실행 사이에 저장된다.

- ExecutionContext를 통해 Step 간 데이터 공유가 가능하며 Job 실패 시 ExecutionContext를 통한 마지막 실행 값을 재구성할 수 있다.

JobRepository

- 수행되는 Job의 모든 배치 관련 메타데이터 정보를 담고 있는 저장소 역할

- Job이 실행되면 JobRepository에 JobExecution과 StepExecution을 생성하고, JobRepository에서 Execution 정보들을 저장하고 조회하며 사용한다.

JobLauncher

- Job과 JobParameters를 사용하여 Job을 실행하는 객체

Step

- 실질적인 배치 처리를 정의하고 제어할 때 필요한 모든 정보가 들어 있는 도메인 객체

- Job은 최소한 1개 이상의 Step을 가져야 하며, Job의 실제 일괄 처리를 제어하는 모든 정보가 들어있다.

- Tasklet 처리 방식과 Chunk 지향 처리 방식 2가지 지원

Tasklet

- 단순한 데이터 프로세스 처리에 적합한 방식

- 단순한 작업만 하면 되는 경우 (단순한 SQL 실행, 간단한 데이터 변환 등) 사용

- 작업 프로세스의 표준화(Reader -> Processor -> Writer)가 어려운 경우 사용

- 읽기, 처리, 쓰기 작업 단일화 개념

Chunk

- 메모리에서 처리하기에 많은 데이터 들을 효율적으로 처리하는데 적합한 방식

- 일정량의 데이터(Chunk 단위)를 read -> (process) -> write 프로세스 흐름에 따라 표준화하여 작업을 처리한다.

- 한 번에 하나 씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다룬다.

1. Reader에서 데이터를 읽는다.
2. 읽어온 데이터를 Processor에서 가공한다.
3. 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장한다.

StepExecution

- StepExecution은 JobExecution과 동일하게 Step 실행 시도에 대한 객체

- Job이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않음으로 실패 이후 StepExecution은 생성되지 않는다.

- StepExecution 또한 JobExecution과 동일하게 실제 시작이 될 때만 생성된다.

ItemReader

- Step에서 Item을 읽어오는 인터페이스

- 다양한 인터페이스가 존재하여 다양한 방법으로 Item을 읽을 수 있다.

- DB, File, XML, JSON, CSV 등 다양한 형식 지원

ItemWriter

- (Reader 또는 Processor 과정이 끝난) 처리된 데이터를 Write 할 때 사용한다.

- Writer는 처리 결과물에 따라 Insert/Update 또는 Send(Queue)가 될 수 있다.

- 다양한 인터페이스가 존재한다.

- Item을 Chunk로 묶어 처리한다.

ItemProcessor

- Reader에서 읽어온 Item을 데이터를 처리하는 역할

- Processor는 배치를 처리하는데 필수 요소는 아니다.

- Reader, Writer, Processor 처리를 분리하여 각각의 역할을 명확하게 구분하고 있다.

 

REFERENCE

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

 

Spring Batch Introduction

Many applications within the enterprise domain require bulk processing to perform business operations in mission-critical environments. These business operations include: Automated, complex processing of large volumes of information that is most efficientl

docs.spring.io

https://docs.spring.io/spring-batch/docs/current/reference/html/domain.html#job

 

The Domain Language of Batch

To any experienced batch architect, the overall concepts of batch processing used in Spring Batch should be familiar and comfortable. There are “Jobs” and “Steps” and developer-supplied processing units called ItemReader and ItemWriter. However, be

docs.spring.io

 

댓글