들어가기 전

이번 포스팅에서는 스프링 배치의 기본 아키텍처와 흐름에 대해서 알아볼 예정입니다.

그리고 스프링 배치의 처리 모델인 Chunk 모델과 Tasklet 모델에 대해서 함께 알아보겠습니다.

 

 

스프링 배치 처리 모델

스프링 배치 처리 모델에는 아래 두 가지 모델이 있습니다.

  • Chunk 모델
  • Tasklet 모델

Chunk 모델

Chunk 모델은 일정한 단위(청크)로 대용량 데이터를 처리하는 방식입니다.

commit-interval이라는 설정값을 통해 청크에 포함될 최대 레코드 수를 조정할 수 있습니다.

ItemReader, ItemProcessor, ItemWriter 인터페이스를 통해 청크 단위로 데이터를 처리합니다.

 

Chunk 모델 처리 과정

 

 

  • ChunkBasedTasklet은 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 반복 실행합니다.
  • ItemReader은 청크 단위만큼 데이터를 읽고 itemProcessor로 전달하여 ItemProcessor가 데이터를 처리합니다.
  • ItemProcessor가 처리한 청크 단위의 데이터는 ItemWriter로 전달되어 데이터베이스에 저장이 되거나 파일에 저장되는 등 쓰기 작업을 수행합니다.

 

Tasklet 모델

 

Tasklet 모델은 Chunk 모델과 다르게 대용량 데이터 처리에 적합하지 않고 간단한 데이터 처리, 소스나 파일을 한 번에 처리해야 하는 경우에 사용하는 것이 적합합니다.

Tasklet 모델을 사용할 때는 Spring Batch에서 제공하는 Tasklet 인터페이스를 구현해야 합니다.

 

 

스프링 배치 기본 아키텍처

 

 

  • Job : 일괄 적용을 위한 일련의 프로세스를 요약하는 단일 실행 단위
  • Job Launcher
    • Job을 수행하기 위한 인터페이스
    • 사용자에 의해 직접 실행
    • 자바 커맨드를 통해 CommandLineJobRunner를 실행하여 단순하게 배치 프로세스 수행 가능
  • Step
    • Job을 구성하는 처리 단위
    • 하나의 Job에 여러 Step 설정 및 재사용, 병렬화 조건 분기 등 수행
    • Tasklet, Chunk 모델이 탑재되어 수행
  • ItemReader
    • Chunk 모델에서 사용
    • 청크 단위의 데이터를 읽어 들이는 역할 수행
  • ItemProcessor
    • Chunk 모델에서 사용
    • ItemReader로부터 읽어 들인 데이터를 처리 및 가공하는 역할을 수행
    • ItemProcessor은 옵션이므로 사용하지 않아도 됨.
  • ItemWriter
    • ItemProcessor로부터 처리 및 가공된 데이터를 데이터베이스 또는 파일에 저장하는 쓰기 작업 수행  
  • JobRepository
    • Job과 Step의 상태를 관리하는 시스템
    • 스프링 배치에서 사용하는 테이블 기반으로 상태 정보를 저장하고 관리

 

 

스프링 배치 흐름

 

  1. Job Scheduler가 배치를 트리거링 하면서 JobLauncher을 실행합니다.
  2. JobLauncher은 Job을 실행합니다. 이때 JobExecution이 수행이 되고 Execution Context 정보를 이용합니다.
  3. JobLauncher을 통해 수행된 Job은 자신에게 설정된 Step을 실행합니다. 이때 Execution Context 정보가 전달이 되어 StepExecution이 수행이 됩니다.
  4. 해당 그림에서는 Chunk 모델로 처리합니다.
  5. ItemReader를 통해서 데이터를 읽습니다.
  6. ItemProcessor를 통해서 읽은 데이터를 ItemProcessor이 처리 및 가공합니다.
  7. ItemWriter는 처리 및 가공된 데이터를 데이터 베이스 또는 파일에 쓰기 작업을 수행합니다.

 

 

번외

Spring Boot 3 버전 미만은 아래 포스팅에 작성되어 있는 내용처럼 Job, Step을 생성할 수 있습니다.

 

 

 

[Spring Batch] Job, JobInstance, JobParameter, JobExecution 에 대하여

Job이란 배치 계층 구조의 가장 상위에 있는 개념으로 하나의 배치 작업 자체를 의미합니다. Job Configuration을 통해 생성되는 객체 단위로서 배치 작업을 어떻게 구성하고 실행할 것인지 전체적으

hoestory.tistory.com

 

 

그런데 Spring Boot 3 버전부터는 Job, Step을 생성하는 방식이 조금 달라졌습니다.

 

@Bean
public Step exampleStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    log.info("------------------- init myStep----------------");
    return new StepBuilder("exampleStep", jobRepository)
        .tasklet(greetingTasklet(), transactionManager)
        .build();
}


@Bean
public Job exampleJob(Step exampleStep, JobRepository jobRepository) {
    log.info("------------------- init myJob----------------");
    return new JobBuilder("exampleJob", jobRepository)
        .incrementer(new RunIdIncrementer())
        .start(exampleStep)
        .build();
}

 

XxxBuilder를 통해 생성하고 첫 번째 인자에 Job, Step이름과 JobRepository를 넘겨줍니다.