Spring batch
- 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크입니다.
- 여기서 Batch는 "일괄처리"라는 뜻을 가지고 있다고 생각하면 됩니다.
- 특징
- Transaction 관리
- 시작 / 멈춤 / 재시작
- 재시도 / 건너뛰기
- Chunk 기반 처리
- 대용량 데이터 처리
- 구조
- 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
'개발 지식' 카테고리의 다른 글
mysql과 mysql2 차이 (0) | 2024.07.02 |
---|---|
Spring security 구조 및 동작 (0) | 2024.06.06 |
Spring batch 5.0 간단한 구현 (1) | 2023.12.22 |