본문 바로가기
Spring boot/Spring batch

Spring batch에서의 Step, Tasklet, Chunk

by eunnnn 2023. 3. 21.

 Step은 Job을 구성하는 하나의 단계로서, 실제 배치 처리를 정의하고 컨트롤하는 데 필요한 정보를 가지고 있는 객체이다.

Job은 Steps라는 리스트 변수를 통해 여러 개의 Step을 담고, 각각의 Step들을 execute하여 실행시킨다. 

또한 Step은 내부적으로 Tasklet이라는 속성을 가지고 있어 수행 중에 자신의 tasklet들을 execute한다.

Tasklet은 ItemReader, ItemProcessor, ItemWriter와 같은 chunk 기반의 클래스들을 포함하고 있다. 

 

Chunk

  • 여러 개의 아이템을 묶은 하나의 덩어리, 블록을 의미한다.
  • 한번에 하나씩 아이템을 입력 받아 Chunk 단위로 트랜잭션(commit, rollback)을 처리한다.
  • Item 하나를 읽고 또다른 Item을 읽어 저장하는데, 이러한 각각의 item이 하나의 chunk를 의미한다.
  • chunk의 사이즈는 item의 갯수를 말한다.

Input Chunk와 Output Chunk

  • Input Chunk(=Chunk<I>)  : ItemReader로 읽은 하나의 아이템을 Chunk에서 정한 개수만큼 반복해서 저장하는 타입
  • Output Chunk(=Chunk<O>) : ItemReader로부터 전달받은 Chunk<I>를 참조해서 ItemProcessor에서 적절하게 가공, 필터링한 다음 ItemWriter에 전달하는 타입

 

Chunk 프로세스

  • Source로부터 ItemReader가 Item을 한 건씩 읽어 각각 Chunk<I>에 Chunk 크기만큼 저장한다.
    Chunk<I>는 내부적으로 List 타입의 Item을 담을 수 있는 List<Item>이 있음
    Item이 Chunk 사이즈만큼의 데이터를 읽었는지 확인하고, 아닌 경우 다시 Item을 읽는다.
  • Chunk<I>가 ItemProcessor에 전달된다.
  • ItemProcessor는 전달받은 Chunk를 transform으로 변환하거나 가공하여 Chunk<O>에 담는다.
    ItemReader로부터 읽은 Item 개수만큼 Chunk<O>에 담음
  • Chunk<O>가 ItemWriter에 전달된다.
  • ItemWriter는 전달받은 Chunk<O>가 가지고 있는 List<Item>을 DB에 저장하거나 다른 저장소에 쓰기작업을 한다.

 

Chunk 프로세스를 주로 사용하는 이유

일반적으로 대용량 데이터를 처리하는 배치 프로세스 특성상, 대량의 데이터를 하나의 트랜잭션으로 처리하기에는 어려움이 있다. 그러나 Chunk 단위로 트랜잭션을 수행하게 되면 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 커밋된 트랜잭션 범위까지는 반영이 된다.

 

그리고 내결함성 (Falut tolernat, 시스템의 일부 구성 요소가 작동하지 않더라도 계속 작동할 수 있는 기능) 위한 다양한 기능들을 제공하고 있다.

  • skip : 특정 Exception에 대해 에러데이터를 스킵하고 진행 할 수 있도록 설정
  • retry : 특정 Exception에 대해서는 실패 시 재시도 할 수 있도록 설정
  • rollback : 에러발생시 Rollback이 기본이지만 특정 에러에 대해서는 no-Rollback 정책을 수행 할 수 있도록 한다.

 

Step 생성하기

1. 단순 tasklet 생성

public Step taskletStep() {		
	return this.stepBuilderFactory.get("step")
		.tasklet(myTasklet())
		.build();
}

2. ChunkOrientedTasklet (Chunk 기반 tasklet)

public Step taskletStep() {
	return this.stepBuilderFactory.get("step")
		.<Member, Member>chunk(100)
		.reader(reader())
		.writer(writer())
		.build();
}

둘 모두 TaskletStep을 생성하는 과정이지만, (1)은 직접 tasklet을 생성하고, (2)는 이미 Spring Batch가 chunk 기반의 프로세스를 진행할 수 있는 chunk 기반의 전용 프로세서를 만들어 ItemReader, ItemWriter를 실행시키는 구조로 이루어진다는 차이가 있다.

작업로직이 청크지향 처리를 하기에는 너무 간단하거나, 부자연스러운경우 tasklet을 설정해 step을 구성 할 수 있다.

 

StepExecution

  • Step에 대한 한 번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
  • Step이 매번 시도될 때마다 생성되며, 각 Step별로 생성된다.
  • Step의 StepExecution이 모두 정상적으로 완료되어야 JobExecution이 정상적으로 완료된다.
  • Job이 재시작하더라도 이미 성공적으로 완료된 Step은 재실행되지 않고, 실패한 Step만 실행된다.

시작시간, 종료시간, 상태(시작됨, 완료, 실패), commit count, rollback count 등의 속성을 가짐

'Spring boot > Spring batch' 카테고리의 다른 글

Spring batch에서의 Job  (0) 2023.03.21
Spring batch의 기본 구성  (0) 2023.03.21