Spring Framework Batch
spring batch
BatchApplication
@EnableBatchProcessing
- modular 옵션 활성화 시 ModularBatchConfiguration 동작
- modular 옵션 비활성화 시 SimpleBatchConfiguration 동작
- 초기화 관련 클래스
BatchAutoConfiguration
- 스프링 배치가 초기화 될 때 자동으로 실행되는 설정 클래스
- Job 을 수행하는 JobLauncherApplicationRunner 빈을 생성
SimpleBatchConfiguration
- JobBuilderFactory 와 StepBuilderFactory 생성
- 스프링 배치의 주요 구성 요소 생성 - 프록시 객체로 생성됨
BatchConfigurerConfiguration
- BasicBatchConfigurer
- SimpleBatchConfiguration 에서 생성한 프록시 객체의 실제 대상 객체를 생성하는 설정 클래스
- 빈으로 의존성 주입 받아서 주요 객체들을 참조해서 사용할 수 있다.
- JpaBatchConfigurer
- JPA 관련 객체를 생성하는 설정 클래스
- 사용자 정의 BatchConfigurer 인터페이스를 구현하여 사용할 수 있음
- BasicBatchConfigurer
Job, Step, Tasklet
Job > Step > Tasklet 순서로 실행
- Configuration 설정: 하나의 배치 Job 을 정의하고 빈 설정
- JobBuilderFactory: Job 을 생성하는 빌더 팩토리
- StepBuilderFactory: Step 을 생성하는 빌더 팩토리
- Job: Job 생성
- Step: Step 생성
- Tasklet: Step 안에서 단일 태스크로 수행되는 로직 구현
Metadata Schema
- DB 와 연동하기 위해서 꼭 생성되어야 하는 테이블
- org.springframework.batch.core 에
schmea-*.sql
형태로 존재 - 스키마 생성
- 수동 생성: 쿼리 복사 후 직접 실행
- 자동 생성: spring.batch.jdbc.initialize-schema 설정
- ALWAYS: 스크림트 항상 실행, RDBMS 설정이 되어있을 경우 내장 DB 보다 우선으로 실행
- EMBEDDED: 내장 DB 일때만 실행되며 스키마가 자동생성됨. 기본값
- NEVER
- 스크림트 항상 실행 안함
- 내장 DB 일 경우 스크립트가 생성이 안되기 때문에 오류 발생
- 운영에서 수동으로 스크립트 생성 후 NEVER 옵션으로 설정하는 것을 권장
- MySQL 이나 PostgreSQL 을 사용하는 경우 별도의 Sequence Table을 생성해야 함
Job
- 배치 계층 구조에서 가장 상위에 있는 개념
- 하나의 배치 작업을 의미
- 배치 Job 을 구성하기 위한 최상위 인터페이스
- 기본 구현체는 스프링 배치가 제공
- SimpleJob
- 순차적으로 Step 을 실행시키는 Job
- FlowJob
- 특정한 조건과 흐름에 따라 Step 을 실행시키는 Job
- Flow 객체를 실행시켜서 작업을 진행
- SimpleJob
- 이 구현체를 Bean 으로 생성해서 실행시키는 구조
- 기본 구현체는 스프링 배치가 제공
- Job 은 한 개 이상의 Step 으로 구성
Test
- JobLauncherTestUtils 로 테스트 가능
- 이 클래스는 static utility 가 아니라 Bean 으로 생성해야함
- setJob()으로 특정 Job 을 지정하거나, 그냥 @Autowired 될 수도 있음
- 특정 Step 만 테스트도 가능
- SpringBoot 와 SpringBatch 시에는 @MockBean 도 가능
- Spring Batch unit test example - Mkyoung.com
- JobLauncherTestUtils 를 이용한 Spring Batch Test
JobExecutionAlreadyRunningException
CI/CD 설정을 통해 배치 애플리케이션에 대해 잦은 배포를 하게된다면 JobExecutionAlreadyRunningException 에러가 발생할 수 있다. 이때 아래 쿼리를 통해서 문제를 해결할 수 있다.
- BatchStatus 와 ExitStatus 를 이용한 문제 해결 방법
UPDATE
batch_job_execution
SET
end_time = current_timestamp,
status = 'FAILED',
exit_code = 'COMPLETED'
WHERE
job_execution_id =
(SELECT
MAX(job_execution_id)
FROM
batch_job_execution
WHERE
job_instance_id = #{jobInstanceId}
);
- ExitStatus (Spring Batch 4.3.7 API)
- Step 실행 후의 상태를 의미
- 기본적으로 COMPLETED 상태를 가진 Step 은 Job 재시작 시 실행하지 않고 스킵함
- BatchStatus (Spring Batch 4.3.6 API)
- Job 이 FAILED 상태이면 실패한 STEP 부터 재시작 함
따라서, FAILED(BatchStatus) + COMPLETED(ExitStatus) 인 경우에는 Job 을 재시작 하지 않는다.
Links
- Spring Batch - Docs
- Spring Batch - kwonnam
- codecentric/spring-boot-starter-batch-web
- Spring Batch 간단 정리 - Yun Blog
- Run a Spring Batch Job With Quartz
- Spring Batch (Michael Minella) - Youtube
- Configuring Skip Logic in Spring Batch - Baeldung
- Open Source Java Projects: Spring Batch
- Spring Batch Tutorial – The ULTIMATE Guide
- Spring Batch Tutorial - Mkyoung.com
- Spring Batch Enviornment
- Spring Batch 2.2 JavaConfig
- Spring Batch 2.2 - JavaConfig Part 1: A comparison to XML
- Spring Batch 2.2 - JavaConfig Part 2: JobParameters, ExecutionContext and StepScope
- Spring Batch 2.2 - JavaConfig Part 3: Profiles and environments
- Spring Batch 2.2 - JavaConfig Part 4: Job inheritance
- Spring Batch 2.2 - JavaConfig Part 5: Modular configurations
- Spring Batch 2.2 - JavaConfig Part 6: Partitioning and Multi-threaded Step
- Spring Batch Transaction
- SpringOne2GX Replay: Spring Batch Performance Tuning
- Spring Batch Tasklet Example
- Spring Batch Job Example
- Spring Batch Scheduler Example
- Spring Batch JobRepository Example
- Spring Batch Partitioning Example
- Spring Batch Admin Tutorial
- petrikainulainen Spring Batch Tutorial - introduction
- Spring Batch using Partitioner
- Java Batch Tutorial, Java Code Geeks - 2018
- Java Batch Tutorial, Examples Java Code Geeks - 2018
- Spring Batch - 작업실행
- How to use Spring Batch Late Binding - Step Scope & Job Scope - grokonez
- Spring Batch - grokonez
- Spring Batch Example – MySQL Database To XML – Mkyong.com
- Spring Batch Exception Handling Example, Examples Java Code Geeks - 2018
- egovframework:rte2:brte:batch_core:parallel_process [eGovFrame]
- Conditional Flow in Spring Batch - Baeldung
- Spring Boot 기반으로 개발하는 Spring Batch