Spring Batch 시작하기
용어 정리
JOB
- 전체 배치 처리 과정을 캡슐화한 엔티티
- Job 객체를 만드는 빌더는 여러 개가 존재하는데 이들을 통합 처리하는 공장인 JobBuilderFactory로 원하는 Job을 쉽게 만들 수 있음
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
...
@Bean
public Job makeFriedRiceJob() {
return this.jobBuilderFactory.get("friedRiceJob")
.start(preparationOfIngredients())
.next(chopVegetables())
.next(stirFry())
.end()
.build();
}
}
- Job은 Step 또는 Flow 인스턴스의 컨테이너 역할을 하기 때문에 생성하기 전에 인스턴스를 전달받음
- 논리적인 하나의 흐름에 속하는 여러 Step의 정의와 순서를 결합하고, 재시작 여부를 전역으로 가질 수 있음
JobInstance
- Job이 실행될 때 하나의 논리적인 Job 실행 단위로 Job 실행시 각 실행을 추적 할 수 있음
- JobInstance는 여러 개의 JobExecution 포함 가능
- Job을 실행했는데 실패했고 이 JobInstance를 재 사용하여 실행한다면 멈추었던 곳에서 재 시작됨
- 같은 JobInstance 실행시 JobExecutionAlreadyRunningException이 발생함
JobParameter
- 배치 Job을 실행할 때 사용하는 파라미터 셋을 가지는 객체
- Job을 식별하거나 참조 데이터로 사용 가능
JobExecution
- JobInstance에 대한 한 번의 실행을 나타내는 객체 (JobInstance와 1:N 가능)
- JobInstance, 배치 실행 상태, 시작 시간, 끝난 시간, 실패했을 때의 메시지 등의 Job 실행에 대한 정보를 담고 있음
- Job 실행이 실패하면 JobInstance가 끝난 것으로 간주하지 않아 이전 실패한 JobExecution과 성공한 JobExecution 두 개를 가지게 됨
STEP
- Batch로 실제 처리하고자 하는 기능과 설정을 모두 포함하는 장소
- Step은 실질적인 배치 처리를 정의하고 제어하는 데 필요한 모든 정보가 들어 있는 도메인 객체
- Job을 처리하는 실질적인 단위
- 모든 Job은 1개 이상의 Step을 포함
StepExecution
- Step 실행 정보, JobExecution, 트랜잭션 관련 데이터를 담은 객체
- 각각의 Step이 실행될 때마다 StepExecution이 생성
ExecutionContext
- StepExecution 객체 또는 JobExecution 객체에 속하는 상태를 저장
- Step 레벨로 Step 내에서 커밋할 때마다 저장하거나 Job 레벨의 컨텍스트는 모든 Step 실행사이에 저장
- 프레임워크에서 커밋 시점에 저장하여 유지/관리하는 키/값 쌍의 컬렉션으로, keyspace를 공유함으로 겹치지 않게 주의
executionContext.putLong(getKey(LINES_READ_COUNT), reader.getPosition());
JobRepository
- 배치 처리 정보를 담고 있는 메커니즘으로 어떤 Job이 실행되었으며 몇 번 실행되었고 언제 끝났는지 등 배치 처리에 대한 메타데이터를 저장
- Job 하나가 실행되면 JobRepository에서는 배치 실행에 관련된 정보를 담고 있는 도메인인 JobExecution을 조회 및 생성하고 실행 중에는 StepExecution, JobExecution 구현체를 레포지토리에 넘겨 저장함
- 자바 기반 설정은 @EnableBatchProcessing 어노테이션만 달아주면 JobRepository를 자동으로 컴포넌트 설정 가능
JobLauncher
- Job, JobParameters와 함께 배치를 실행하는 인터페이스
- JobRepository에서 유효한 JobExecution을 조회하고 Job을 실행하는 기능
Tasklet
- 임의의 step을 실행할 때 읽기, 처리, 쓰기를 하나의 작업으로 처리
Chunk
- 트랜잭션 경계 내에서 청크 단위로 데이터를 읽고 생성하는 것으로 읽기, 처리, 쓰기로 나뉜 방식
- 아이템이 트랜잭션에서 커밋되는 수, read한 데이터 수가 지정한 청크 단위와 일치하면 write를 수행하고 트랜잭션을 커밋
- 진행중 배치 처리에 실패하더라도 해당 데이터에 대해서만 롤백하는 이점이 있음
ItemReader
- ItemReader는 Step의 대상이 되는 배치 데이터를 읽어오는 인터페이스
- FILE, XML, DB 등 여러 타입의 데이터를 읽어올 수 있음
- "ListItemReader<> 객체"를 사용하면 모든 데이터를 한 번에 가져와 메모리에 올려놓고 read() 메서드로 하나씩 배치 처리 작업을 수행 가능
ItemProcessor
- 아이템을 처리하는 비지니스 로직을 나타내는 추상화 개념
- ItemReader로 읽어온 배치 데이터를 변환 혹은 다른 비즈니스 처리를하는 역할을 수행
ItemWriter
- Step에서 배치나 청크 단위로 아이템을 출력하는 작업을 추상화
- 배치 데이터를 (일반적으로 DB나 파일) 저장
Meta-Data Schema
스키마 확인
schema-{DBMS이름}.sql 으로 IDE에서 검색하면 확인 가능
BATCH_JOB_INSTANCE
- 작업 인스턴스와 관련된 모든 정보가 포함된 계층 구조중 가장 상위 개념
- JOB_INSTANCE_ID : 인스턴스를 식별하는 고유 ID, JobInstance에서 getId 메서드를 호출하여 얻을 수 있음
- JOB_NAME : Job 개체에서 가져온 작업의 이름으로 인스턴스를 식별할 때 사용
- JOB_KEY : 동일한 Job의 개별 인스턴스를 식별하는 JobParameters의 직렬화
BATCH_JOB_EXECUTION
- JobExcution 객체와 관련된 정보로 Job 실행시 생성
- JOB_EXECUMENTION_ID : PK, JobExecution의 getId 메서드를 호출하여 얻을 수 있음
- JOB_INSTANCE_ID: BATCH_JOB_INSTANCE 테이블의 FK로 JOB 인스턴스당 N개 가능
- CREATE_TIME: 실행이 생성된 시간
- START_TIME: 실행이 시작된 시간
- END_TIME: 성공 또는 실패와 관계없이 실행이 완료된 시간으로 실행되고 있지 않을때 빈 값이면 실행시 마지막 저장에 오류가 발생하였음을 의미
- STATUS: COMPLETED, STARTED 등의 값을 나타내며 BatchStatus를 나타냄
- EXIT_CODE : 실행 종료 코드로 Command line 실행시 숫자로 변환 가능
- EXIT_MESSAGE : 작업 종료 방법의 설명
- LAST_UPDATED : 마지막으로 지속된 시간
BATCH_JOB_EXECUTION_PARAMS
- JobParameters 객체와 관련된 정보로 Job에 전달된 키/값이 포함
- JOB_EXECUMENTION_ID: BATCH_JOB_EXECUMENTION 테이블의 FK로 Execution 마다 N개 존재 가능
- TYPE_CD: 저장된 타입으로 String / Date / Long / Double 중 하나
- KEY_NAME: 파라미터 키값
- {Type}_VAL : 파라미터 값
- IDENTIFYING : JobInstance의 ID에 기여했는지 여부를 나타내는 플래그
BATCH_STEP_EXECUTION
- StepExecution 객체와 관련된 모든 정보가 들어 있으며 Step 마다 N개 존재
- STEP_EXECUMENTION_ID : PK, STEPExecution의 getId 메서드를 호출하여 얻을 수 있음
- JOB_EXECUMENTION_ID : BATCH_JOB_EXECUTION 테이블의 FK, 주어진 Step 이름과 JobExecution에 대해 단 하나의 StepExecution만 존재가능
- START_TIME: 실행이 시작된 시간
- END_TIME: 성공 또는 실패와 관계없이 실행이 완료된 시간으로 실행되고 있지 않을때 빈 값이면 실행시 마지막 저장에 오류가 발생하였음을 의미
- STATUS: COMPLETED, STARTED 등의 값을 나타내며 BatchStatus를 나타냄
- COMMIT_COUNT: 실행 중 Step이 transaction Commit한 횟수
- READ_COUNT: 실행 중 읽은 Item 수
- FILTER_COUNT: 실행 중 필터링된 Item 수
- WRITE_COUNT: 실행 중 작성되고 Commit된 Item 수
- READ_SKIP_COUNT: 실행 중 읽기를 건너뛴 Item 수
- WRITE_SKIP_COUNT: 실행 중 쓰기를 건너뛴 Item 수
- PROCESS_SKIP_COUNT: 실행 중 처리 중에 건너뛴 Item 수
- ROLBACK_COUNT: 실행 중 롤백 수로 재시도와 복구 건너뛰기 프로시저 롤백도 포함됨
- EXIT_CODE : 실행 종료 코드로 Command line 실행시 숫자로 변환 가능
- EXIT_MESSAGE : 작업 종료 방법의 설명
- LAST_UPDATED : 마지막으로 지속된 시간
BATCH_JOB_EXECUTION_CONTEXT
- Job의 실행 컨텍스트와 관련된 정보로 JobExecution 당 한개만 존재
- 실패후 검색해야 하는 State를 나타내며 JobInstance는 중단된 위치에서 시작 가능함
- JOB_EXECUTION_ID :JobExecution의 Fk로 JobExecution 당 N개 가능
- SHORT_CONTEXT: SERIALIZED_CONTEXT의 문자열 버전
- SERIALIZED_CONTEXT: 직렬화 된 전체 컨텍스트
BATCH_STEP_EXECUTION_CONTEX
- Step의 실행 컨텍스트와 관련된 정보로 StepExecution 당 한개만 존재
- 특정 Step의 실행을 위해 유지해야 하는 모든 데이터를 포함하며 JobInstance는 중단된 위치에서 시작 가능 하도록 검색해야 하는 상태
- STEP_EXECUTION_ID :StepExecution의 Fk로 StepExecution 당 N개 가능
- SHORT_CONTEXT: SERIALIZED_CONTEXT의 문자열 버전
- SERIALIZED_CONTEXT: 직렬화 된 전체 컨텍스트
참고자료
https://jojoldu.tistory.com/324?category=902551
https://hororolol.tistory.com/513
https://dalgun.dev/blog/2019-10-30/spring-batch
https://godekdls.github.io/Spring%20Batch/domainlanguage/
https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html