우리는 Spring Batch (2) - Hello, Spring Batch✨ (실습)에서 Job Bean, Step Bean을 생성만 했는데, 배치 처리가 됨을 볼 수 있었다.
그러면 어떻게 배치 처리 프로세스가 이뤄지는지, Spring Batch 아키텍처를 통해 알아보고자 한다.
우선 이 사진은 Spring Batch를 이루고 있는 객체들의 전반적인 아키텍처이다.
Spring Batch는 Job 타입의 Bean이 생성되면, JobLauncher 객체에 의해서 Job 을 실행한다.
이 Job은 Step을 실행한다.
1️⃣ Chunk : 하나의 큰 덩어리를 n개씩 나눠서 실행
Chunk 기반의 Step : ItemReader, ItemProcessor, ItemWriter (Item : 배치 처리 대상 의미)
2️⃣ Task : 하나의 작업 기반으로 실행
그렇다면 언제 어떤걸 사용?
이 클래스는 DB나 메모리에 Spring Batch가 실행할 수 있도록 배치의 메타 데이터를 관리한다 ➡️ Spring Batch의 전반적인 데이터를 관리하는 클래스
메타 테이블 : 배치 실행, 배치 실행결과인 메타 데이터를 저장
Batch_job_instance : Job이 실행되는 최상위 계층 테이블로서, job_name, job_key 기준으로 하나의 row 생성 ➡️ 같은 job_name, job_key 저장 불가
- JobInstance와 매핑
JobInstance 생성 기준은 JobParameters 중복 여부에 따라 생성
다른 parameter로 Job이 실행되면, JobInstance가 생성
같은 parameter로 Job이 실행되면, 이미 생성된 JobInstance가 실행
Ex.
처음 Job 실행 시, date parameter가 6월 23일이라면 1번 Job Instance 생성
다음 Job 실행 시, date parameter가 6월 24일이라면 2번 Job Instance 생성
다음 Job 실행 시, date parameter가 6월 24일이라면 2번 Job Instance 재실행
Job은 먼저 조회하고, 중복되는게 없다면 생성됨 ➡️ 조회시, 중복되는게 있다면 재실행 ➡️ 하지만 Job이 재실행 대상이 아니면 에러 발생
따라서. Job을 항상 새로운 JobInstance가 실행될 수 있도록 RunIdIncrementer을 사용한다. ➡️ RunIdIncrementer는 항상 다른 run.id를 parameter로 설정
spring-batch-core 의 schema-mysql.sql
(1)에서 생성해놨던 database에 create table을 해준다
생성한 테이블 ERD
application-mysql.yml 작성
spring:
datasource:
hikari:
jdbc-url: jdbc:mysql://localhost:3306/spring_batch?characterEncoding=UTF-8&serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
username: [로컬mysql username]
password: [로컬mysql password]
batch:
initialize-schema: never
5.intelliJ Configuration 설정