@EnableBatchProcessing
-
스프링 배치를 활성화하기 위해 사용되는 어노테이션
-
빈으로 등록된 Job을 검색하여 실행 되도록 함
- SimpleBatchConfiguration.class 실행
- BatchConfigurerConfiguration.class 실행
- BasicBatchConfigurer
- JpaBatchConfigurer
- BatchAutoConfiguration.class 실행
@Configuration선언- JobBuilderFactory
- JobBuilder 생성 -> Job 생성
- StepBuilderFactory
- StepBuilder 생성 -> Step 생성
- Job
- Step
- tasklet
- 비즈니스 로직이 포함
- Job 구동 >> Step 실행 >> Tasklet 실행
여러 배치 관련 정보들을 저장할 수 있는 스키마를 제공한다.
- wsl2로 도커 설치
- window terminals를 활용해 컨테이너 생성
# 설치 확인(버전 확인)
docker -v
# MySQL 도커 이미지 다운
docker pull mysql
# 다운로드한 Docker Image 확인
docker images
# 컨테이너 생성 및 실행
docker run -p 3306:3306 --name springboot-mysql -e MYSQL_ROOT_PASSWORD=0000 -e MYSQL_DATABASE=springbatch -e MYSQL_USER=yooyeon -e MYSQL_PASSWORD=yooyeon1234@ -d mysql
# docker container 리스트
docker ps -a
# 컨테이너 삭제
docker rm '컨테이너 이름'
또는
docker rm '컨테이너 id'- 기타 명령어
# 컨테이너 시작
docker start springboot-mysql
# 컨테이너 중지
docker stop springboot-mysql
# 컨테이너 재시작
docker restart springboot-mysql- 인텔리제이에서 컨테이너 실행
# 실행
docker start springboot-mysql
# 확인
docker ps- spring-batch-core 라이브러리에 org.springframework.batch.core/schema-mysql.sql에 메타데이터 테이블 생성 쿼리문이 담겨있다. 수동으로 생성하려면 다음 명령문을 실행하면 된다.
-- 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);
application.yml 파일에서 자동 생성 설정을 할 수 있다. batch.jdbc.initialize-schema
- 테이블
- BATCH_JOB_INSTANCE
- JobInstance 관련 정보를 가지고 있다.
- BATCH_JOB_EXECUTION_PARAMS
- JobParameter 관련 정보를 저장한다.
- BATCH_JOB_EXECUTION
- JobExecution과 관련된 정보를 저장한다. 잡이 실행될 때마다 새로운 JobExecution이 생성된다.
- BATCH_JOB_INSTANCE
-
BATCH_JOB_EXECUTION_CONTEXT - JobExecution마다 하나의 JobExecution을 가지고있다. - Job이 실행되는 동안 상태정보를 저장한다. - Step간 공유할 수 있다.
- BATCH_STEP_EXECUTION
- Step의 실행 정보가 저장된다.
- BATCH_STEP_EXECUTION_CONTEXT
- Step의 실행동안 여러 상태 정보를 저장한다.
- Step 간 공유 불가능하다.
- BATCH_STEP_EXECUTION
Job 실행
BATCH_JOB_INSTANCE 테이블에 job 정보가 생성되었다.

-
배치 작업, Flow
-
하나 이상의 Step을 가져야 함
-
전체 배치 처리의 최상단 개념
-
배치 처리 과정을 하나의 단위로 만들어 표현한 객체
-
기본 구현체
- SimpleJob: step을 순처적으로 실행, step이 실패하면 job이 실패
- FlowJob: flow를 통한 복잡한 처리, 조건/흐름에 따라 step을 구성하여 실행
