스텝 Step
- 잡이 전체적인 처리를 정의한다면, 스텝은 잡의 구성 요소를 담당한다.
- 스텝은 독립적이고 순차적으로 배치 처리를 수행한다. 때문에 스텝은 서로간 독립적이며 트랜젝션은 스텝 내에서 이뤄진다.
스텝 구성
- 태스크릿 스텝
- Tasklet : 인터페이스의 execute 메서드를 구현 후 RepeatStatus 객체를 반환
*RepeatStatus 는 CONTINUABLE 과 FINISHED 두 가지가 있다. CONTINUABLE 은 스프링 배치에게 해당 태스크릿을 다시 실행하라고 하는 것이다.(특정 조건 충족시까지 반복해야 할 때)
- CallableTaskletAdapter : Callable<RepeatStatus> 인터페이스의 구현체를 구성할 수 있게 해주는 어댑터이다. 새 스레드에서 실행된다는 점에서 Runnable 인터페이스와 유사하다. 그러나 값을 반환하지 않고 체크예외를 바깥으로 던지지 못하는 Runnable 인터페이스와는 다르게 Callable 인터페이스는 값을 반환하고 체크 예외를 바깥으로 던질 수 있다. 이 어댑터는 스텝의 특정 로직을 해당 스텝이 실행되는 스레드가 아닌 다른 스레드에서 실행하고 싶을 때 사용한다. 하지만 그렇다고 해서 스텝과 병렬로 실행되는 것은 아니다. 즉 Callable 객체가 유효한 RepeatStatus 객체를 반환하기 전에는 스텝이 완료된 것으로 간주하지 않는다. 그러므로 해당 스텝이 완료될 때까지 플로우 내의 다른 스텝은 실행되지 않는다.
- MethodInvokingTaskletAdapter : 기존에 존재하던 다른 클래스 내의 메서드를 잡 내의 태스크릿처럼 실행할 수 있다.
- SystemCommandTasklet : 시스템 명령을 실행할 때 사용한다. 이때 지정한 시스템 명령은 비동기로 실행된다. 그래서 타임아웃 값이 중요하다.
- 청크 기반 스텝 : 청크는 커밋 간격에 의해 정의된다. 커밋 간격을 50개 아이템으로 설정했다면 잡은 50개 아이템을 읽고 50개 아이템을 처리한 다음에, 한번에 50개 아이템을 기록한다.
- CompletaionPolicy : 청크의 완료 여부를 결정할 수 있는 결정 로직을 구현할 수 있게 해준다. 스프링 배치는 이 인터페이스의 많은 구현체를 제공한다. 기본적으로 SimpleCompletionPolicy 를 사용한다. SimpleCompletionPolicy 는 처리된 아이템 개수를 세는데, 이 개수가 미리 구성해둔 임계값에 도달하면 청크 완료로 표시한다. 또 다른 구현체는 TimeoutTerminationPolicy 이다. 이 구현체를 사용해 타임아웃 값을 구성하면, 청크 내에서 처리시간이 해당 시간이 넘을 때 안전하게 빠져나갈 수 있다.(해당 청크가 완료된 것으로 간주되고, 모든 트랜잭션 처리가 정상적으로 계속됨을 의미) 또한 CompositeCompletionPolicy 를 사용하면 청크 완료 여부를 결정하는 여러 정책을 함께 구성할 수 있다. CompositeCompletionPolicy 는 자신이 포함하고 있는 여러 정책 중 하나라도 청크 완료라고 판단된다면 해당 청크가 완료된 것으로 표시한다. 이러한 스프링 배치가 제공하는 구현체 말고도 직접 구현해서 사용할 수도 있다. 우선 CompletaionPolicy 인터페이스는 두개의 isComplete 메서드, start 메서드 , update 메서드와 같이 총 네 개의 메서드를 가지고 있다.
- 스텝 리스너
개별 스텝으로 이벤트인 스텝 시작 및 종료 이벤트를 볼 수 있다. 두 가지 인터페이스를 활용 할 수 있는데, StepExecutionListener 와 ChunkListener 인터페이스이다. 이 두 인터페이스는 각각 스텝과 청크의 시작과 끝에서 특정 로직을 처리할 수 있게 해준다. 스텝 리스너의 이름인 StepListener 가 아닌 StepExecutionListener 라는 점에 주의하자. 실제로 StepListener 라는 인터페이스가 있긴 하지만 모든 스텝 리스너가 상속하는 마커 인터페이스일 뿐이다. StepExecutionListener 와 ChunkListener 둘 다 JobExecutionListener 인터페이스의 메서드와 유사한 메서드를 제공한다. StepExecutionListener 에는 beforeStep 과 afterStep 메서드가 존재하고, ChunkListener 에는 예상했겠지만 beforeChunk 와 afterChunk 메서드가 존재한다. afterStep 을 제외한 다른 모든 메서드는 void 타입이다. afterStep 메서드는 ExitStatus 를 반환한다. 리스너가 스텝이 반환한 ExitStatus 를 잡에 전달하기 전에 수정할 수 있기 떄문이다. 이 기능은 잡 처리의 성공 여부를 판별하는 데 사용할 수 있으며, 그 이상으로 잡에 유용하게 사용할 수 있다.
또한 스프링 배치는 @BeforeStep, @AfterStep, @BeforeChunk, @AfterChunk 애너테이션으로 리스너를 구성하는 기능도 제공한다.
'Batch' 카테고리의 다른 글
Spring Batch 를 Jenkins 를 이용해 간단하게 사용해보자 (0) | 2022.07.08 |
---|---|
Spring Batch A 부터 Z 까지 (0) | 2022.07.08 |
Quartz 사용해보기 (0) | 2022.04.25 |
Job 실습해보기 (0) | 2022.04.05 |
스프링 배치 잡 Job (0) | 2022.04.04 |