[Spring Batch] Chunk와 Tasklet의 차이
Spring

[Spring Batch] Chunk와 Tasklet의 차이

728x90

[Spring Batch] 스프링 배치(Spring Batch) 란? 편에서 스프링 배치에 대해서 설명했었습니다! 요약하자면 데이터를 일괄적으로 처리하기위한 애플리케이션이라고 할 수 있을것 같네요.이를 위해 Job과 Job을 구성하는 한개 또는 여러개의 Step이 존재했었죠.

 

스프링 배치는 Step 을 Chunk와 Tasklet 두가지 방식으로 제공합니다. 두개가 어떻게 다르고, 어떤 상황에서 무엇을 써야할지 지금부터 알아보겠습니다!


Chunk 방식

Chunk 방식을 이해하려면 먼저 아래에 대한 이해가 필요합니다.

  • ItemReader: DB 또는 파일에서 데이터를 읽어오는 역할을 합니다. ItemReader에 대한 다양한 인터페이스가 존재하며 다양한 방법으로 Item을 읽어 올 수 있습니다.
  • ItemProcessor: ItemReader에서 읽어온 데이터를 변환을 시키거나 원하는 처리를 하는 역할을 합니다. 배치 실행에 필수요소는 아니어서 ItemProcessor는 없어도 상관없습니다.
  • ItemWriter: ItemReader와 ItemProcessor에서 처리된 데이터를 DB또는 파일에 저장하는 역할을 합니다.

데이터 흐름을 보면 ItemReader와 ItemProcessor에서는 데이터가 1건씩 다루어지고 ItemWriter에서는 한번에 처리가 됩니다.

 

Chunk 방식 처리 과정

덩어리

자 Chunk의 사전적인 의미는 "덩어리" 입니다. 이 뜻처럼 Chunk 방식은 대용량 데이터를 처리할 때 데이터를 덩어리별로 처리하게됩니다. 다른말로 하면 트랜잭션(Transaction)을 덩어리별로 묶는다고 볼 수 있습니다.

 

이 덩어리의 크기 (데이터 수)를 Chunk Size 라고 부르며, ItemReader와 ItemProcessor에서는 데이터가 1건씩 처리되면서 Chunk Size 만큼 모일때까지 별도의 공간에 모은 후, Chunk Size 만큼 쌓이게 되면 ItemWriter에서 Chunk만큼 일괄 저장됩니다.

 

어? 근데 Reader에서도 Paging 처리를 할 수 있지 않나요?

맞습니다. Reader에서는 한번에 몇개씩 읽어올지에 대해 Paging 처리를 지원하고 있습니다. 하지만 이는 단순히 읽어오는 것에 대한 size라서 Chunk size 와는 의미가 다릅니다. 이를 적절히 배치하면 더 효과적인 배치 처리를 할 수 있습니다. 

 

예를들어 Paging Size가 5이며 Chunk Size가 10일 경우 2번의 Read가 이루어진 후에 1번의 Transaction이 수행됩니다. 이는 한번의 Transaction을 위해 2번의 쿼리 수행이 발생하게 됩니다. Spring Batch 공식 문서에는 한번의 Read 쿼리 수행시 1번의 Transaction을 위해 두 설정의 값을 일치를 시키는게 가장 좋은 성능 향상 방법이며 특별한 이유가 없는 한 Paging Size 와 Chunk Size를 동일하게 설정하는 것을 추천한다고 나와있습니다.

 

 

왜 이렇게 할까요?

부하 분산

한번에 모든 데이터를 처리한다는것은 그만큼 많은 데이터를 메모리에 올려놓고 있어야 한다는 뜻입니다. Chunk 단위로 데이터를 처리하고 저장하는 것을 반복하면서 메모리 부하를 그만큼 분산할 수 있습니다!

 

롤백 처리 개선

Chunk 방식은 Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다. 따라서 중간에 애플리케이션이 실패한다고해도 처음부터 다시 시작할 필요가 없게 되는 것입니다! 


Tasklet 방식

Tasklet은 하나의 메소드로 구성된 간단한 인터페이스입니다. 주로 간단한 작업이 필요할때나 전체 데이터를 한번에 처리해야할 때 사용합니다. 예를들어 Job을 수행하기 위해 중간에 전체 데이터의 합계를 구해야한다면 우선 데이터를 전부 읽어야하니 Tasklet을 하나의 Step으로 지정하는 것이 방법일 수 있습니다.


용도에 따라 Step에 Chunk와 Tasklet 방식중 원하는걸 선택할 수 있겠지만, 대용량 데이터를 처리할때는 주로 Chunk 방식이 추천됩니다.

 

출처:
- 6. Spring Batch 가이드 - Chunk 지향 처리
- 스프링 배치의 Tasklet 방식과 Chunk 방식
- Spring-Batch란-이해하고-사용하기
728x90