Flyway 때문에 Spring Batch가 안돌아간다고요..?

호기성세균·2024년 5월 14일
0

트러블슈팅

목록 보기
11/20
post-thumbnail

❌ 문제 발견 ❌

스프링 배치는 대량의 데이터 처리에 최적화된 프레임워크로, 정확하고 효율적인 배치 처리를 가능하게 한다.
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에 대해 많이 공부했으니 만족..................🫠

profile
공부...열심히...

0개의 댓글