Programing/Java & Spring

세무민의 코딩일기 : Spring Batch API 만들기 1탄(Spring Batch, Scheduler, TaskLet, Chunk등 이론 정리)

세기루민 2023. 10. 29. 20:56
728x90

안녕하세요.

오랜만에 코딩일기로 돌아온 세무민입니다.

사실 요즘 회사 일에 치여서 이걸 포스팅 할까 고민하다가

그래도 Spring Batch에 대해 조금이나마 작성하면 좋을 것 같아서 포스팅으로 남깁니다.


1. Spring Batch 개발을 하게 된 목적 

목적은 서비스에 산재되어 있는 Scheduler를 하나의 서비스로 모으는데 목적을 가졌었어요

그러면서 조금이나마 Spring Batch와 Quartz에 대해 개인적으로 프로젝트를 해보게 되었답니다.

 

2. Spring Batch VS Spring Scheduler

  • Batch란 일괄처리를 말하며 사용자의 상호작용 없이 여러개의 작업을 미리 정해진 순서에 따라 중단 없이 처리
  • Scheduler는 특정한 시간에 등록한 작업을 자동으로 실행시키는 것을 의미
  • Scheduler의 경우 Spring에 기본 기능으로 추가 의존성이 필요 없다는 점과 간편하다는 장점이 있으나 단일 Thread를 사용
    • Spring Scheduler의 경우 사용 옵션이 존재
      • fixedDelay : 스케줄러 끝나는 시간 기준 1초 간격 진행
      • fixedRate : 스케줄러 시작하는 시간 기준 1초 간격 진행
  • 즉, Scheduler와 Batch는 다른것이 아니라 역할이 다르다는 점만 알아두시면 됩니다.
    • Scheduler는 특정 시간에 작업을 실행, Batch는 실행해야 하는 작업들을 순서대로 처리

 

3. Spring Batch 특징

  • 대용량 데이터 처리 용이
  • 자동화 기능
  • 데이터 충돌/중단 없이 처리 가능
  • 지정한 시간 안에 처리를 완료하거나 동시에 실행되는 다른 프로그램을 방지하지 않음(동시성 제어)
  • 로깅, 알림을 통한 추적이 가능

 

4. Spring Batch 상세 설명

https://docs.spring.io/spring-batch/docs/current/reference/html/job.html#configureJob

Spring에서 제공해주는 Spring Batch의 구조입니다.

실질적으로 JobLauncher > Job > Step > Tasklet/Chunk 처리 구조라고 보면 될 것 같습니다. 

Spring Batch와 관련된 용어에 대해서는 아래와 같습니다.

Job

  • 배치 처리 과정의 하나의 단위
  • 배치 처리 과정의 전체 계층에 가장 상단에 위치

JobInstance

  • Job의 실행 단위
  • 2/23일, 2/24일 실행 시 각각의 JobInstance 생성

JobParameters

  • JobInstance 구분 값
  • String, Double, Long, Date 4가지 형식을 지원

JobExecution

  • JobInstance에 대한 실행 시도 객체
  • 실패하여 재실행 시킨 경우 동일한 JobInstance이나 2번 실행에 대한 JobExecution은 개별로 생성
    • JobInstanced 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보로 생성

Step

  • Job의 배치 처리를 정의하고 순차적인 단계를 캡슐화
  • Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄처리를 제어하는 모든 정보 포함
  • 방식은 크게 TaskLet과 Chunk로 나눠진다.

StepExecution

  • Step 실행 시도에 대한 객체
  • 이전 단계의 Step이 실패하면 StepExecution은 미생성
  • 실제 시작이 될 때만 생성
  • StepExecution은 JobExecution에 저장되는 정보 외에 read 수, write 수, commit 수, skip 수 등의 정보들이 저장

ExecutionContext

  • Job에서 데이터를 공유 할 수 있는 데이터 저장소
  • Spring Batch에서 제공하는 ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지 종류이며 지정 범위가 다름
  • JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExecutionContext는 실행 사이에 저장
  • ExecutionContext를 통해 Step간 Data 공유가 가능하며 Job 실패시 ExecutionContext를 통한 마지막 실행 값을 재구성 가능

JobRepository

  • 위의 모든 배치 처리 정보를 담고있는 매커니즘
  • Job이 실행되게 되면 JobRepository에 JobExecution과 StepExecution을 생성하게 되며 JobRepository에서 Execution 정보들을 저장하고 조회할 때 사용

JobLauncher

  • JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체

ItemReader

  • Step에서 Item을 읽어오는 인터페이스
  • ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽기 가능

ItemWriter

  • 처리된 Data를 Writer할 때 사용합니다.
  • 처리 결과물에 따라 Insert, Update, Queue의 Send 등 가능
  • 기본적으로 Item을 Chunk로 묶어 처리

ItemProcessor

  • Reader에서 읽어온 Item을 데이터 처리하는 역할
  • Processor는 배치를 처리하는데 필수 요소는 아니며 Reader, Writer, Processor 처리를 분리하여 각각의 역할을 명확하게 구분

 

5. TaskLet/Chunk 

배치를 처리할 수 있는 방법은 크게 2가지로 TaskLet과 Chunk가 있습니다.

TaskLet

  • 각 단계는 하나의 정의된 작업만 수행해야 함
  • Step이 중지될 때까지 execute 매서드가 계속 반복해서 수행하고 수행할 때마다 독립적인 트랜잭션을 사용
  • 초기화, 저장, 실행, 알림 전송과 같은 Job에 사용
  • tasklet 클래스 재사용이 가능할 경우 사용
    • Tasklet을 사용한 Task 기반 처리
      • 배치 처리 과정이 비교적 쉬운 경우 쉽게 사용
      • 대량 처리를 하는 경우 더 복잡
      • 하나의 큰 덩어리를 여러 덩어리로 나누어 처리하기 부적합

Chunk

  • 한번에 하나의 Row를 읽어 Chunk를 만들고 Chunk단위로 트랜잭션을 분리
  • 한번에 모든 행을 읽고 사용하지만 한번에 고정된 청크를 읽고 처리
  • Chunk 단위로 트랜잭션을 수행하기 때문에 실패하더라도 Chunk만큼 롤백되며 커밋된 트랜잭션 범위까지는 반영
    • Chunk를 사용한 chunk(덩어리) 기반 처리
      • ItemReader, ItemProcessor, ItemWriter의 관계 이해 필요
      • 대량 처리를 하는 경우 Tasklet 보다 비교적 쉽게 구현
      • 예를 들면 10,000개의 데이터 중 1,000개씩 10개의 덩어리로 수행

 

6. Spring Batch MetaTable

Spring Batch 프로젝트를 만들기 위해서는 기본적으로 MetaTable을 만들어야 합니다.

  • 메타테이블을 이용하여 Job과 Step의 로깅을 할 수 있음 
  • 설정에 따라 InMemory DB를 이용할 수도 있음

https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html

  • 총 6개의 메타 테이블을 생성해주면 되며 추후 커스텀을 할 경우라면 6개의 테이블과 3개의 시퀀스를 만들어 주면 됩니다. 
    • 관련된 내용은 추후 다른 포스팅에서 다루도록 하겠습니다.

 

7. 기타

 

GitHub - sg-moomin/springbatchapi

Contribute to sg-moomin/springbatchapi development by creating an account on GitHub.

github.com

포스팅과 관련된 코드를 볼 수 있습니다.


이번 포스팅에서는 Spring Batch 이론에 대해 간단하게 설명하였습니다.

다음 포스팅에서는 실제 Spring Batch 개발하는 포스팅으로 돌아오겠습니다.

 

 

 

728x90