[Spring Batch] MySQL

반응형

이번글에서는 MySQL을 사용해 Spring Batch를 실행하는 방법에 대해 알아보도록 하겠습니다.

1. H2

이전글에서 사용한 코드를 동일하게 사용하도록 하겠습니다.

우리는 이전글에서 간단하게 Spring Batch Application이 작동하는 것을 확인했습니다.

이때 MySQL이나 Oracle과 같은 DB를 사용한다고 명시하지 않았기 때문에, Spring Boot의 Default DB인 H2를 사용해 Spring Batch가 수행되었다고 생각할 수 있습니다.

2. MySQL

그렇다면 MySQL을 사용할때도 동일하게 별다른 설정 없이 Spring Batch가 작동할 수 있을까요?..

정답은 그렇지 않습니다.😅

내장 DB인 H2를 제외한 DB에서 Spring Batch를 사용하기 위해서는, DB에 Spring Batch Meta Data Table을 직접 생성해줘야 합니다.

H2는 이와 같은 테이블을 Boot Application이 실행할 때 자동으로 생성해줍니다.

2-1) meta data table

이때 Meta Data란 데이터를 설명하는 데이터라고 해석할 수 있습니다.

Spring Batch의 Meta Data는 다음과 같은 내용을 담고 있습니다.

• 이전에 실행한 Job에는 어떠한 것들이 있는지

• 최근 실패한 Batch Parameter가 어떤것들이 있고, 성공한 Job은 어떤것 들이 있는지

• 실패한 Job을 다시 실행한다면 어디서 부터 시작하면 될지

• 어떤 Job에 어떤 Step들이 있었고, Step들 중 성공한 Step과 실패한 Step 들은 어떤 것들이 있는지

위와 같이 Meta Data는 Spring Batch 어플리케이션을 운영하기 위한 데이터를 가지고 있으며, 여러개의 테이블에 나눠져 담겨있게 됩니다.

따라서 위와 같은 테이블이 DB에 생성되 있어야만 Spring Batch가 정상적으로 작동합니다.

2-2) create table

MySQL에 Spring Batch Meta Data Table을 생성하는 방법은 다음과 같습니다.

먼저 IDE에서 file 검색으로 'schema-'를 검색해 Spring Batch에서 생성해놓은 Spring Batch Meta Data Table 스키마를 찾습니다.

이때 각자 사용하고자하는 DB에 맞는 schema를 사용하면 됩니다. 저는 MySQL을 사용할 것이므로 schema-mysql.sql 파일의 스키마를 사용하도록 하겠습니다.

이후 이를 그대로 복사해 create table 구문으로 table을 생성하면 됩니다.

schema-mysql.sql

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 NOT NULL,
    START_TIME DATETIME DEFAULT NULL ,
    END_TIME DATETIME DEFAULT NULL ,
    STATUS VARCHAR(10) ,
    EXIT_CODE VARCHAR(2500) ,
    EXIT_MESSAGE VARCHAR(2500) ,
    LAST_UPDATED DATETIME,
    JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
    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 ,
    TYPE_CD VARCHAR(6) NOT NULL ,
    KEY_NAME VARCHAR(100) NOT NULL ,
    STRING_VAL VARCHAR(250) ,
    DATE_VAL DATETIME DEFAULT NULL ,
    LONG_VAL BIGINT ,
    DOUBLE_VAL DOUBLE PRECISION ,
    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,
    START_TIME DATETIME NOT NULL ,
    END_TIME DATETIME 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,
    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_SEQ (
    ID BIGINT NOT NULL,
    UNIQUE_KEY CHAR(1) NOT NULL,
    constraint UNIQUE_KEY_UN unique (UNIQUE_KEY)
) ENGINE=InnoDB;

INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) select * from (select 0 as ID, '0' as UNIQUE_KEY) as tmp where not exists(select * from BATCH_JOB_SEQ);

create table SQL을 수행한 뒤 DB를 확인해보면 아래와 같이 batch meta data table 들이 정상적으로 생성된 것을 확인할 수 있습니다.

2-3) run batch job

Batch Job을 Run 해보겠습니다.

위와 같이 Batch Job이 정상적으로 수행되는 것을 확인할 수 있습니다. 👏👏👏


참고 자료 : https://jojoldu.tistory.com/325


추천서적

 

스프링5 레시피:스프링 애플리케이션 개발에 유용한 161가지 문제 해결 기법

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Spring > Batch' 카테고리의 다른 글

[Spring Batch] Meta Data Table  (0) 2020.08.17
[Spring Batch] Batch Job  (0) 2020.08.17
[Spring Batch] Batch Application  (0) 2020.08.17

댓글

Designed by JB FACTORY