반응형
Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다
참고
Spring-Batch 공식문서(4.3.3 기준)
https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/
이동욱님의 블로그
https://jojoldu.tistory.com/324?category=902551
레포지토리 환경 설정
- Java 11
- SpringBoot 2.5.4
- Spring-Batch
- Spring Data JPA
- H2
- MySQL
- Lombok 1.18
- Gradle
간단한 job 만들기
- @EnableBatchProcessing
// Main class @EnableBatchProcessing @SpringBootApplication public class ToySpringbatchApplication { public static void main(String[] args) { SpringApplication.run(ToySpringbatchApplication.class, args); } }
- Spring-Batch 기능을 이용하기 위해 반드시 선언해줘야하는 어노테이션
- 미리 정의된 설정(기본 생성 빈들)을 실행시키는 역할
정의된 빈 클래스 빈 이름 JobRepository jobRepository JobLauncher jobLauncher JobRegistry jobRegistry PlatformTransactionManager transactionManager JobBuilderFactory jobBuilders StepBuilderFactory stepBuilders
- Job은 하나의 배치 작업 단위
- Job안에 여러 Step이 존재
- Step은 커스텀한 Tasklet 혹은 ItemReader, ItemProcessor, ItemWriter의 조합으로 이루어짐
- Tasklet과 ItemReader, ItemProcessor, ItemWriter의 세트가 혼합되어 사용될 순 없음
- SimpleJob 만들어보기
// create simpleJob @Slf4j @RequiredArgsConstructor @Configuration public class SimpleJobConfiguration { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; @Bean public Job simpleJob() { return jobBuilderFactory.get("simpleJob") .start(simpleStep1()) .build(); } @Bean public Step simpleStep1() { return stepBuilderFactory.get("simpleStep1") .tasklet((contribution, chunkContext) -> { log.info(">>>>> This is Step1"); return RepeatStatus.FINISHED; }) .build(); } }
- Batch Job 생성
- 이미 생성되어있는 빈 jobBuilderFactory을 이용해 get method로 주어진 JobName을 기반으로 생성한다
- jobBuilderFactory.get("simpleJob")
- 메서드 체이닝을 통해 해당 Job에서 실행한 Step들을 정의해준다 ( 여러 스텝을 하나의 job에 정의 )
- Step 생성
- 이미 생성되어있는 빈 stepBuilderFactory를 이용해 get metohd로 주어진 JobName을 기반으로 생성
- stepBuilderFactory.get("simpleStep1")
- 커스텀한 tasklet을 통해 step을 생성할 수 도, itemReader, itemProcessor, ItemWriter의 흐름을 통해 step을 생성할 수 도 있다
- Batch Job 생성
MySQL 환경의 SpringBatch 만들어보기
메타 테이블 등록
- SpringBatch를 동작시키기 위해서는 메타데이터를 담을 수 있는 테이블이 필요합니다
- 메타 테이블 DDL 스키마
- org.springframework.batch:spring-batch-core:{version} 라이브러리 안에 있는 spring-batch-core-{version}.jar
- org.springframework.batch.core 패키지 안 schema-{사용할 database}.sql 에 해당 테이블을 생성할 수 있는 스키마가 정의되어 있습니다
- 4.3.3 버전 기준 스키마
-- 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);
- H2 데이터베이스를 이용할 경우 SpringBoot가 자동으로 테이블을 생성해주지만 Oracle, MySQL을 이용하기 위해서는 직접 해당 DDL문으로 테이블을 생성해줘야합니다
MySQL Config 등록
- application.yml 파일 수정
# application.yml server: port: 9090 spring: profiles: active: local --- spring: config: activate: on-profile: local datasource: hikari: jdbc-url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: driver-class-name: org.h2.Driver --- spring: config: activate: on-profile: mysql datasource: hikari: jdbc-url: jdbc:mysql://localhost:3306/toy_spring_batch?serverTimezone=UTC&characterEncoding=UTF-8 username: root password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver
- local profile은 h2 데이터베이스(임베디드)로 놔두고, mysql profile을 추가하여 toy_spring_batch 데이터베이스에 연결
- 아직 메타 테이블 등록을 안했기 때문에 mysql profile로 어플리케이션을 실행시키면 아래처럼 에러가 납니다
- 메타 테이블 생성
- 본인의 로컬 MySQL에 위에 정의된 스키마를 이용해 메타테이블을 생성
- 다시 mysql profile로 어플리케이션을 실행하면 정상적으로 실행되는 것을 확인할 수 있습니다!!
728x90
반응형
'Practice > SpringBatch' 카테고리의 다른 글
Day 5. Spring Batch Chunk (0) | 2021.10.07 |
---|---|
Day 4. Spring Batch Scope (0) | 2021.09.09 |
Day 3. Spring Batch Job 흐름 정의 (0) | 2021.09.05 |
Day 2. SpringBatch Job 메타 테이블이란? (0) | 2021.09.04 |