이전 게시글 :
https://wn1331.tistory.com/253
Spring Batch 5 - 2. Batch 설정하기, Job
이전 포스팅에서 했던 프로젝트에서 추가로 Batch 설정을 추가한다. 1. Spring Batch MetaData란? 메타데이터 테이블은 Spring Batch 프레임워크에서 배치 작업의 실행 정보를 저장하는 데이터베이스 테이
wn1331.tistory.com
Step에 대해서 tonylim님의 블로그에서 내용을 참조했다.
https://tonylim.tistory.com/431
스프링 배치 실행 - Step
StepBuilderFactory 1. StepBuilderFactory - StepBuilder를 생성하는 팩토리 클래스로서 get(String name) 메서드 제공 - StepBuilderFactory.get("stepName")으로 Step을 생성함 2. StepBuilder - Step을 구성하는 설정 조건에 따라
tonylim.tistory.com
1. Step이란
Step 인터페이스는 Batch Job을 구성하는 독립적인 하나의 단계로서 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 모든 정보를 가지고 있는 도메인 객체이다.
Step은 단순한 단일 Task(Tasklet) 뿐만 아니라 입력과 처리, 출력과 관련된 복잡한 비즈니스 로직을 포함하는 모든 설정들을 담고 있다.
- Step은 배치작업을 어떻게 구성하고 실행할 것인지에 대한 Job의 세부 작업을 Task기반으로 설정하고 명세해 놓은 객체
- 모든 Job은 하나 이상의 step으로 구성됨
- Step은 인터페이스로 Spring Batch에서 기본적인 구현체들을 제공한다.
Step의 기본 구현체는 아래와 같다.
1. TaskletStep : Step의 가장 기본이 되는 클래스로 Tasklet 타입의 구현체들을 제어한다
2. PartitionStep : 멀티 쓰레드 방식으로 Step을 여러 개로 분리하여 실행한다.
3. JobStep : Step 내에서 Job을 실행한다. Step 안에 존재하는 Job은 하나 이상의 step을 가진다.
4. FlowStep : Step 내에서 flow를 실행한다.
이 외에도 몇 가지의 Step 기본 구현체가 존재한다. 스프링 배치에서 제공하는 Step의 기본 구현체들을 사용하는 것만으로도 대부분의 배치 Job을 구현할 수 있다.
2. StepBuilder
Step을 구성하는 설정 조건에 따라 다섯 개의 하위 빌더 클래스를 생성하고 실제 Step 생성을 위임한다.
- TaskletStepBuilder = TaskletStep을 생성하는 기본 빌더 클래스
- SimpleStepBuilder = TaskletStep을 생성하며 내부적으로 Chunk기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성
- PartitionStepBuilder = PartitionStep을 생성하며 Multi-Thread 방식으로 Job을 실행
- JobStepBuilder = JobStep을 생성하여 Step 안에서 Job을 실행
- FlowStepBuilder = FlowStep을 생성하여 Step 안에서 Flow를 실행
3. TaskletStep
스프링 배치에서 제공하는 Step의 구현체로서 Tasklet을 실행시키는 도메인 객체이다.
RepeatTemplate를 사용해서 Tasklet의 구문을 트랜잭션 경계 내에서 반복해서 실행한다.
Chunk 기반과 Task기반으로 나누어서 Tasklet을 실행한다.
스프링 배치에서 Step의 실행 단위는 크게 2가지로 나뉜다. 바로 Chunk 기반과 Task기반.
3.1 Chunk 기반
n개씩 하나의 묶음을 만들어 실행한다는 의미로 대량의 데이터 처리를 하는 경우에 매우 효과적인 성능을 나타내도록 설계되었다.
ItemReader, ItemProcessor, ItemWriter를 사용하며, 청크 기반 전용 Tasklet인 ChunkOrientedTasklet 구현체가 제공된다.
Reader, Processor, Writer는 작성해야 할 글이 많아 각각 다루어 보고 포스팅할 예정이다.
3.1 Task 기반
ItemReader나 ItemWriter와 같은 청크 기반의 작업보다 단일 작업 기반으로 처리되는 것이 더 효율적인 경우에 설계한다.
주로 Tasklet 구현체를 만들어 사용한다.
대량 처리를 하는 경우 chunk 기반에 비해 더 복잡한 구현이 필요하다.
TaskletStep - tasklet()
Tasklet 타입의 클래스를 설정한다. Tasklet 클래스는 step 내에서 구성되고 실행되는 도메인 객체로서 주로 단일 task를 수행하기 위한 것이다.
TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행중 혹은 종료한다.
실행 중 나타나는 RepeatStatus는 Tasklet의 반복 여부 상태 값이다.
- RepeatStatus.FINISHED - Tasklet 종료 , RepeatStatus 을 null 로 반환하면 RepeatStatus.FINISHED 로 해석됨
- RepeatStatus.CONTINUABLE - Tasklet 반복
- RepeatStatus.FINISHED가 리턴되거나 실패 예외가 던져지기 전까지 TaskletStep 에 의해 while 문 안에서 반복적으로 호출 됨 (무한루프 주의)
- 익명 클래스 혹은 구현 클래스를 만들어서 사용한다.
- 이 메소드를 실행하게 되면 TaskletStepBuilder가 반환되어 관련 API를 설정할 수 있다.
- Step 에 오직 하나의 Tasklet 설정이 가능하며 두개 이상의 설정 했을 경우 마지막에 설정한 객체가 실행된다.
TaskletStep - startLimit() / allowStartIfComplete()
startLimit()
- Step의 실행 횟수 조절 가능
- Step마다 설정 가능
- 설정 값을 초과해서 다시 실행하려고 하면 StartLimitExceedException 발생
- start-limit의 디폴트 값은 Integer.MAX_VALUE
allowStartIfComplete()
- 재시작 가능한 job에서 Step의 이전 성공 여부와 상관없이 항상 Step을 실행하기 위한 설정
- 실행마다 유효성을 검증하는 Step이나 사전 작업이 꼭 필요한 Step 등
- 기본적으로 COMPLETED 상태를 가진 Step은 Job 재 시작 시 실행하지 않고 스킵한다
- allow-start-if-complete가 "true"로 설정된 step은 항상 실행한다.
4. TaskletStep 아키텍처
각 객체가 실행이 될때 중간 중간 생성 및 실행되는 것(StepExecution) 들을 확인하면 된다.
StepListener를 통해 befroeStep, afterStep등을 설정하여 특정시점에 호출하게 만들어줄 수 있다.
Tasklet이 끝났을때 특별한 응답값을 주지않으면 null 이 return 되는데 FINISHED와 같은의미로 해석된다.
다음 포스팅은 Task기반 step vs Chunk 기반 step에 대해서 자세히 다루어 볼 예정이다.
'Spring > Spring Batch' 카테고리의 다른 글
Spring Batch 5 - 5. ItemReader (0) | 2023.10.22 |
---|---|
Spring Batch 5 - 4. Task 기반 step, Chunk 기반 step (0) | 2023.10.22 |
Spring Batch 5 - 2. Batch 설정하기, Job (1) | 2023.10.20 |
Spring Batch 5 - 1. 시작하기 (0) | 2023.10.20 |