[Spring Batch 정리하기] 2. DB Schema
1. Meta Schema
- Spring Batch 의 실행 및 관리를 위한 목적으로 여러 도메인(Job, Step, JobParameters 등)들에 대한 정보를 저장, 업데이트, 조회 등의 작업을 할 수 있는 스키마 제공
- 과거 및 현재의 Batch 실행에 대한 정보(성공, 실패 여부)를 관리함으로서 배치 운영 및 장애와 관련된 대처 가능
- DB 와 연동할 경우 필수적으로 메타 테이블이 생성되어야 함(커스텀마이징을 통해 테이블 없이 수행은 가능)
- 위 이미지와 같이 6개의 Meta Table 과 3개의 Sequence Table 이 존재
2. Meta Schema DB 생성
- spring-batch-core 라이브러리 내부에 schema-*.sql 파일의 데이터베이스 종류별 메타 데이터 스키마가 존재
- 수동 생성
- 쿼리 복사 후 직접 수행 - 자동 생성
- application.yaml 혹은 application.properties 에 spring.bathc.jdbc.initalize-schema 설정
- ALWAYS : 스크립트 항상 실행, RDBMS 를 내장 DB 보다 우선 수행
- EMBEDDED : 내장 DB 일때만 생성
- NEVER : 스크립트 항상 실행 안함
- 간단하게 schema-mysql.sql 을 확인해 보면 아래와 같다.(데이터베이스 종류에 따라 쿼리는 다르다)
3. Meta Table 정보
3-1) BATCH_JOB_INSTANCE
- Job 이 실행될 때 생성되는 JobInstance 에 관한 정보를 저장.
- 전체 계층 구조의 최상위 역할.
컬럼 | 설명 |
JOB_INSTANCE_ID | Primary Key |
VERSION | 해당 Row 가 Update 될 때마다 1 증가 |
JOB_NAME | jobBuilderFactory.get 에 설정한 Batch Job Name |
JOB_KEY | 동일한 작업에 대한 식별하는 키 값 |
3-2) BATCH_JOB_EXECUTION
- JobExecution 에 관련된 모든 정보를 저장.
- JobInstance 가 실행될 때마다 시작시간, 종료시간, 종료 코드 등을 가짐.
컬럼 | 설명 |
JOB_EXECUTION_ID | Primary Key |
VERSION | 해당 Row 가 Update 될 때마다 1 증가 |
JOB_INSTANCE_ID | BATCH_JOB_INSTANCE 테이블의 Foreign Key |
CREATE_TIME | 실행이 생성된 타임스탬프 |
START_TIME | 실행이 시작된 타임스탬프 |
END_TIME | 성공, 실패 상관 없이 실행이 완료된 타임스탬프 이 컬럼이 빈 값이라면 어떤 유형의 오류가 있었고, 프레임워크가 실패하기 전 마지막 저장을 수행할 수 없었음을 나타냄 |
STATUS | 실행 상태 |
EXIT_CODE | 실행 종료 코드 |
EXIT_MESSAGE | 작업이 종료에 대한 메시지 |
LAST_UPDATE | 실행이 지속된 마지막 타임스탬프 |
3-3) BATCH_JOB_EXECUTION_PARAMS
- Job 을 실행시킬 때 사용했던 JobParameters 에 대한 정보를 저장.
- String, Date, Long, Double 타입의 데이터만 저장 가능.
컬럼 | 설명 |
JOB_EXECUTION_ID | BATCH_JOB_EXECUTION 테이블에 대한 외래키(Foeign Key) |
TYPE_CD | 저장된 값의 데이터 유형, NOT NULL |
KEY_NAME | 저장된 값의 이름, NOT NULL |
STRING_VAL | String 타입 값 |
DATE_VAL | Date 타입 값 |
LONG_VAL | Long 타입 값 |
DOUBLE_VAL | Double 타입 값 |
IDENTIFYING | 매개변수가 관련 ID 에 기여했는지 여부를 나타내는 플래그 |
3-4) BATCH_JOB_EXECUTION_CONTEXT
- JobExecution 의 ExecutionContext 정보가 보관.
- ExecutionContext 데이터는 일반적으로 JobInstance 가 실패 시 중단된 위치에서 재시작할 수 있는 정보를 저장.
- Job 실행동안 여러 상태정보, 공유 데이터를 직렬화(Json)하여 저장
- Step 간 데이터 공유가 가능
컬럼 | 설명 |
JOB_EXECUTION_ID | BATCH_JOB_EXECUTION 테이블에 대한 Foreign Key |
SHORT_CONTEXT | SERIALIZED_CONTEXT |
SERIALIZED_CONTEXT | 직렬화 된 Execution Context |
3-5) BATCH_STEP_EXECUTION
- StepExecution 에 대한 정보를 저장.
- STEP_EXECUTION 정보인 읽은 수, 커밋 수, 스킵 수 등 다양한 정보를 추가로 보관. -> 스프링 배치 무한 수행 오류를 찾게 된 테이블
컬럼 | 설명 |
STEP_EXECUTION_ID | Primary Key |
VERSION | 해당 Row 가 Update 될 때마다 1 증가 |
STEP_NAME | stepBuilderFactory.get 에 설정한 Step Name |
JOB_EXECUTION_ID | BATCH_JOB_EXECTUION 테이블의 Foreign Key |
START_TIME | 실행이 사작된 타임스탬프 |
END_TIME | 성공, 실패 상관 없이 실행이 완료된 타임스탬프 이 컬럼이 빈 값이라면 어떤 유형의 오류가 있었고, 프레임워크가 실패하기 전 마지막 저장을 수행할 수 없었음을 나타냄 |
STATUS | 실행 상태 |
COMMIT_COUNT | 실행 중에 단계가 트랜잭션을 커밋한 횟수 |
READ_COUNT | 실행 중에 읽은 항목 수 |
FILTER_COUNT | 실행 중에 필터링 된 항목 수 |
WRITE_COUNT | 실행 중에 작성 된 커밋된 항목 수 |
READ_SKIP_COUNT | 실행 중에 읽기에서 건너뛴 항목 수 |
WRITE_SKIP_COUNT | 실행 중에 쓰기에서 건너뛴 항목 수 |
PROCESS_SKIP_COUNT | 실행 중에 처리에서 건너뛴 항목 수 |
ROLLBACK_COUNT | 실행 중에 롤백 된 항목 수 |
EXIT_CODE | 실행 종료 코드 |
EXIT_MESSAGE | 작업이 종료에 대한 메시지 |
LAST_UPDATE | 실행이 지속된 마지막 타임스탬프 |
3-6) BATCH_STEP_EXECUTION_CONTEXT
- StepExecution 의 ExecutionContext 정보가 보관.
- ExecutionContext 데이터는 일반적으로 JobInstance 가 실패 시 중단된 위치에서 재시작할 수 있는 정보를 저장.
- Step 실행동안 여러 상태정보, 공유 데이터를 직렬화(Json)해서 저장
- Step 별로 저장되며 Step 간 데이터를 공유할 수 없음
컬럼 | 설명 |
STEP_EXECUTION_ID | BATCH_STEP_EXECUTION 테이블에 대한 Foreign Key |
SHORT_CONTEXT | SERIALIZED_CONTEXT |
SERIALIZED_CONTEXT | 직렬화 된 Execution Context |
참고
- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard