본문으로 건너뛰기

MetaDataSchema

1 Meta Data Schema

  • 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의 직렬화된 값입니다.