본문 바로가기
Spring Batch

Spring Batch 개발기 ( 3. Mysql 사용하기 )

by SICDev 2021. 6. 25.
반응형

 

Spring Batch에서 MySQL 사용하기

Spring Batch를 사용하기 위해서는 메타 데이터 테이블들이 필요하다😒

Spring Batch의 메타 데이터 테이블들에는 아래의 정보들이 들어가있다❗❗

지금까지 실행되었던 Job들의 목록
성공한 Job, 실패한 Job의 Batch Parameter
Job안에 있던 Step의 정보, 성공한 Step과 실패한 Step의 정보 등등...

 

Spring Batch를 운영하기 위해 많은 정보들이 메타 테이블에 나뉘어져 들어가게된다😁😁

( 출처:  metaDataSchema  )

위의 테이블들이 없으면 Spring Batch를 사용할 수 없다❗

나는 위의 테이블들을 추가한적이 없는데....❓🤔🤔

기본적으로 H2 DB를 사용했기 때문인데, H2 DB는 Spring Boot가 실행될때 자동으로 위의 테이블들을 추가해준다😮😮

MySQL을 사용하기 위해서는 위의 테이블들 직접 생성해주어야한다❗( Oracle과 같은 DB도 마찬가지 )


Intellij IDE로 이동해보자❗

[Ctrl]+[Shift]+N 단축키를 이용해 파일 검색창을 열고 schema라고 검색해보자👍

DBMS에 맞춰서 메타 데이터 테이블들이 정의 되어있다❗

 

schema-mysql-sql을 선택해서 들어가보면 이렇게 테이블을 생성할 수 있는 쿼리들이 들어가져 있다.

모두 복사해서 MySQL에서 실행하면된다❗❗

-- Autogenerated: do not edit this file

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),
	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(6) 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(6) NOT 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_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);

실행전에 프로젝트와 MySQL을 연결하자👍

MySQL 설치는 되어있다고 가정을 하겠다😢 이것까지 다루기엔 너무......🤦‍♂️🤦‍♂️

 

jdbc-url: jdbc:mysql://localhost:3306/batchTest 의 경우 본인의 PC에 설치했다면 localhost를 적으면되고 외부 서버에 설치했다면 서버의 IP를 적어주면된다.

포트는 기본으로 3306포트이 설정되어있을 것이다❗

toyproject는 생성한 DB이름이다❗

 

DB에 메타 데이터 테이블을 저장하기 전에 배치를 다시 한번 실행시켜보면...😒

BATCH_JOB_INSTANCE가 존재하지 않아서 에러가난다❗

 

그럼 메타 데이터 테이블들 생성하고 다시 한번 실행시켜 보자❗❗

 

짜잔❗ 아주 잘 실행 되었다❗

 

다음엔 메타 데이터 테이블들에 대해 간단히 알아보자❗❗😊

 

 

 

 

 

출처

https://jojoldu.tistory.com/324?category=902551
반응형