스프링 배치는 대량의 데이터 처리에 최적화된 프레임워크로, 정확하고 효율적인 배치 처리를 가능하게 한다.
boocam프로젝트는 데이터 일괄 처리가 많이 필요해 스프링 배치를 도입했다. 막연히 배치를 붙여놓고 잘 돌아가겠지~ 하고 다른 작업을 하며 평화로운 나날을 보내던 도중...
팀원 중 한 명이 현재 배치 작업이 전혀 작동하고 있지 않다는 사실을 발견했다.....
원인은 프로젝트에 붙어있는 Flyway 때문이였다.
스프링 배치는 기본적으로 여러 가지 메타데이터 테이블을 필요로 하는데, 이 테이블이 데이터베이스에 존재하지 않으면 배치 작업을 시작할 수 없다. 참고로 이 테이블들은 보통 자동으로 생성이 된다.
하지만 Flyway는 모든 데이터베이스 스키마 변경 작업을 명시적으로 기록해야한다.
즉 Flyway스크립트에 기록되지 않은 테이블들은 자동 생성이 불가능하다는 소리이다. 이러한 특성으로 자동 생성되었어야 할 배치 관련 테이블들이 생성되지 못하였다.
스프링 배치 공식 문서에서 제공하는 SQL 스크립트를 참고하여 배치 메타데이터를 생성하는 flyway 스크립트를 추가하였다.
-- Job Instance Table
CREATE TABLE BATCH_JOB_INSTANCE
(
JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL,
JOB_KEY VARCHAR(32) NOT NULL,
CONSTRAINT JOB_INST_UN UNIQUE (JOB_NAME, JOB_KEY)
);
-- Job Execution Table
CREATE TABLE BATCH_JOB_EXECUTION
(
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
VERSION BIGINT,
JOB_INSTANCE_ID BIGINT NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
START_TIME TIMESTAMP NULL DEFAULT NULL,
END_TIME TIMESTAMP NULL DEFAULT NULL,
STATUS VARCHAR(10),
EXIT_CODE VARCHAR(2500),
EXIT_MESSAGE VARCHAR(2500),
LAST_UPDATED TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
FOREIGN KEY (JOB_INSTANCE_ID) REFERENCES BATCH_JOB_INSTANCE (JOB_INSTANCE_ID)
);
-- Job Execution Params Table
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS
(
JOB_EXECUTION_ID BIGINT NOT NULL,
TYPE_CD VARCHAR(6) NOT NULL,
KEY_NAME VARCHAR(100) NOT NULL,
STRING_VAL VARCHAR(250) NULL,
DATE_VAL DATETIME NULL,
LONG_VAL BIGINT NULL,
DOUBLE_VAL DOUBLE PRECISION NULL,
IDENTIFYING CHAR(1) NOT NULL,
FOREIGN KEY (JOB_EXECUTION_ID) REFERENCES BATCH_JOB_EXECUTION (JOB_EXECUTION_ID)
);
-- Step Execution Table
CREATE TABLE BATCH_STEP_EXECUTION
(
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
VERSION BIGINT NOT NULL,
STEP_NAME VARCHAR(100) NOT NULL,
JOB_EXECUTION_ID BIGINT NOT NULL,
START_TIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
END_TIME TIMESTAMP NULL 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 TIMESTAMP,
FOREIGN KEY (JOB_EXECUTION_ID) REFERENCES BATCH_JOB_EXECUTION (JOB_EXECUTION_ID)
);
-- Step Execution Context Table
CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT
(
STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT,
FOREIGN KEY (STEP_EXECUTION_ID) REFERENCES BATCH_STEP_EXECUTION (STEP_EXECUTION_ID)
);
-- Job Execution Context Table
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT
(
JOB_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT TEXT,
FOREIGN KEY (JOB_EXECUTION_ID) REFERENCES BATCH_JOB_EXECUTION (JOB_EXECUTION_ID)
);
참고자료 : https://docs.spring.io/spring-batch/reference/schema-appendix.html#metaDataSchema
배치 메타데이터 테이블들이 생성된 것을 확인할 수 있다!🫠
이번 기회에 Spring batch에 대해 많이 공부했으니 만족..................🫠