SPRING/스프링배치

DB스키마 생성 하기 및 설명

노트코드 2022. 6. 27. 01:25

프로젝트 셋팅

더보기
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
  batch:
    jdbc:
      initialize-schema: embedded

---
spring:
  config:
    activate:
      on-profile: mysql
  datasource:
    hikari:
      jdbc-url: jdbc:mysql://localhost:3306/batch?useUnicode=true&characterEncoding=utf8
      username: root
      password: password
      driver-class-name: com.mysql.jdbc.Driver
  batch:
    jdbc:
      initialize-schema: always

 

  • 실행 코드
package io.springbatch.springbatchlecture;

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class DBJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    @Bean
    public Job job(){
        return jobBuilderFactory.get("job")
                .start(step1())
                .next(step2())
                .build();
    }

    private Step step2() {
        return stepBuilderFactory.get("step2")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("**************************");
                        System.out.println("step2");
                        System.out.println("**************************");

                        return RepeatStatus.FINISHED;
                    }
                }).build();

    }

    private Step step1() {
        return stepBuilderFactory.get("step1")
                .tasklet(new Tasklet() {
                    @Override
                    public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
                        System.out.println("**************************");
                        System.out.println("step1 ");
                        System.out.println("**************************");
                        return RepeatStatus.FINISHED;
                    }
                }).build();
    }
}

 

 

JOB 관련 테이블

  • BATCH_JOB_INSTANCE
    • job이 실행될 때 jobinstance 정보가 저장되며 job_name과 job_key를 키로 하여 하나의 데이터가 저장
    • 동일한 job_name과 job_key로 중복 저장할 수 없다
JOB_INSTANCE_ID 고유하게 식별할 수 있는 기본키
VERSION 업데이트 될 때마다 1씩 증가
JOB_NAME job을 구성할 때 부여하는 job의 이름
JOB_KEY job_name과 jobParameter를 합쳐 해싱한 값 저장


  •  BATCH_JOB_EXECUTION
    • job의 실행정보가 저장되며 job 생성, 시작, 종료 시간, 실행상태, 메시지 등을 관리
JOB_EXECITION_ID jobExecution을 고유하게 식별할 수 있는 기본키,
JOB_INSTANCE와 일대 다 관계
VERSION 업데이트 될 때마다 1씩 증가
JOB_INSTANCE_ID JOB_INSTANCE의 키 저장
CREATE_TIME 실행이 생성된 시점
START_TIME 실행이 시작된 시점
END_TIME 실행이 종료된 시점, job실행 도중 오류가 발생해서 job 중단시
값이 저장되지 않을 수 있음
STATUS 실행 상태를 저장(completed,failed,stopped..)
EXIT_CODE 실행 종료코드를저장(completed,failed...)
EXIT_MESSAGE status가 실패일 경우 실패 원인 등의 내용을 저장
LAST_UPDATED 마지막 실행 시점을 timeStamp 형식으로 기록


  •  BATCH_JOB_EXECUTION_PARAMS
    • job과 함께 실행되는 jobParameter 정보를 저장
JOB_EXECUTION_ID jobExecution 식별 키 , JOB_EXECITION과는 일대다 관계
TYPE_CD String,Long, Date,Duble 타입 정보
KEY_NAME 파라미터 키 값
STRING_VAL 파라미터 문자 값
DATE_VAL 파라미터 날자 값
LONG_VAL 파라미터 LONG 값
DOUBLE_VAL 파라미터 Double 값
IDENTIFYING 식별여부(TRUE,FALSE)


  •  BATCH_JOB_EXECUTIONPCONTEXT
    • job의 실행동안 여러가지 상태정보, 공유 데이터를 직렬화(json형식)해서 저장
    • Step간 서로 공유 가능함
    •  
JOB_EXECUTION_ID jobExecution식별 키 , JOb_EXECITION 마다 각 생성
SHORT_CONTEXT job의 실행 상태 정보, 공유 데이터등의 정보를 문자열로 저장
SERIALIZED_CONTEXT 직렬화된 전체 컨텍스트


STEP 관련 테이블

  • BATCH_STEP_EXECUTION
    • step의 실행정보가 저장되며 생성, 시작, 종료시간, 실행 상태, 메시지 등을 관리

STEP_EXECUTION_ID Step의 실행 정보를 고유하게 식별할 수 있는 기본 키
VERSION 업데이트 될 때마다 1씩 증가
STEP_NAME Step을 구성할때 부여하는 step이름
JOB_EXECUTION_ID JobExecution 기본키, JobExecution과는 일대 다 관계
START_TIME 실행이  시작된 시점을 기록
END_TIME 실행이 종료된 시점을 기록하며 job실행 도중 오류가 발생해서 job이 중단된 경우 값이 저장되지 않을수 있음
STATUS 실행 상태를 저장(completed,failed,stopped...)
COMMIT_COUNT 트랜잭션 당 커밋되는 수를 기록
READ_COUNT 실행시점에 read한 item 수를 기록
FILTER_COUNT 실행도중 필터링 된 item 수를 기록
WRITER_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 실행 종료코드를 저장(complete,failed...)
EXIT_MESSAGE Status가 실패일 경우 실패 원인 등의 내용을 저장
LAST_UPDATED 마지막 실행 시점을 기록

  •  BATCH_STEP_EXECUTION_CONTEXT
    • Step의 실행동안 여러가지 상태 정보, 공유 데이터를 직렬화해서 저장
    • Step 별로 저장되며 Step간 서로 공유할 수 없음
STEP_EXECUTION_ID StepExecution 식별 키 , Step_Execution 마다 각 생성
SHORT_CONTEXT Step의 실행 상태 정보, 공유 데이터 등의 정보를 문자열로
저장
SERIALIZED_CONTEXT 직렬화된 전체 컨텍스트