[Spring] Spring Batch란?

2025. 9. 28. 07:32·cs/dev
728x90

1. 스프링 배치 소개

개요

배치 처리에 요구하는 재사용 가능한 자바 기반 배치 아키텍처 표준의 필요성이 대두

 

배치 핵심 패턴

  • Read - 데이터베이스, 파일, 큐에서 다량의 데이터 조회한다
  • Process - 특정 방법으로 데이터를 가공한다
  • Write - 데이터를 수정된 양식으로 다시 저장한다

배치 시나리오

  • 배치 프로세스를 주기적으로 커밋
  • 동시 다발적인 Job의 배치 처리, 대용량 병렬 처리
  • 의존관계가 있는 step 여러 개를 순차적으로 처리
  • 조건적 Flow 구성을 통한 체계적이고 유연한 배치 모델 구성
  • 반복, 재시도, Skip 처리

아키텍처

(출처: https://docs.spring.io/spring-batch/docs/4.3.x/reference/html/images/spring-batch-layers.png)

 

Application

  • 스프링 배치 프레임워크를 통해 개발자가 만든 모든 배치 Job과 커스텀 코드를 포함
  • 개발자는 업무로직의 구현에만 집중하고 공통적인 기반기술을 프레임웍이 담당하게 한다

Batch Core(Job 명세서)

  • Job을 실행, 모니터링, 관리하는 API로 구성되어 있다
  • JobLauncher, Job, Step, Flow 등이 속한다

Batch Infrastructure

  • Application, Core 모두 공통 Infrastructure 위에서 빌드한다
  • Job 실행의 흐름과 처리를 위한 틀을 제공함
  • Reader, Processor Writer, Skip, Retry 등이 속한다

 

2. 스프링 배치 시작

프로젝트 구성

https://start.spring.io  에서 생성

스프링 배치 활성화
• @EnableBatchProcessing

스프링 배치가 작동하기 위해 선언해야 하는 어노테이션

  • 총 4개의 설정 클래스를 실행시키며 스프링 배치의 모든 초기화 및 실행 구성이 이루어진다
  • 스프링 부트 배치의 자동 설정 클래스가 실행됨으로 빈으로 등록된 모든 Job 을 검색해서 초기화와 동시에 Job 을 수행하도록 구성됨

스프링 배치 초기화 설정 클래스

1. BatchAutoConfiguration

• 스프링배치가 초기화 될 때 자동으로 실행되는 설정 클래스

• Job 을 수행하는 JobLauncherApplicationRunner 빈을 생성

2. SimpleBatchConfiguration

• JobBuilderFactory 와 StepBuilderFactory 생성
• 스프링배치의 주요 구성 요소 생성-프록시 객체로 생성됨

3. BatchConfigurerConfiguration

• BasicBatchConfigurer

  • SimpleBatchConfiguration 에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스
  • 빈으로 의존성 주입 받아서 주요 객체들을 참조해서 사용할 수 있다

• JpaBatchConfigurer

  • JPA관련 객체를 생성하는 설정 클래스

• 사용자 정의 BatchConfigurer 인터페이스를 구현하여 사용할 수 있음

Job 이 구동되면 Step 을 실행하고 Step 이 구동되면 Taskelt 을 실행하도록 설정함

 

DB스키마 생성 

1.스프링 배치 메타 데이터
  • 스프링 배치의 실행 및 관리를 위한 목적으로 여러 도메인들(Job, Step, JobParameters..) 의 정보들을 저장, 업데이트, 조회할 수 있는 스키마 제공
  •  실행이력과,  성공과 실패 여부 등을 관리해 리스크 발생시 빠른 대처 가능
  • DB 연동 시 메타 테이블이 생성 필수
2.DB 스키마 제공
  • 파일 위치 : /org/springframework/batch/core/schema-*.sql
  • DB 유형별로 제공

( 출처:  https://docs.spring.io/spring-batch/docs/3.0.x/reference/html/metaDataSchema.html  )

 

Job  관련 테이블
•BATCH_JOB_INSTANCE
  • Job 이 실행될 때 JobInstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장
  • 동일한 job_name 과 job_key 로 중복 저장될 수 없다
•BATCH_JOB_EXECUTION
  • job 의 실행정보가 저장되며 Job 생성, 시작, 종료 시간,  실행상태, 메시지 등을 관리
•BATCH_JOB_EXECUTION_PARAMS
  • Job과 함께 실행되는 JobParameter 정보를 저장
•BATCH_JOB_EXECUTION_CONTEXT
  • Job 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
  • Step 간 서로 공유 가능함
Step  관련 테이블
•BATCH_STEP_EXECUTION
  • Step 의 실행정보가 저장되며 생성, 시작, 종료 시간,  실행상태, 메시지 등을 관리
•BATCH_STEP_EXECUTION_CONTEXT
  • Step 의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화 (Json 형식) 해서 저장
  • Step 별로 저장되며 Step 간 서로 공유할 수 없음

 

Job  관련 테이블

•BATCH_JOB_INSTANCE

JOB_INSTANCE_ID 고유하게 식별할 수 있는 기본 키
VERSION 업데이트 될 때 마다 1씩 증가
JOB_NAME Job 을 구성할 때 부여하는 Job 의 이름
JOB_KEY job_name과 jobParameter 를 합쳐 해싱한 값을 저장

 

•BATCH_JOB_EXECUTION

JOB_EXECUTION_ID JobExecution 을 고유하게 식별할 수 있는 기본 키, JOB_INSTANCE 와 일대 다 관계
VERSION 업데이트 될 때마다 1씩 증가
JOB_INSTANCE_ID JOB_INSTANCE 의 키 저장
CREATE_TIME 실행(Execution)이 생성된 시점을 TimeStamp 형식으로 기록
START_TIME 실행(Execution)이 시작된 시점을 TimeStamp 형식으로 기록
END_TIME 실행이 종료된 시점을 TimeStamp으로 기록하며 Job 실행 도중 오류가 발생해서 Job 이 중단된 경우 값이 저장되지 않을 수 있음
STATUS 실행 상태 (BatchStatus)를 저장 (COMPLETED, FAILED, STOPPED…)
EXIT_CODE 실행 종료코드(ExitStatus) 를 저장 (COMPLETED, FAILED…)
EXIT_MESSAGE Status가 실패일 경우 실패 원인 등의 내용을 저장
LAST_UPDATED 마지막 실행(Execution) 시점을 TimeStamp 형식으로 기록

 

•BATCH_JOB_EXECUTION_PARAMS

JOB_EXECUTION_ID JobExecution 식별 키, JOB_EXECUTION 과는 일대다 관계  
TYPE_CD STRING, LONG, DATE, DUBLE 타입정보  
KEY_NAME 파라미터 키 값  
STRING_VAL 파라미터 문자 값  
DATE_VAL 파라미터 날짜 값  
LONG_VAL 파라미터 LONG 값  
DOUBLE_VAL 파라미터 DOUBLE 값  
IDENTIFYING 식별여부 (TRUE, FALSE)  

 

•BATCH_JOB_EXECUTION_CONTEXT

JOB_EXECUTION_ID JobExecution 식별 키, JOB_EXECUTION 마다 각 생성
SHORT_CONTEXT JOB 의 실행 상태정보, 공유데이터 등의 정보를 문자열로 저장
SERIALIZED_CONTEXT 직렬화(serialized)된 전체 컨텍스트

 

Step  관련 테이블

•BATCH_STEP_EXECUTION

STEP_EXECUTION_ID Step 의 실행정보를 고유하게 식별할 수 있는 기본 키
VERSION 업데이트 될 때마다 1씩 증가
STEP_NAME Step 을 구성할 때 부여하는 Step 이름
JOB_EXECUTION_ID JobExecution 기본키, JobExecution 과는 일대 다 관계
START_TIME 실행(Execution)이 시작된 시점을 TimeStamp 형식으로 기록
END_TIME 실행이 종료된 시점을 TimeStamp 으로 기록하며 Job 실행 도중 오류가 발생해서 Job 이 중단된 경우 값이 저장되지 않을 수 있음
STATUS 실행 상태 (BatchStatus)를 저장 (COMPLETED, FAILED, STOPPED…)
COMMIT_COUNT 트랜잭션 당 커밋되는 수를 기록
READ_COUNT 실행시점에 Read한 Item 수를 기록
FILTER_COUNT 실행도중 필터링된 Item 수를 기록
WRITE_COUNT 실행도중 저장되고 커밋된 Item 수를 기록
READ_SKIP_COUNT 실행도중 Read가 Skip 된 Item 수를 기록
WRITE_SKIP_COUNT 실행도중 write가 Skip된 Item 수를 기록
PROCESS_SKIP_COUNT 실행도중 Process가 Skip 된 Item 수를 기록
ROLLBACK_COUNT 실행도중 rollback이 일어난 수를 기록
EXIT_CODE 실행 종료코드(ExitStatus) 를 저장 (COMPLETED, FAILED…)
EXIT_MESSAGE Status가 실패일 경우 실패 원인 등의 내용을 저장
LAST_UPDATED 마지막 실행(Execution) 시점을 TimeStamp 형식으로 기록

 

•BATCH_STEP_EXECUTION_CONTEXT

STEP_EXECUTION_ID StepExecution 식별 키, STEP_EXECUTION 마다 각 생성
SHORT_CONTEXT STEP 의 실행 상태정보, 공유데이터 등의 정보를 문자열로 저장
SERIALIZED_CONTEXT 직렬화(serialized)된 전체 컨텍스트

 

3. 스프링 배치 도메인 이해

  • 도메인 이해 – JobInstance, JobExecution, StepExecution, ExecutionContext, JobParameter, JobRepository, JobLauncher

Job

Job

기본 개념

  • 배치 계층 구조의 최상위 개념, 하나의 배치 작업을 의미
  • Job Configuration을 통해 생성되는 배치 작업 정의 객체
  • 여러 Step을 포함하는 컨테이너 (최소 1개 이상의 Step 필요)
 
기본 구현체
 
•SimpleJob(표준 기능)
  • 순차적으로 Step 을 실행시키는 Job
•FlowJob
  • 특정한 조건과 흐름에 따라 Step 을 구성하여 실행시키는 Job

JobInstance

기본 개념

• Job이 실행될 때 생성되는 Job의 논리적 실행 단위 객체로서 고유하게 식별 가능한 작업 실행을 나타냄

• Job의 설정과 구성은 동일하지만 Job이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job의 실행을 구분해야 함

  • 예를 들어 하루에 한 번 씩 배치 Job이 실행된다면 매일 실행되는 각각의 Job 을 JobInstance 로 표현합니다.

JobInstance 생성 및  실행

• 새 Job + JobParameter → 새로운 JobInstance 생성

• 동일 Job + JobParameter → 기존 JobInstance 재사용

  •  내부적으로 JobName + jobKey (jobParametes 의 해시값) 를 가지고 JobInstance 객체를 얻음

• Job 과는 1:M 관계

 

BATCH_JOB_INSTANCE 테이블과 매핑

• JOB_NAME (Job) 과 JOB_KEY (JobParameter 해시값) 가 동일한 데이터는 중복해서 저장할 수 없음

JobParameters

기본 개념

•Job을 실행할 때 함께 포함되어 사용되는 파라미터를 가진 도메인 객체
•하나의 Job에 존재할 수 있는 여러개의 JobInstance를 구분하기 위한 용도
•JobParameters와 JobInstance는 1:1 관계
 
생성 및 바인딩
•어플리케이션 실행 시 주입
  • Java -jar LogBatch.jar requestDate=20210101
•코드로 생성
  • JobParameterBuilder, DefaultJobParametersConverter
•SpEL 이용
  • @Value(“#{jobParameter[requestDate]}”), @JobScope, @StepScope 선언 필수
BATCH_JOB_EXECUTION_PARAM 테이블과 매핑
•JOB_EXECUTION 과 1:M 의 관계

 

JobExecution

기본 개념
•JobIstance 에 대한 한번의 시도를 의미하는 객체로서 Job 실행 중에 발생한 정보들을 저장하고 있는 객체
  • 시작시간, 종료시간 ,상태(시작됨,완료,실패),종료상태의 속성을 가짐
•JobIstance 과의 관계
  • JobExecution은 'FAILED' 또는 'COMPLETED‘  등의 Job의 실행 결과 상태를 가지고 있음
  • JobExecution 의 실행 상태 결과가 'COMPLETED’ 면 JobInstance 실행이 완료된 것으로 간주해서 재실행이 불가함
  • JobExecution 의 실행 상태 결과가 'FAILED’ 면 JobInstance 실행이 완료되지 않은 것으로 간주해서 재실행이 가능함
    • JobParameter 가 동일한 값으로 Job 을 실행할지라도 JobInstance 를 계속 실행할 수 있음
  • JobExecution 의 실행 상태 결과가 'COMPLETED’ 될 때까지 하나의 JobInstance 내에서 여러 번의 시도가 생길 수 있음
BATCH_JOB_EXECUTION 테이블과 매핑
•JobInstance 와 JobExecution 는 1:M 의 관계로서 JobInstance 에 대한 성공/실패의 내역을 가지고 있음

 

Step

기본 개념
•Batch job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 모든 정보를 가지고 있는 도메인 객체
•단순한 단일 태스크 뿐 아니라 입력과 처리 그리고 출력과 관련된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
•배치작업을 어떻게 구성하고 실행할 것인지 Job 의 세부 작업을 Task 기반으로 설정하고 명세해 놓은 객체
•모든 Job은 하나 이상의 step으로 구성됨

 

기본 구현체
•TaskletStep
  • 가장 기본이 되는 클래스로서 Tasklet 타입의 구현체들을 제어한다
•PartitionStep
  • 멀티 스레드 방식으로 Step 을 여러 개로 분리해서 실행한다
•JobStep
  • Step 내에서 Job 을 실행하도록 한다
•FlowStep
  • Step 내에서 Flow 를 실행하도록 한다

 

StepExecution

기본 개념
•Step 에 대한 한번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
  • 시작시간, 종료시간 ,상태(시작됨,완료,실패), commit count, rollback count 등의 속성을 가짐
•Step 이 매번 시도될 때마다 생성되며 각 Step 별로 생성된다
•Job 이 재시작 하더라도 이미 성공적으로 완료된 Step 은 재 실행되지 않고 실패한 Step 만 실행된다
•이전 단계 Step이 실패해서 현재 Step을 실행하지 않았다면 StepExecution을 생성하지 않는다. Step이 실제로 시작됐을 때만 StepExecution을 생성한다
•JobExecution 과의 관계
  • Step의 StepExecution 이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료된다
  • •Step의 StepExecution 중 하나라도 실패하면 JobExecution 은 실패한다
BATCH_STEP_EXECUTION 테이블과 매핑
•JobExecution 와 StepExecution 는 1:M 의 관계
•하나의 Job 에 여러 개의 Step 으로 구성했을 경우 각 StepExecution 은 하나의 JobExecution 을 부모로 가진다

 

StepContribution

기본 개념
•청크 프로세스의 변경 사항을 버퍼링 한 후 StepExecution 상태를 업데이트하는 도메인 객체
•청크 커밋 직전에 StepExecution 의 apply 메서드를 호출하여 상태를 업데이트 함
•ExitStatus 의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 적용 할 수 있음

 

구조

•성공적으로 read한 아이템 수
•성공적으로 write한 아이템 수
•ItemProcessor 에 의해 필터링된 아이템 수
•부모 클래스인 StepExecution 의 총 skip 횟수
•read에 실패해서 스킵된 횟수
•write에 실패해서 스킵된 횟수
•process에 실패해서 스킵된 횟수
•실행결과를 나타내는 클래스로서 종료코드를 포함(UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED)
•StepExecution 객체 저장
 

JobRepository

기본 개념
•배치 작업 중의 정보를 저장하는 저장소 역할
•Job이 언제 수행되었고, 언제 끝났으며, 몇 번이 실행되었고 실행에 대한 결과 등의 배치 작업의 수행과 관련된 모든 meta data 를 저장함
•JobLauncher, Job, Step 구현체 내부에서 CRUD 기능을 처리함

 

JobLanuncher

기본개념
•배치 Job 을 실행시키는 역할을 한다
•스프링 부트 배치가 구동이 되면 JobLauncher 빈이 자동 생성 된다
•Job 실행
  • JobLanucher.run(Job, JobParameters)
  • 동기적 실행(SyncTaskExecutor, 기본값)
    • JobExecution 을 획득하고 배치 처리를 최종 완료한 이후 Client 에게 JobExecution 을 반환
    • 스케줄러에 의한 배치처리에 적합
  • 비동기적 실행(SimpleAsyncTaskExecutor )
    • JobExecution 을 획득한 후 Client 에게 바로 JobExecution 을 반환하고 배치처리를 완료한다
    • HTTP 요청에 의한 배치처리에 적합
구조

 

4. 스프링 배치 청크 프로세스

Chunk

  • Chunk 란 여러 개의 아이템을 묶은 하나의 덩어리(Block)
  • 한번에 하나씩 아이템을 입력 받아 Chunk 단위의 덩어리로 만든 후 Chunk 단위로 트랜잭션을 처리함, 즉 Chunk 단위의 Commit 과 Rollback 이 이루어짐
  • 일반적으로 대용량 데이터를 한번에 처리하는 것이 아닌 청크 단위로 쪼개어서 더 이상 처리할 데이터가 없을 때까지 반복해서 입출력하는데 사용됨
4개의 item을 chunk에 저장
  • Chunk<I> vs Chunk<O>
    • Chunk<I> 는 ItemReader 로 읽은 하나의 아이템을 Chunk 에서 정한 개수만큼 반복해서 저장하는 타입
    • Chunk<O> 는 ItemReader 로부터 전달받은 Chunk<I> 를 참조해서 ItemProcessor 에서 적절하게 가공, 필터링한 다음 ItemWriter 에 전달하는 타입

 

아키텍처

5. 스프링 배치 멀티 스레드 프로세싱

스프링 배치 스레드 모델
• 스프링 배치는 기본적으로 단일 스레드 방식으로 작업을 처리한다
• 성능 향상과 대규모 데이터 작업를 위한 비동기 처리 및. Scaleout기능을 제공한다

• Local 과 Remote 처리를 지원한다

 

1. AsyncItemProcessor / AsyncItemWriter

• ItemProcessor 에게 별도의 스레드가 할당되어 작업을 처리하는 방식

 

2. Multi-threaded Step

• Step 내 Chunk 구조인 ItemReader, ItemProcessor, ItemWriter 마다 여러 스레드가 할당되어 실행 하는 방법

 

3. Remote Chunking

• 분산환경처럼 Step 처리가 여러 프로세스로 분할되어 외부의 다른 서버로 전송되어 처리하는 방식

 

4. Parallel Steps

• Step 마다 스레드가 할당되어 여러개의 Step을 병렬로 실행하는 방법

 

5. Partitioning

• Master/Slave 방식으로서 Master 가 데이터를 파티셔닝 한 다음 각 파티션에게 스레드를 할당하여 Slave 가 독립적으로 작동하는 방식

 

참고자료

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard

 

 

 

728x90
반응형

'cs > dev' 카테고리의 다른 글

[DB]파티셔닝? 샤딩? 레플리케이션? (partitioning? sharding? replication?)  (0) 2025.10.16
[CS]RDB단점과 NoSQL이란?  (0) 2025.10.16
[CS]프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍까지  (0) 2025.09.27
2022년 한이음 ICT 멘토링 후기 [공공데이터를 이용한 마이데이터 서비스 개발]  (0) 2025.09.26
2022년 한이음 ICT 멘토링 후기[챗봇을 활용한 학사관리 시스템 구축]  (0) 2025.09.26
'cs/dev' 카테고리의 다른 글
  • [DB]파티셔닝? 샤딩? 레플리케이션? (partitioning? sharding? replication?)
  • [CS]RDB단점과 NoSQL이란?
  • [CS]프로세스, 스레드, 멀티태스킹, 멀티스레딩, 멀티프로세싱, 멀티프로그래밍까지
  • 2022년 한이음 ICT 멘토링 후기 [공공데이터를 이용한 마이데이터 서비스 개발]
lakedata
lakedata
lakedata 님의 블로그 입니다.
  • lakedata
    lakedata 님의 블로그
    lakedata
  • 전체
    오늘
    어제
    • 분류 전체보기 (188)
      • cs (82)
        • dev (28)
        • sec (29)
        • ops (25)
      • 자격증 (32)
        • 정보처리기사 (20)
        • 정보보안기사 (1)
        • aws dva (6)
        • aws dop (2)
      • IT서적 (27)
        • 클린아키텍처 (10)
        • 객체지향의사실과오해 (7)
        • 오브젝트 (10)
      • 코테 (42)
        • 알고리즘 (20)
        • 백준 (13)
        • 프로그래머스 (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    AWS
    docker
    SQL
    Java
    알고리즘
    CS
    Spring
    Security
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
lakedata
[Spring] Spring Batch란?
상단으로

티스토리툴바