Spring Batch ‐ 스프링 배치 실행(Step) - dnwls16071/Backend_Study_TIL GitHub Wiki

StepBuilderFactory deprecated!

📚 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 기반에 비해 더 복잡한 구현이 필요하다.

스크린샷 2025-01-12 오전 2 36 56

📚 tasklet()

  • Tasklet 타입의 클래스를 설정한다.
    • Tasklet
      • Step 내에서 구성되고 실행되는 도메인 객체로서 주로 단일 태스크를 수행하기 위한 것이다.
      • TaskletStep에 의해 반복적으로 수행되며 반환값에 따라 계속 수행 혹은 종료한다.
      • RepeatStatus - Tasklet의 반복 여부 상태 값(RepeatStatus.FINISHED / RepeatStatus.CONTINUABLE)
  • 익명 클래스 혹은 구현 클래스를 만들어서 사용한다.
  • 메서드를 실행하게 되면 TaskletStepBuilder가 반환되어 관련 API를 설정할 수 있다.
  • Step에 오직 하나의 Tasklet 설정이 가능하며, 2개 이상을 설정한 경우 마지막에 설정한 객체가 실행된다.

📚 startLimit() & allowStartIfComplete()

스크린샷 2025-02-28 오후 6 12 48

  • 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 아키텍처

스크린샷 2025-01-12 오후 8 45 25

  • 예외가 발생하면 이후로의 진행이 이루어지지 않는다.
  • RepeatStatus 값에 따라 Step의 반복 여부가 정해진다.

📚 JobStep

스크린샷 2025-02-28 오후 6 40 50

  • 기본개념
    • Job에 속하는 Step 중 외부 Job을 포함하는 Step
    • 외부의 Job이 실패하면 해당 Step 역시 실패하므로 최종 기본 Job 역시 실패하게 된다.
    • 모든 메타 데이터는 기본 Job과 외부 Job별로 각각 저장된다.
    • 커다란 시스템을 작은 모듈로 쪼개고 Job의 흐름을 관리하고자 할 때 사용할 수 있다.