Spring Batch ‐ 스프링 배치 실행(Step) - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 Tasklet
- 기본 개념
- 스프링 배치에서 제공하는 Step의 구현체로서 Tasklet을 실행시키는 도메인 객체
- RepeatTemplate를 사용해서 Tasklet 구문의 트랜잭션 경계 내에서 반복 실행한다.
- Task 기반과 Chunk 기반으로 나누어서 Tasklet을 실행한다.
❗ Task vs Chunk
- 스프링 배치에서 Step의 실행 단위는 크게 2가지로 나눈다.
- chunk(청크) 기반
- 하나의 큰 덩어리를 N개씩 나눠서 실행한다는 의미로 대량 처리를 하는 경우 효과적이다.
- ItemReader, ItemProcessor, ItemWriter를 사용하며 청크 기반 전용 Tasklet인 ChunkOrientedTasklet 구현체가 제공된다.
- Task 기반
- ItemReader, ItemWriter와 같은 청크 기반 작업보다 단일 작업 기반으로 처리되는 것이 더 효율적인 경우
- 주로 Tasklet 구현체를 만들어 사용한다.
- 대량 처리를 하는 경우 chunk 기반에 비해 더 복잡한 구현이 필요하다.
tasklet()
📚 - Tasklet 타입의 클래스를 설정한다.
- Tasklet
- Step 내에서 구성되고 실행되는 도메인 객체로서 주로 단일 태스크를 수행하기 위한 것이다.
- TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행 혹은 종료한다.
- RepeatStatus - Tasklet의 반복 여부 상태 값(RepeatStatus.FINISHED / RepeatStatus.CONTINUABLE)
- Tasklet
- 익명 클래스 혹은 구현 클래스를 만들어서 사용한다.
- 메서드를 실행하게 되면 TaskletStepBuilder가 반환되어 관련 API를 설정할 수 있다.
- Step에 오직 하나의 Tasklet 설정이 가능하며, 2개 이상을 설정한 경우 마지막에 설정한 객체가 실행된다.
startLimit()
& allowStartIfComplete()
📚 -
startLimit()
- Step의 실행 횟수를 조절할 수 있다.
- Step마다 설정할 수 있다.
- 설정 값을 초과해서 다시 실행하려고 하면 StartLimitExceededException 예외가 발생한다.
- start-limit의 default 값은 Integer.MAX_VALUE
-
allowStartIfComplete()
- 재시작 가능한 Job에서 Step의 이전 성공 여부와 상관없이 항상 Step을 실행하기 위한 설정
- 실행마다 유효성을 검증하는 Step이나 사전 작업이 꼭 필요한 Step
- 기본적으로 COMPLETED 상태를 가진 Step은 Job 재시작시 실행하지 않고 스킵한다.
- allow-start-if-complete가 true인 경우로 설정된 Step은 항상 실행한다.
org.springframework.batch.core.StartLimitExceededException: Maximum start limit exceeded for step: step1StartMax: 3 ...
📚 TaskletStep 아키텍처
- 예외가 발생하면 이후로의 진행이 이루어지지 않는다.
- RepeatStatus 값에 따라 Step의 반복 여부가 정해진다.
📚 JobStep
- 기본개념
- Job에 속하는 Step 중 외부 Job을 포함하는 Step
- 외부의 Job이 실패하면 해당 Step 역시 실패하므로 최종 기본 Job 역시 실패하게 된다.
- 모든 메타 데이터는 기본 Job과 외부 Job별로 각각 저장된다.
- 커다란 시스템을 작은 모듈로 쪼개고 Job의 흐름을 관리하고자 할 때 사용할 수 있다.