본문 바로가기

Java/Spring

[Spring] spring batch meta table

반응형

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로 제공됩니다.  

 

메타 테이블 생성 쿼리

https://github.com/spring-projects/spring-batch/blob/main/spring-batch-core/src/main/resources/org/springframework/batch/core/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);

 

메타 테이블 삭제 쿼리
https://github.com/spring-projects/spring-batch/blob/main/spring-batch-core/src/main/resources/org/springframework/batch/core/schema-drop-mysql.sql

 

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;

 

반응형

❥ CHATI Github