이 페이지에서
Spring Batch는 배치 처리를 위한 강력한 프레임워크로, 메타데이터 테이블을 활용하여 작업 실행 정보를 저장하고 관리합니다.
이 글에서는 Spring Batch 메타데이터 테이블의 구조와 활용 방법에 대해 자세히 살펴보겠습니다.
Spring Batch의 메타데이터 테이블은 Java 도메인 객체와 밀접하게 매핑됩니다.
예를 들어, JobInstance, JobExecution, JobParameters, StepExecution은 각각 BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_PARAMS, BATCH_STEP_EXECUTION 테이블에 매핑됩니다.
ExecutionContext는 BATCH_JOB_EXECUTION_CONTEXT와 BATCH_STEP_EXECUTION_CONTEXT 테이블 모두에 매핑됩니다.
JobRepository는 각 Java 객체를 올바른 테이블에 저장하고 관리하는 역할을 합니다.
2 DDL 스크립트 예제
Spring Batch 코어 JAR 파일에는 여러 데이터베이스 플랫폼에 대한 관계형 테이블 생성을 위한 스크립트 예제가 포함되어 있습니다.
이들 스크립트는 추가 인덱스 및 제약조건을 원하는 대로 수정하여 사용할 수 있습니다.
파일 이름은 schema-*.sql
형태입니다.
스크립트는 org.springframework.batch.core 패키지에 있습니다.
3 Migration DDL Scripts
또한 Spring Batch는 버전 업그레이드 시 실행해야 하는 마이그레이션 DDL 스크립트를 제공합니다.
이러한 스크립트는 Core Jar 파일의 org/springframework/batch/core/migration 안에서 찾을 수 있습니다.
마이그레이션 스크립트는 그들이 도입된 버전 번호에 해당하는 폴더로 구성되어 있습니다
4 버전 컬럼
Spring Batch는 데이터베이스 업데이트 시 낙관적 잠금(optimistic locking) 전략을 사용합니다.
레코드가 업데이트될 때마다 버전 컬럼의 값이 1씩 증가하며, 저장 시점에 버전 번호가 변경되었다면 OptimisticLockingFailureException이 발생합니다.
5 식별자 생성
식별자 생성 BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_STEP_EXECUTION 테이블에는 각각 _ID
로 끝나는 기본 키 컬럼이 있습니다.
이 값은 데이터베이스에서 자동 생성되는 것이 아니라 별도의 시퀀스를 통해 생성됩니다.
많은 데이터베이스 벤더가 시퀀스를 지원하지 않는 경우, MySQL의 경우처럼 테이블을 사용하여 시퀀스를 대체할 수 있습니다.
# 6 주요 메타데이터 테이블
Spring Batch에서 사용하는 주요 메타데이터 테이블에 대해 자세히 살펴보겠습니다.
6.1 BATCH_JOB_INSTANCE
JobInstance에 대한 모든 정보를 저장하고 전체 계층 구조의 최상위에 위치합니다.
테이블 필드:
JOB_INSTANCE_ID: JobInstance의 고유 식별자입니다.
VERSION: 낙관적 잠금을 위한 버전 번호입니다.
JOB_NAME: Job의 이름입니다.
JOB_KEY: Job의 이름과 JobParameters를 기반으로 생성된 JobInstance의 고유 키입니다.
6.2 BATCH_JOB_EXECUTION_PARAMS
JobParameters 객체에 대한 모든 정보를 저장하며, Job에 전달된 0개 이상의 키/값 쌍을 포함합니다.
테이블 필드:
JOB_EXECUTION_ID: JobExecution의 고유 식별자입니다.
TYPE_CD: 파라미터의 타입을 나타내는 문자열 코드입니다.
KEY_NAME: 파라미터의 키 이름입니다.
STRING_VAL: 문자열 타입 파라미터의 값입니다.
DATE_VAL: 날짜 타입 파라미터의 값입니다.
LONG_VAL: 숫자 타입 파라미터의 값입니다.
DOUBLE_VAL: 실수 타입 파라미터의 값입니다.
6.3 BATCH_JOB_EXECUTION
JobExecution 객체에 대한 모든 정보를 저장하며, Job이 실행될 때마다 새로운 JobExecution과 이 테이블의 새 행이 생성됩니다.
테이블 필드:
JOB_EXECUTION_ID: JobExecution의 고유 식별자입니다.
VERSION: 낙관적 잠금을 위한 버전 번호입니다.
JOB_INSTANCE_ID: JobInstance의 고유 식별자입니다.
CREATE_TIME: JobExecution이 생성된 시간입니다.
START_TIME: JobExecution이 시작된 시간입니다.
END_TIME: JobExecution이 종료된 시간입니다.
STATUS: JobExecution의 현재 상태입니다.
EXIT_CODE: JobExecution의 종료 코드입니다.
EXIT_MESSAGE: JobExecution의 종료 메시지입니다.
LAST_UPDATED: JobExecution이 마지막으로 업데이트된 시간입니다.
6.4 BATCH_STEP_EXECUTION
StepExecution 객체에 대한 모든 정보를 저장하며, 각 JobExecution에 대해 Step별로 최소 하나의 항목이 존재합니다.
테이블 필드:
STEP_EXECUTION_ID: StepExecution의 고유 식별자입니다.
VERSION: 낙관적 잠금을 위한 버전 번호 입니다.
STEP_NAME: Step의 이름입니다.
JOB_EXECUTION_ID: JobExecution의 고유 식별자입니다.
START_TIME: StepExecution이 시작된 시간입니다.
END_TIME: StepExecution이 종료된 시간입니다.
STATUS: StepExecution의 현재 상태입니다.
COMMIT_COUNT: 커밋된 트랜잭션 수입니다.
READ_COUNT: 읽은 레코드 수입니다.
FILTER_COUNT: 필터링된 레코드 수입니다.
WRITE_COUNT: 쓴 레코드 수입니다.
READ_SKIP_COUNT: 읽기에서 건너뛴 레코드 수입니다.
WRITE_SKIP_COUNT: 쓰기에서 건너뛴 레코드 수입니다.
PROCESS_SKIP_COUNT: 처리에서 건너뛴 레코드 수입니다.
ROLLBACK_COUNT: 롤백된 트랜잭션 수입니다.
EXIT_CODE: StepExecution의 종료 코드입니다.
EXIT_MESSAGE: StepExecution의 종료 메시지입니다.
LAST_UPDATED: StepExecution이 마지막으로 업데이트된 시간입니다.
6.5 BATCH_JOB_EXECUTION_CONTEXT
Job의 ExecutionContext에 대한 모든 정보를 저장하며, 각 JobExecution에 대해 정확히 하나의 Job ExecutionContext가 존재합니다.
테이블 필드:
JOB_EXECUTION_ID: JobExecution의 고유 식별자입니다.
SHORT_CONTEXT: ExecutionContext의 직렬화된 값입니다.
SERIALIZED_CONTEXT: ExecutionContext의 직렬화된 값입니다.
6.6 BATCH_STEP_EXECUTION_CONTEXT
Step의 ExecutionContext에 대한 모든 정보를 저장하며, 각 StepExecution에 대해 정확히 하나의 ExecutionContext가 존재합니다.
테이블 필드:
STEP_EXECUTION_ID: StepExecution의 고유 식별자입니다.
SHORT_CONTEXT: ExecutionContext의 직렬화된 값입니다.
SERIALIZED_CONTEXT: ExecutionContext의 직렬화된 값입니다.