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 | 직렬화된 전체 컨텍스트 |
