상세 컨텐츠

본문 제목

Spring Batch - 메타 테이블

Spring/Spring Batch

by Chan.94 2022. 10. 12. 08:39

본문

반응형

메타 테이블

Spring Batch에선 실행 및 관리 목적으로 Job, Step, JobParameters 등 여러 도메인들의 정보를 관리(CRUD)할 수 있는 스키마를 제공한다. inMemory가 아닌 DB와 연동할 겨우 메타 테이블이 생성되어야 하는데, 이러한 메타 테이블은 Spring Batch 라이브러리에 존재하며 DB 유형별로 제공되니 사용하는 DB에는 적절한 sql을 확인하면 된다.

/org/springframework/batch/core/schema-*.sql

 

메타 테이블 존재 이유

BatchJob이 실행될 때마다 그 BatchJob에 관련한 모든 것을 꼼꼼하고 세세하게 기록한다. 우리가 만든 배치 프로세스는 대개의 경우 어떤 주기에 따라 반복적으로 실행될 것이다. BatchJob에 대한 실행 정보뿐 아니라 BatchJob안에 단계별 실행 여부 그리고 그 실행에 대한 성공과 실패 여부까지 세세히 알 수 있으니, 우리는 일련의 배치 프로세스가 우리의 기대했던 것과 다르게 동작하였을 때 효율적으로 대응할 수가 있게 된다. (Log를 보고 파악하는 것보다 포인트를 빨리 찾을 수 있을 것이다.)

 

 

수동 생성 방법

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);

 

자동생성 방법

properties
spring.batch.jdbc.initialize-schema: ALWAYS #(EMBEDDED,NEVER)
  • ALWAYS : 스크립트는 항상 실행되고 RDBMS설정이 되어 있을 경우 내장  DB보다 우선 실행한다.
  • EMBEDDED : 내장 DB일 때만 실행되며 스키마가 자동 생성된다. (DEFAULT)
  • NEVER: 스크립트 항상 실행 안 하고 내장 DB일 경우 스크립트 생성이 되지 않아 오류가 발생한다.

Job

BATCH_JOB_INSTANCE

Job의 생성 정보를 담는 테이블입니다.

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;
  • JOB_INSTANCE_ID : Job 고유 ID
  • VERSION : 변경 버전 정보 (update 될 때마다 +1)
  • JOB_NAME : Job을 빌드할 당시 부여한 Job의 이름
  • JOB_KEY : Job 고유 키 (Job 중복 수행 체크를 위한 고유 키 로써, Job_name과 파라미터로 키값이 결정됨

BATCH_JOB_EXECUTION

Job의 실행 정보가 저장되며 Job 생성, 시작, 종료 시간, 실행 상태, 메시지 등을 관리한다.

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;
  • JOB_EXECUTION_ID : Job 실행 고유 ID
  • VERSION : 변경 버전 정보 (update 될 때마다 +1)
  • JOB_INSTANCE_ID : Job 고유 ID
  • CREATE_TIME : 생성 시간
  • START_TIME : 시작 시간
  • END_TIME : 종료 시간
  • STATUS : 실행 상태 (BatchStatus)
                     
    ex) COMPLETED, FAILED, STOPPED, STARTED, …
  • EXIT_CODE : 종료 코드 (ExitStatus)
                            ex) COMPLETED, FAILED, UNKNOWN, …
  • EXIT_MESSAGE : Job 수행 실패 시 메시지
  • LAST_UPDATED : 최종 업데이트 시간
  • JOB_CONFIGURATION_LOCATION : Job config 설정 위치

BATCH_JOB_EXECUTION_PARAMS
Job과 함께 실행되는 JobParameter 정보를 저장한다.

String, Date, Long, Double 네 가지 타입의 값만 사용이 가능하며, 해당 파라미터가 Job Instance 생성에 관여한다.

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;
  • JOB_EXECUTION_ID : JobExecution 식별 키로 JOB_EXECUTION과 1:N 관계
  • TYPE_CD : String, Long, Date, Double 타입 정보
  • KEY_NAME : 파라미터 키 값
  • STRING_VAL : 파라미터 문자 값
  • DATE_VAL : 파라미터 날짜 값
  • LONG_VAL : 파라미터 Long 값
  • DOUBLE_VAL : 파라미터 Double 값
  • IDENTIFYING : 식별 여부(true, false)

 

BATCH_JOB_EXECUTION_CONTEXT
Job의 실행 동안 여러 가지 상태 정보나 공유 데이터를 JSON형태로 직렬화 해서 저장한다.
Step 간 데이터 공유가 가능하다.

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;
  • JOB_EXECUTION_ID : JobExecution 식별키로 JOB_EXECUTION마다 각 생성된다.
  • SHORT_CONTEXT : JOB의 실행 상태 정보로 공유 데이터 등의 정보를 문자열로 저장한다.
  • SERIALIZED_CONTEXT : 직렬화(Serialized) 된 전체 CONTEXT를 저장한다.

 

Step

BATCH_STEP_EXECUTION
Job Execution하위에 Step Execution이 만들어지고, 디테일한 배치 작업 정보들이 기록된다.

Step의 실행 정보가 저장되며 생성, 시작, 종료시간, 실행상태, 메시지 등을 관리한다.

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;
  • STEP_EXECUTION_ID: Step의 실행 정보 기본 키
  • VERSION: 업데이트될 때마다 1씩 증가
  • STEP_NAME: Step을 구성할 때 부여하는 Step 이름
  • JOB_EXECUTION_ID: JobExecution 기본키로 JobExecution과 1:N 관계
  • START_TIME: 실행(Execution)이 시작된 시점
  • END_TIME: 실행(Execution)이 종료된 시점으로 Job 실행 도중 오류로 인해 중단된 경우 값이 저장되지 않을 수 있다.
  • STATUS: 실행 상태(BatchStatus)를 저장한다.(ex: COMPLETED, FAILED, STOPPED, STARTED, …)
  • COMMIT_COUNT:  트랜잭션 당 커밋되는 수 
  • READ_COUNT: 실행 시점에 Read 한 Item count
  • FILTER_COUNT: 실행 도중 필터링 된 item수 
  • WRITE_COUNT: 실행도중 저장되고 커밋된 Item 수
  • READ_SKIP_COUNT: 실행도중 Read가 건너뛰어진(Skip) Item 수
  • WRITE_SKIP_COUNT: 실행도중 Write가 건너뛰어진(Skip) Item 수
  • PROCESS_SKIP_COUNT: 실행도중 Process가 건너뛰어진(Skip)된 Item 수
  • ROLLBACK_COUNT: 실행도중 Rollback이 일어난 수 
  • EXIT_CODE: 실행 종료 코드(ExitStatus)를 저장한다.
  • EXIT_MESSAGE: Status가 실패일 경우 실패 원인 내용을 저장한다.
  • LAST_UPDATED: 마지막 실행(Execution) 시점

 

BATCH_STEP_EXECUTION_CONTEXT
Step의 실행 동안 여러 가지 상태 정보와 공유 데이터를 JSON형태로 직렬화 하여 저장한다.
Step별로 저장되며 Step 간에 서로 공유할 수 없다.

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;
  • STEP_EXECUTION_ID: StepExecution 식별 키, STEP_EXECUTION 마다 각 생성된다.
  • SHORT_CONTEXT:  STEP의 실해 상태 정보, 공유 데이터 등의 정보를 문자열로 저장한다.
  • SERIALIZED_CONTEXT: 직렬화(Serialized)된 전체 컨텍스트
반응형

관련글 더보기

댓글 영역

>