본문 바로가기
Practice/SpringBatch

Day 1. Spring-Batch 환경 설정

반응형

Spring-Batch의 기본 개념을 정리하고, 간단한 실습 환경부터 연습해보는 포스팅입니다

참고

Spring-Batch 공식문서(4.3.3 기준)

https://docs.spring.io/spring-batch/docs/4.3.3/reference/html/

 

Spring Batch - Reference Documentation

Welcome to the Spring Batch reference documentation! This documentation is also available as single html and pdf documents. The reference documentation is divided into several sections: The following appendices are available: Lucas Ward, Dave Syer, Thomas

docs.spring.io

 

 

이동욱님의 블로그

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

 

1. Spring Batch 가이드 - 배치 어플리케이션이란?

Spring Batch In Action이 2011년 이후 개정판이 나오지도 않고 (2019.03 기준), 한글 번역판도 없고, 국내 Spring Batch 글 대부분이 튜토리얼이거나 공식 문서 중 일부분을 짧게 번역한 내용들이라 대용량 시

jojoldu.tistory.com


레포지토리 환경 설정

  • 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을 생성할 수 도 있다

 

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