KIDO 님의 SpringBatch 연재 시리즈를 보면서 따라하는 과정으로 스터디를 진행한다.
1주차 : https://devocean.sk.com/blog/techBoardDetail.do?ID=166164
[[SpringBatch 연재 01] SpringBatch 빠르게 시작하기
devocean.sk.com](https://devocean.sk.com/blog/techBoardDetail.do?ID=166164)
Spring Batch 초기화 및 스프링 배치 필요정보
- https://start.spring.io 에서 다음처럼 스프링 배치를 위한 기본 프로젝트 설정
- 3.2.2 버전이 없어서 3.3.4 버전으로 진행했다.
- Dependecies에 Spring Batch를 검색해 설정을하면 밑에 같이 추가되어 있다.
- spring-boot-starter-batch 라는 의존성 파일이 추가 되었다.
배치 가동시키기
- @EnableBatchProcessing 어노테이션을 이용해 기본적 스프링 배치 모드로 동작한다.
실행하기
- gradle :bootRun 명령이 안되서 그냥 Run 버튼을 눌러서 실행했다.
- 위 같이 에러가 나타났으며 실행하기 위해서는 DataSource가 필요하다고 하며 기본 설정이 없다고 얘기하는 내용이다.
DataSource 구성하기
- 별도로 MySQL 설치보단 MemoryDB를 이용하도록 설정한다. 이들은 경량의 메모리 기반/ 파일기반 데이터 베이스다.
- H2 Database, HSQL Database, Apache Derby Database 총 세가지를 알려주었다.
- 나는 H2 Databse 를 사용한다.
- H2 Database 특징은 메모리 데이터베이스이며 경량하고 빠른속도를 보이며 자체 웹 콘솔을 제공한다.
- application.yaml 파일이 없어 생성한 후 다음과 같이 작성했다.
- 의존성도 추가를 해줘야한다. build.gradle 에 다음을 추가한다.
implementation 'com.h2database:h2:2.2.224'
# H2 DataBase용
spring:
datasource:
hikari:
maximum-pool-size: 10
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password: password
다시 실행해보기
- 정상적으로 수행이 된다!
스프링배치 스키마 구조
- 스프링배치를 수행하면 배치를 위한 스키마가 자동생성 된다.
- 스키마 구조
BATCH_JOB_INSTANCE Table
- 스키마 중 기본이 되는 배치 잡 인스턴드 테이블이다
- 배치 수행시 Job이 생성되며 해당 잡 인스턴스에 관련된 모든 정보를 가진 최상위 테이블이다.
CREATE TABLE BATCH_JOB_INSTANCE (
JOB_INSTANCE_ID BIGINT PRIMARY KEY , ## 인스턴스에 대한 유니크 아이디
VERSION BIGINT, ## 버전 정보
JOB_NAME VARCHAR(100) NOT NULL , ## 배치잡 객체로 획득한 잡이름
JOB_KEY VARCHAR(32) NOT NULL ## JobParameter를 직렬화한 데이터값이며, 동일한 잡을 다른 잡과 구분하는 값이다
);
-
BATCH_JOB_EXECUTION_PARAMS Table
- JobParameter에 대한 정보 저장하는 테이블이다.
- 여기는 하나 이상의 key/value 쌍으로 Job에 전달되고 실행 될때 파라미터 정보를 저장한다.
- 파 라미터는 IDENTIFYING이 true로 설정되면, JobParameter 생성시 유니크한 값으로 사용된경우라는 의미
- 테이블은 비정규화이다.
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS (
JOB_EXECUTION_ID BIGINT NOT NULL , ## 잡 실행 아이디 BATCH_JOB_EXECUTION으로 온 외래키 각 실행 마다 (키/값)이 저장됨
PARAMETER_NAME VARCHAR(100) NOT NULL , ## 파라미터 이름
PARAMETER_TYPE VARCHAR(100) NOT NULL , ## 파라미터의 타입
PARAMETER_VALUE VARCHAR(2500) , ## 파라미터 값
IDENTIFYING CHAR(1) NOT NULL , ## 파라미터가 JobInstance의 유니크성을 위해 사용된 파라미터라면 true로 세팅
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
);
## 이 테이블은 기본키가 없다.
BATCH_JOB_EXECUTION Table
- JobExecution과 관련된 모든 정보를 저장
- Job 매번 실행 시 JobExecution 이라는 새로운 객체가 있고, 이 테이블에 새로운 row가 생성
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT PRIMARY KEY , ## 배치자 실행 아이디, 실행을 유니크하게 구분할 수 있다
VERSION BIGINT, ## 버전정보
JOB_INSTANCE_ID BIGINT NOT NULL, ## BATCH_JOB_INSTANCE 테이블의 기본키로 외래키이다. 이는 execution이 소속된 인스턴스가 된다. 하나의 인스턴스에는 여러 execution이 있을 수 있다.
CREATE_TIME TIMESTAMP NOT NULL, ## execution 생성된 시간
START_TIME TIMESTAMP DEFAULT NULL, ## execution 시작된 시간
END_TIME TIMESTAMP DEFAULT NULL, ## execution 종료된 시간
STATUS VARCHAR(10), ## execution의 현재 상태를 문자열로 나타낸다
EXIT_CODE VARCHAR(20), ## execution의 종료 코드를 문자열로 나타낸다
EXIT_MESSAGE VARCHAR(2500), ## job이 종류되는 경우 어떻게 종료되었는지를 나타낸다
LAST_UPDATED TIMESTAMP, ## execution이 마지막으로 지속된 시간을 나타내는 타임스탬프이다.
constraint JOB_INSTANCE_EXECUTION_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
BATCH_STEP_EXECUTION Table
- StepExecution과 관련된 모든 정보를 가진다.
- 여러 면에서 BATCH_JOB_EXECUTION 테이블과 유사하며 생성된 각 JobExecution에 대한 단계당 항목이 항상 하나 이상이 있다.
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_INSTANCE_ID BIGINT NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT NULL,
END_TIME TIMESTAMP DEFAULT NULL,
STATUS VARCHAR(10),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500),
LAST_UPDATED TIMESTAMP,
constraint JOB_INSTANCE_EXECUTION_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
- JOB_EXECUTION_ID: 배치자 실행 아이디, 실행을 유니크하게 구분할 수 있다. 칼럼의 값은 JobExecution 의 getId메소드로 획득이 가능하다.
- VERSION: 버젼정보
- JOB_INSTANCE_ID: BATCH_JOB_INSTANCE 테이블의 기본키로 외래키이다. 이는 execution이 소속된 인스턴스가 된다. 하나의 인스턴스에는 여러 execution이 있을 수 있다.
- CREATE_TIME: execution이 생성된 시간이다.
- START_TIME: execution이 시작된 시간이다.
- END_TIME: execution이 종료된 시간이다. 성공이든 실패든 남게된다. 잡이 현재 실행중이 아닐때 열의 값이 비어 있다면, 특정 유형의 오류가 발생하여 프레임워크가 실패하기전 마지막 저장을 수행할 수 없음을 나타낸다.
- STATUS: execution의 현재 상태를 문자열로 나타낸다. COMPLETED, STARTED 및 기타, 이는 BatchStatus 나열값으로 채워진다.
- EXIT_CODE: execution의 종료 코드를 문자열로 나타낸다. 커맨드라인 잡의 케이스에서는 숫자로 변환된다.
- EXIT_MESSAGE: job이 종류되는 경우 어떻게 종료되었는지를 나타낸다. 가능하다면 stack trace값이 남게 된다.
- LAST_UPDATED: execution이 마지막으로 지속된 시간을 나타내는 타임스탬프이다.
BATCH_JOB_EXECUTION_CONTEXT Table
- StepExecution과 관련된 모든 정보를 가진다.
- 이 테이블은 여러 면에서 BATCH_JOB_EXECUTION 테이블과 유사하며 생성된 각 JobExecution에 대한 단계당 항목이 항상 하나 이상이 있다.
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,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT NULL ,
END_TIME TIMESTAMP 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(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXECUTION_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
BATCH_STEP_EXECUTION_CONTEXT Table
- ExecutionContext 에 대한 모든 정보를 저장한다.
- 이것은 매 JobExecution마다 정확히 하나의 JobExecutionContext를 가진다. 여기에는 특정 작업 실행에 필요한 모든 작업 수준 데이터가 포함되어 있다.
- 이 데이터는 일반적으로 실패 후 중단된 부분부터 시작될 수 있도록 실패후 검색해야하는 상태를 나타낸다.
CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
JOB_EXECUTION_ID BIGINT PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT CLOB,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
- JOB_EXECUTION_ID: job execution 테이블에 대한 아이디로 외래키이다. 여기에는 주어진 execution마다 여러개의 row가 쌓인다.
- SHORT_CONTEXT: SERIALIZED_CONTEXT 의 문자로된 버젼이다.
- SERIALIZED_CONTEXT: 직렬화된 전테 컨텍스트이다.
SpringBatch Sequences
- 스프링배치는 기본적으로 시퀀스 테이블이 존재한다.
BATCH_JOB_SEQ
- 배치 잡에 대한 시퀀스 테이블이다.
- ID:
- bigint
- 배치 잡의 기본키를 나타낸다.
- UNIQUE KEY
- char(1)
- 배치잡 시퀀스를 구별하는 유니크 PK
BATCH_JOB_EXECUTION_SEQ
- 배치잡 execution의 시퀀스 테이블이다.
- ID:
- bigint
- 배치 잡 execution 의 기본키를 나타낸다.
- UNIQUE KEY
- char(1)
- 배치잡 execution 시퀀스를 구별하는 유니크 PK
BATCH_STEP_EXECUTION_SEQ
- 배치 스텝의 execution 시퀀스 테이블이다.
- ID:
- bigint
- 배치 스텝 execution 의 기본키를 나타낸다.
- UNIQUE KEY
- char(1)
- 배치 스텝 execution 시퀀스를 구별하는 유니크 PK
- 위 시퀀스를 통해서 Batch_Job_Instance, Batch_Execution, Batch_Step_Execution 의 시퀀스를 배치가 할당하며, 이 값은 중복될 수 없다.
WrapUp
- 지금까지 작업으로 스프링 배치를 위한 가장 기본적인 설정을 했다.
- 스프링 배치는 자체 배치 작업을 수행하기 위해서 데이터베이스가 필요하고
- @EnableBatchProcessor 를 설정하면 실행될때 배치를 위한 테이블이 자동으로 생성이 된다.
- 자동으로 생성된 각 테이블을 살펴 보았고, 어떠한 데이터가 저장되는지 확인할 수 있었다.
- gradle :bootRun 명령이 왜 안되는지 알아봐야 겠다.
참고자료
- https://docs.spring.io/spring-batch/reference/schema-appendix.html
Meta-Data Schema :: Spring Batch
The Spring Batch Metadata tables closely match the domain objects that represent them in Java. For example, JobInstance, JobExecution, JobParameters, and StepExecution map to BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_EXECUTION_PARAMS, and BATCH_ST
docs.spring.io
- https://cheese10yun.github.io/spring-batch-basic/#undefined
Spring Batch 간단 정리 - Yun Blog | 기술 블로그
Spring Batch 간단 정리 - Yun Blog | 기술 블로그
cheese10yun.github.io