개발 지식

Spring batch 알아보기

HeoN97 2023. 12. 14. 17:39

Spring batch


  • 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크입니다.
  • 여기서 Batch는 "일괄처리"라는 뜻을 가지고 있다고 생각하면 됩니다.
  •  특징
    • Transaction 관리
    • 시작 / 멈춤 / 재시작
    • 재시도 / 건너뛰기
    • Chunk 기반 처리
    • 대용량 데이터 처리
  • 구조

Spring Docs - Spring Batch Layered Architecture

  • Application - 개발자가 작성한 모든 배치 작업과 사용자 정의 코드
  • Batch Core - 배치 작업을 시작하고 제어하는 데 필요한 핵심 런타임 클래스
  • Batch Infrastructure - 개발자와 Application에서 사용하는 일반적인 Reader와 Writer, RetryTemplate와 같은 서비스
  • 사용
    • 큰 단위의 작업을 일괄 처리할 때
    • 특정 시간에 데이터를 처리하고 싶을 때 ( 스케줄러 )
스케줄러 ( Scheduler )
 - 일정한 시간 간격 또는 시각에 특정 로직을 돌리기 위해 사용하는 것
 - 스케줄러의 역할을 수행할 때 Batch를 이용합니다.
  • 주의 사항
    • 별 다른 옵션없이 실행하게 되면, 모든 Batch Job이 실행된다.
    • 보통의 경우 모든 Job을 한 번에 실행하지 않기 때문에 실행하려는 특정 Job name만 설정값으로 넣어 실행한다.

 

 

 

관련 용어


Job

  • 전체 배치 처리 과정을 추상화한 개념입니다.
  • 하나 또는 그 이상의 Step을 포함하고 있으며, Spring Batch 계층에서 가장 상위에 위치합니다.
  • 각 Job은 고유의 이름을 가지며, 이 이름은 실행에 필요한 파라미터와 함께 JobInstance를 구별하는데 사용합니다.

 

JobInstance

  • 특정 Job의 실제 실행 인스턴스를 의미합니다.
  • "매일 아침 8시에 실행"하는 Job이 있을 경우, 매일 실행할 때 마다 새로운 JobInstance 생성
  • (1월 1일 JobInstance, 1/2일 JobInstance ...)
  • 한번 생성된 JobInstance는 해당 날짜의 데이터를 처리하는 데 사용되며, 실패한 경우 같은 JobInstance를 다시 실행 하여 작업을 완료합니다.

 

JobParameters

  • JobInstance를 생성하고 구별하는 데 사용되는 파라미터입니다.
  • Job이 실행될 때 필요한 파라미터를 요구하며, JobInstance를 구별하는 역할도 합니다.
  • Spring batch에서는 4가지 타입 - String, Double, Long, Date을 지원합니다.

 

JobExecution

  • JobInstance의 한 번의 시행 시도를 나타냅니다.
  • 만약에 A라는 JobInstance가 실행하다 실패했을 때 재시도하면, A에 새로운 JobExecution이 생성됩니다.
  • 여기에는 실행 상태, 시작시간, 종료시간, 생성시간 등 JobInstance의 실행에 대한 세부정보가 담깁니다.

 

 

Step

  • Step은 Job의 하위 단계로서 실제 배치 처리 작업이 이루어지는 단위
  • 하나 이상의 Step으로 Job이 구성되며, 각 Step은 순차적으로 처리됩니다.
  • ItemReader, ItemProcessor, ItemWriter를 사용하는 Chunk 방식 또는 Tasklet 하나를 가질 수 있다.

 

StepExecution

  • Step의 한 번의 실행을 나타내며, Step의 정보( 실행 상태, 실행 정보 등)를 포함합니다.
  • JobExecution과 유사하며, 각 Step의 실행 시도마다 새로운 StepExecution이 생성됩니다.
  • 읽은 아이템 수, 쓴 아이템의 수, 커밋 횟수, 스킵한 아이템의 수 등 실행에 대한 상세 정보도 포함합니다.

 

 

ItemReader

  • 배치 작업에서 처리할 아이템을 읽어오는 역할을 담당합니다.
  • 여러 형식의 데이터 소스( ex. 데이터베이스, 파일, 메세지 등 )에서 데이터를 읽어오는 다양한 ItemReader 구현체가 제공됩니다.

 

ItemProcessor

  • ItemReader로부터 읽어온 아이템을 처리하는 역할을 담당합니다.
  • 필요에 따라 사용하며 사용할지 말지는 선택적인 부분입니다.
  • 데이터 필터링, 변환 등의 작업을 수행할 수 있습니다.

 

ItemWriter

  • ItemProcessor에서 처리된 데이터를 최종적으로 기록하는 역할을 담당합니다.
  • 다양한 형태의 구현체를 통해 DB에 기록, 파일 생성, 메세지 발행 등 다양한 방식으로 데이터를 쓸 수 있습니다.

 

 

Chunk

  • 여러 개의 아이템을 묶은 하나의 덩어리를 의미합니다.
  • ItemReader, ItemProcessor, ItemWriter의 묶음을 가지고 있습니다.

 

Tasklet

  • 간단한 단일 작업( ex. 리소스 정리, 시스템 상태 체크)을 수행할 때 사용합니다.
  • Step 내에서 단일 작업을 수행하기 위한 인터페이스입니다.
  • Tasklet의 execute 메서드는 Step의 모든 처리가 끝날 때 까지 계속 호출됩니다.

 

 

ExecutionContext

  • Step 간 또는 Job 실행 도중 데이터를 공유하는 데 사용되는 저장소입니다.
  • 종류는 JobExecutionContext와 StepExecutionContext로 두 종류 입니다.
  • 범위와 저장 시점에 따라 적절하게 사용됩니다.
  • Job 또는 Step이 실패했을 경우, ExecutionContext를 통해 마지막 실행 상태를 재구성하여 재시도 또는 복구 작업을 수행할 수 있습니다.

 

 

JobRepository

  • 배치 작업에 관련된 모든 정보를 저장하고 관리하는 메커니즘
  • Job실행정보(JobExecution), Step 실행정보(StepExecution), Job파라미터(JobParameters)등을 저장하고 관리합니다.
  • Job이 실행될 때, JobRepository는 새로운 JobExecution과 StepExecution을 생성하고, 이를 통해 실행 상태를 추적합니다.

 

JobLauncher

  • Job과 JobParameters를 받아 Job을 실행하는 역할을 합니다.
  • 이는 전반적인 Job의 생명 주기를 관리하며, JobRepository를 통해 실행 상태를 유지합니다.

 

JobOPerator

  • 외부 인터페이스로써, Job의 실행·중지·재시작 등의 배치 작업 흐름제어를 담당합니다.
  • 이 인터페이스를 통해 JobLauncher와 JobRepository에 대한 직접적인 접근 없이도 배치 작업을 수행하고 상태 조회가 가능합니다.

 

JobExplorer

  • Job의 실행 이력을 조회하는 데 사용됩니다.
  • JobRepository에서 제공하는 정보와 유사하지만, JobRepository는 주로 Job의 실행 도중인 상태에 대해 업데이트하고 관리하고, JobExplorer는 주로 읽기 전용 접근에 초점을 맞추고 있습니다.

 

 

 

메타 테이블


 

BATCH_JOB_INSTANCE
  • JobInstance와 관련된 모든 정보를 가지며, 전체 계층 구조의 최상위 역할
  • JOB_INSTANCE_ID : 실행된 JobInstance ID
  • VERSION : 배치 테이블의 낙관적 잠금(Optimistic locking)에 사용되는 컬럼 ( 1씩 증가 )
낙관적 잠금(Optimistic Locking)
- 여러 트랜잭션이 동시에 데이터를 업데이트를 하려고 할 때, 충돌을 방지하기 위해 사용되는 방법 중 하나
- VERSION 컬럼은 각 Job Instance에 대해 부여된 일련번호로, JobInstance가 실행될 때 마다 증가합니다.
  • JOB_NAME : 실행된 Job의 이름 ( Not Null )
  • JOB_KEY : JobParameters로 생성된 JobInstance의 키, Job의 중복 수행 체크를 위한 고유 키( UNIQUE )

 

BATCH_JOB_EXECUTION
  • JobExecution와 관련된 모든 정보를 가지고 있습니다
  • JOB_EXECUTION_ID : 실행된 JobExecution의 ID
  • VERSION : 배치 테이블의 낙관적 잠금에 사용되는 컬럼
  • JOB_INSTANCE_ID : BATCH_JOB_INSTANCE 테이블의 외래키
  • CREATE_TIME : JobExecution이 생성된 시간
  • START_TIME : JobExecution이 실행된 시간
  • END_TIME : JobExecution이 종료된 시간 ( 성공·실패 여부와 상관없이 실행이 완료된 시간 )
  • STATUS : JobExecution의 상태 ( BatchStatus의 Enum 타입 )
  • EXIT_CODE : JobExecution의 종료 코드
  • EXIT_MESSAGE : JobExecution의 종료 메세지 ( 만약, 에러가 발생한 경우 에러 메세지 )
  • LAST_UPDATED : JobExecution이 수정된 시간

 

BATCH_JOB_EXECUTION_PARAMS
  • JobParameters와 관련된 모든 정보를 가지고 있습니다.
  • JOB_EXECUTION_ID : 실행된 JobExecution의 ID ( BATCH_JOB_EXECUTION의 외래 키 )
  • TYPE_CD : JobParameters의 타입 코드 ( String, Date, Long, Double )
  • STRING_VAL : JobParameters의 String 값 ( TYPE_CD = String 일 때 )
  • DATETIME : JobParameters의 Date 값 ( TYPE_CD = Date 일 때 )
  • LONG_VAL : JobParameters의 Long 값 ( TYPE_CD = Long 일 때 )
  • DOUBLE_VAL : JobParameters의 Double 값 ( TYPE_CD = Double 일 때 )
  • IDENTIFYING : Job 실행에 대한 매개변수를 식별하는 데 사용 되는 컬럼

 

BATCH_JOB_EXECUTION_CONTEXT
  • 작업의 실행 Context와 관련된 모든 정보가 들어있습니다.
  • 각 JobExecution마다 하나의 JobExecutionContext가 있으며, JobExecutionContext 데이터는 JobInstance가 실패 시 중단된 위치에서 다시 시작할 수 있는 정보를 저장할 수 있습니다.
  • JOB_EXECUTION_ID : 실행된 JobExecution의 ID
  • SHORT_CONTEXT : 문자열로 저장된 JobExecutionContext 정보
  • SERIALIZED_CONTEXT : 직렬화하여 저장된 JobExecutionContext 정보

 

 

BATCH_STEP_EXECUTION
  • StepExecution 객체와 관련된 모든 정보가 저장되어 있습니다.
  • BATCH_JOB_EXECUTION 테이블과 유사하며, 생성된 각 JobExecution에 대해 항상 단계당 하나 이상의 항목이 존재
  • STEP_EXECUTION_ID : 실행된 StepExecution의 ID
  • VERSION : 배치 테이블의 낙관적 잠금에 사용되는 컬럼
  • STEP_NAME : 실행된 StepExecution의 Step 이름
  • JOB_EXECUTION_ID : 실행된 JobExecution의 ID
  • START_TIME : StepExecution이 시작된 시간
  • END_TIME : StepExecution이 종료된 시간 ( 성공·실패 여부와 상관없이 실행이 완료된 시간 )
  • STATUS : StepExecution의 상태 ( BatchStatus의 Enum 타입 )
  • COMMIT_COUNT : StepExecution 실행 중, 커밋한 횟수
  • READ_COUNT : StepExecution 실행 중, 읽은 데이터 수
  • FILTER_COUNT : StepExecution 실행 중, 필터링된 데이터 수
  • WRITE_COUNT : StepExecution 실행 중, 작성 및 커밋된 데이터 수
  • READ_SKIP_COUNT : StepExecution 실행 중, 읽기를 스킵한 데이터 수
  • WRITE_SKIP_COUNT : StepExecution 실행 중, 작성을 스킵한 데이터 수
  • PROCESS_SKIP_COUNT : StepExecution 실행 중, 처리를 스킵한 데이터 수
  • EXIT_CODE : StepExecution의 종료 코드
  • ROLLBACK_COUNT : StepExecution 실행 중, 롤백 횟수
  • EXIT_MESSAGE : StepExecution의 종료 메시지 ( 에러 발생 시, 에러메세지 )
  • LAST_UPDATED : StepExecution이 수정된 시간

 

BATCH_STEP_EXECUTION_CONTEXT
  • StepExecutionContext와 관련된 모든 정보가 저장됩니다.
  • Step 실행 당 하나의 ExecutionContext가 있으며, 특정 Step 실행을 위해 유지되어야 하는 모든 데이터가 포함되어 있습니다.
  • STEP_EXECUTION_ID : 실행된 StepExecution의 ID
  • SHORT_CONTEXT : 문자열로 저장된 StepExecutionContext 정보
  • SERIALIZED_CONTEXT : 직렬화하여 저장된 StepExecutionContext 정보

 

 

 


 참고


 

https://dkswnkk.tistory.com/707

 

Spring Batch란? 간단한 개념과 코드 살펴보기

서론 스프링 배치(Spring Batch)는 대용량 데이터를 처리하기 위한 프레임워크로, 스프링 프레임워크 기반에서 작동합니다. 일반적으로 배치 작업은 대량의 데이터를 처리하거나, 주기적이고 반복

dkswnkk.tistory.com

https://rok93.tistory.com/entry/Spring-Batch-%EA%B5%AC%EC%A1%B0

 

[Spring Batch] 구조

Batch란…? 사전 정의 큰 단위의 작업을 일괄 처리 대부분 처리량이 많고 비 실시간성 처리에 사용 대용량 데이터 계산, 정산, 통계, 데이터베이스, 변환 etc… 컴퓨터 자원을 최대로 활용 컴퓨터

rok93.tistory.com

https://yeonyeon.tistory.com/310

 

[Spring Batch] 개념부터 코드까지

목차 1. Spring Batch란? 2. Spring Batch 구조 3. 기본적인 세팅 4. Job, Step 5. ItemReader, ItemProcessor, ItemWriter 1. Spring Batch란? 배치란 언제, 왜 쓰는걸까? 비즈니스 로직을 작성하다 보면 대량 처리(bulk processing

yeonyeon.tistory.com