Spring batch 메타 테이블은 재시작/중복실행 방지/실패 추적/모니터링을 위해
Job/Step 실행 이력과 파라미터, 컨텍스트를 DB에 저장합니다.
이 테이블을 관리하면 쉽게 spring batch를 관리할 수 있습니다.
메타 테이블 장점
- 재시작(Restart) 가능: 실패한 Step부터 이어서 재실행하기 쉬워집니다.
- 중복 실행 방지: 같은 Job + 같은 파라미터를 “이미 수행됨”으로 판단해 중복 처리를 막아줍니다.
- 운영 추적/감사(로그): 언제 어떤 파라미터로 실행됐고, 어디서 실패했는지 DB에 남아 분석이 쉽습니다.
- 모니터링/대시보드 연동이 쉬움: 실행 상태를 DB 기반으로 조회/집계하기 좋습니다.
메타 테이블 단점(운영 비용)
- 테이블이 계속 쌓임(용량 증가): Job/Step 실행 이력이 누적돼 DB가 비대해질 수 있습니다.
- 정리 정책이 필요함: 오래된 실행 이력/컨텍스트를 삭제하는 “보관 정책(보통 N일)”이 없으면 성능/용량 이슈가 생깁니다.
- DDL/버전 업그레이드 관리 부담: Spring Batch 버전 업 시 스키마 변경이 있을 수 있어, Flyway/Liquibase 같은 방식으로 관리가 필요합니다.
- 권한/보안 고려 필요: 파라미터나 컨텍스트에 민감정보(예: 사용자 식별값, 파일 경로, 토큰 등)를 넣으면 DB에 그대로 남습니다.
- 성능 이슈 가능성: 실행이 매우 잦거나(분 단위), Step이 많으면 메타 테이블 쓰기/조회가 늘어 인덱스/DB 부하가 생길 수 있습니다.
Spring Batch 메타 테이블 목록 (default)
1) Job
- BATCH_JOB_INSTANCE : 어떤 Job이 “논리적으로” 실행 단위로 만들어졌는지(=Job + JobParameters 조합)
- BATCH_JOB_EXECUTION : Job 실행 이력(시작/종료 시각, 상태, exit code 등)
- BATCH_JOB_EXECUTION_PARAMS : JobParameters 저장
2) Step
- BATCH_STEP_EXECUTION : Step 실행 이력
- BATCH_STEP_EXECUTION_CONTEXT : Step Execution Context 저장(직렬화된 컨텍스트)
- BATCH_JOB_EXECUTION_CONTEXT : Job Execution Context 저장
3) 공통(시퀀스/ID 생성)
- BATCH_JOB_SEQ : Job 관련 ID 시퀀스(또는 테이블 기반 시퀀스)
- BATCH_JOB_EXECUTION_SEQ : JobExecution ID 시퀀스
- BATCH_STEP_EXECUTION_SEQ : StepExecution ID 시퀀스
참고
- DB가 Oracle/PostgreSQL/MySQL이냐에 따라 “SEQ”가 진짜 시퀀스로 대체되거나, 테이블 기반 시퀀스로 남기도 합니다.
- Spring Boot 설정에서 다음과 같이 많이 설정합니다.
- 개발: spring.batch.jdbc.initialize-schema=always
- 운영: never + Flyway/Liquibase로 DDL 관리
MySQL용 Spring Batch 공식 DDL 스크립트는 Spring Batch 프로젝트(공식 GitHub) 안에 schema-mysql.sql로 제공됩니다.
메타 테이블 생성 쿼리
spring-batch/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-mysql.sql at main · spring-projects/spr
Spring Batch is a framework for writing batch applications using Java and Spring - spring-projects/spring-batch
github.com
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL,
JOB_KEY VARCHAR(32) NOT NULL,
constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ENGINE=InnoDB;
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
VERSION BIGINT,
JOB_INSTANCE_ID BIGINT NOT NULL,
CREATE_TIME DATETIME(6) NOT NULL,
START_TIME DATETIME(6) DEFAULT NULL,
END_TIME DATETIME(6) DEFAULT NULL,
STATUS VARCHAR(10),
EXIT_CODE VARCHAR(2500),
EXIT_MESSAGE VARCHAR(2500),
LAST_UPDATED DATETIME(6),
constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ENGINE=InnoDB;
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS (
JOB_EXECUTION_ID BIGINT NOT NULL,
PARAMETER_NAME VARCHAR(100) NOT NULL,
PARAMETER_TYPE VARCHAR(100) NOT NULL,
PARAMETER_VALUE VARCHAR(2500),
IDENTIFYING CHAR(1) NOT NULL,
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;
CREATE TABLE BATCH_STEP_EXECUTION (
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
VERSION BIGINT NOT NULL,
STEP_NAME VARCHAR(100) NOT NULL,
JOB_EXECUTION_ID BIGINT NOT NULL,
CREATE_TIME DATETIME(6) NOT NULL,
START_TIME DATETIME(6) DEFAULT NULL,
END_TIME DATETIME(6) DEFAULT NULL,
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT,
READ_COUNT BIGINT,
FILTER_COUNT BIGINT,
WRITE_COUNT BIGINT,
READ_SKIP_COUNT BIGINT,
WRITE_SKIP_COUNT BIGINT,
PROCESS_SKIP_COUNT BIGINT,
ROLLBACK_COUNT BIGINT,
EXIT_CODE VARCHAR(2500),
EXIT_MESSAGE VARCHAR(2500),
LAST_UPDATED DATETIME(6),
constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT (
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT,
constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ENGINE=InnoDB;
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ENGINE=InnoDB;
CREATE TABLE BATCH_STEP_EXECUTION_SEQ (
ID BIGINT NOT NULL,
UNIQUE_KEY CHAR(1) NOT NULL,
constraint UNIQUE_KEY_UN unique (UNIQUE_KEY)
) ENGINE=InnoDB;
INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_STEP_EXECUTION_SEQ);
CREATE TABLE BATCH_JOB_EXECUTION_SEQ (
ID BIGINT NOT NULL,
UNIQUE_KEY CHAR(1) NOT NULL,
constraint UNIQUE_KEY_UN unique (UNIQUE_KEY)
) ENGINE=InnoDB;
INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_EXECUTION_SEQ);
CREATE TABLE BATCH_JOB_INSTANCE_SEQ (
ID BIGINT NOT NULL,
UNIQUE_KEY CHAR(1) NOT NULL,
constraint UNIQUE_KEY_UN unique (UNIQUE_KEY)
) ENGINE=InnoDB;
INSERT INTO BATCH_JOB_INSTANCE_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_INSTANCE_SEQ);
spring-batch/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-mysql.sql at main · spring-project
Spring Batch is a framework for writing batch applications using Java and Spring - spring-projects/spring-batch
github.com
DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_CONTEXT;
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_CONTEXT;
DROP TABLE IF EXISTS BATCH_STEP_EXECUTION;
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_PARAMS;
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION;
DROP TABLE IF EXISTS BATCH_JOB_INSTANCE;
DROP TABLE IF EXISTS BATCH_STEP_EXECUTION_SEQ;
DROP TABLE IF EXISTS BATCH_JOB_EXECUTION_SEQ;
DROP TABLE IF EXISTS BATCH_JOB_INSTANCE_SEQ;
Spring batch job, step 초기화 후 메타 데이터 설정 쿼리
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM BATCH_STEP_EXECUTION_CONTEXT;
DELETE FROM BATCH_JOB_EXECUTION_CONTEXT;
DELETE FROM BATCH_STEP_EXECUTION;
DELETE FROM BATCH_JOB_EXECUTION;
DELETE FROM BATCH_JOB_EXECUTION_PARAMS;
DELETE FROM BATCH_JOB_INSTANCE;
DELETE FROM BATCH_STEP_EXECUTION_SEQ;
DELETE FROM BATCH_JOB_EXECUTION_SEQ;
DELETE FROM BATCH_JOB_SEQ;
INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) VALUES (0, '0');
INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) VALUES (0, '0');
INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) VALUES (0, '0');
SET FOREIGN_KEY_CHECKS = 1;
'Java > Spring' 카테고리의 다른 글
| [Spring] 게시판 만들기 : 등록/수정/조회 API - Spring Data Jpa 이용 (0) | 2020.02.14 |
|---|---|
| [Spring] 게시판 만들기 : 적용한 Spring Data JPA 테스트 코드 작성 (6) | 2020.02.13 |
| [Spring] 게시판 만들기 : Spring Data JPA 적용 (0) | 2020.02.12 |
| [Spring] 롬복(Lombok) 라이브러리 테스트 코드 생성 (1) | 2020.02.12 |
| [Spring] 롬복(Lombok) 라이브러리 설치 (0) | 2020.02.11 |
| [Spring] 간단한 API 생성 및 테스트 코드(MockMvc이용) 해보기 (0) | 2020.02.02 |