[Spring Batch 3편] ChunkModel과 TaskletModel가 무엇일까?

송하연·2024년 10월 20일
0
post-thumbnail

이전 글 - SpringBatch 실행법 & 아키텍처 알아보기

오늘은 Spring Batch를 처리할 수 있는 2가지 방법인 Chunk ModelTasklet Model에 대해 알아보자.

1. Chunk Model

Chunk Model이란?

: 스프링 배치에서 Chunk Model은 대량의 데이터를 일정 단위인 청크로 나누어 처리하는 방식

Chunk Model의 동작 방식

Chunk Model의 중심에는 ChunkOrientedTasklet이 있다.
이 클래스는 청크 기반의 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 한다.

청크 크기(한 번에 처리할 레코드 수)는 commit-interval 설정값을 통해 조정 가능하다.

Chunk Model의 처리 과정

  1. ItemReader: 청크 크기만큼 데이터를 읽어들인다.
  2. ItemProcessor: 읽어들인 데이터를 비즈니스 로직에 맞게 변환하거나 가공한다.
  3. ItemWriter: 처리된 데이터를 저장하거나 파일로 기록한다.

ItemReader

ItemReader는 데이터를 읽어오는 역할을 담당하며, 스프링 배치에서는 다양한 ItemReader 구현체를 제공하여, 여러 데이터 소스로부터 데이터를 읽어올 수 있다.

ItemReader - 주요 구현체

  • FlatFileItemReader
    CSV 파일과 같은 플랫 파일(*구조화 되지 않은 파일)에서 데이터를 읽는다. 구분자(Delimiter)를 기준으로 나누어 객체로 매핑한다.

  • StaxEventItemReader
    XML파일을 StAX기반으로 읽어 들인다.

  • JdbcPagingItemReader/JdbcCursorItemReader: JDBC를 사용하여 SQL을 실행하여 데이터베이스 레코드를 읽는다.
    JdbcPagingItemReader는 JdbcTemplate을 이용하여 각 페이지별로 SELECT SQL을 나누어 처리하는 방식이다.
    JdbcCursorItemReader는 JDBC Cursor를 이용하여 하나의 SELECT SQL로 데이터를 읽는다.

  • MyBatisCursorItemReader/MyBatisPagingItemReader
    MyBatis를 사용하여 데이터베이스에서 데이터를 읽는다.

  • JmsItemReader / AmqpItemReader
    JMS 또는 AMQP 기반의 메시지 큐에서 데이터를 읽는다.

ItemProcessor (chunk model에서 옵션)

ItemReader는 ItemReader로부터 읽어들인 청크 데이터를 가공하거나 변환하는 역할을 하며 구체적인 구현체를 구현하여 스프링배치에 전달한다.

ItemProcessor 구현 예시

public class MyItemProcessor implements
      ItemProcessor<MyInputObject, MyOutputObject> {  // (1)

  @Override
  public MyOutputObject process(MyInputObject item) throws Exception {  // (2)

      MyOutputObject processedObject = new MyOutputObject();  // (3)
      
      // 비즈니스 로직 코드

      return processedObject; // (4) 변환된 데이터를 반환
  }
}

(1) ItemProcessor 인터페이스 구현:
제네릭을 사용해 입력 데이터와 출력 데이터 타입을 정의

(2) process 메소드:
입력을 아규먼트로 받아 비즈니스 로직을 적용해 입력 데이터를 가공하고 변환

(3) 출력 객체 생성:
ItemProcessor처리 결과로 반환할 새로운 출력 객체를 생성

(4) 출력 객체 반환:
process 메소드에서 변환된 데이터를 반환 후 다음 단계인 ItemWriter로 전달

ItemProcessor - 주요 구현체

  • PassThroughItemProcessor
    아무 작업도 수행하지 않는 기본 프로세서. 입력 데이터가 그대로 출력 데이터로 반환되며, 데이터 변환이 필요 없을 때 사용된다.

  • ValidatingItemProcessor
    입력된 데이터를 유효성 검사하는 프로세서. Spring Batch 전용 org.springframework.batch.item.validator.Validator 인터페이스를 구현해야한다.

  • CompositeItemProcessor
    동일한 입력 데이터에 대해 여러 ItemProcessor를 순차적으로 실행할 수 있는 프로세서.

ItemWriter

ItemWriter - 주요 구현체

  • FlatFileItemWriter
    처리된 Java객체를 CSV 파일과 같은 플랫 파일 형식으로 출력한다.

  • StaxEventItemWriter
    자바 객체를 XML 파일 형식으로 출력한다.

  • JdbcBatchItemWriter
    JDBC를 통해 SQL을 실행하고 자바 객체를 데이터베이스에 배치로 저장한다.

  • MyBatisBatchItemWriter
    MyBatis를 사용하여 자바 객체를 데이터베이스로 저장한다.

  • JmsItemWriter / AmqpItemWriter
    JMS 또는 AMQP 메시지 큐로 자바 객체의 메시지를 전송한다.

2. Tasklet Model

스프링 배치에서 Tasklet Model은 하나의 작업을 단일 태스크로 처리하는 방식이다.
청크 단위의 처리가 딱 맞지 않을 때, 단일을 작업 처리할 때 유용하다.

Tasklet Model 구현 예시

Spring Batch에서 Tasklet을 구현하기 위해서는 Tasklet 인터페이스의 execute 메서드를 구현해야한다.

이 메서드는 작업을 실행하며, 그 결과로 RepeatStatus.FINISHED 또는 RepeatStatus.CONTINUABLE을 반환한다.

public class MyTasklet implements Tasklet {

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        // 비즈니스 로직 처리
        System.out.println("Tasklet executed");
        return RepeatStatus.FINISHED;
    }
}

Tasklet Model - 주요 구현체

  • SystemCommandTasklet
    시스템 명령어를 비동기적으로 실행하는 Tasklet이다.
    명령어를 실행하는 동안 타임아웃 설정이 가능하며, 타임아웃 시 시스템 명령의 실행 스레드를 취소할 수 있다.

  • MethodInvokingTaskletAdapter
    POJO 클래스의 특정 메소드를 실행하기 위한 Tasklet이다.
    targetObject 속성에 대상 클래스의 Bean을 지정하고, targetMethod 속성에 호출할 메소드를 지정한다.

3. Chunk Model vs Tasklet Model

처리 방식 비교

  • Chunk Model은 데이터를 일정한 크기(청크)로 나누어, ItemReader, ItemProcessor, ItemWriter의 순서로 데이터를 처리한다.

  • Tasklet Model은 단일 작업(태스크)을 한 번에 처리하는 방식으로 주로 독립적인 단일 작업이나 작은 데이터를 처리하는 데 적합하며, 반복적인 데이터 처리보다는 단순 작업에 사용된다.

주요 사용 컴포넌트 비교

  • Chunk Model은 ItemReader, ItemProcessor, ItemWriter라는 컴포넌트를 활용하여 데이터를 처리한다.

  • Tasklet Model은 Tasklet 인터페이스를 구현하여 한 번에 하나의 작업을 처리한다.

특징 비교

  • Chunk Model은 메모리 효율이 높고, 안정적으로 대량 데이터를 처리할 수 있고 청크단위로 처리하기 때문에 성능에 유리하다.
  • Tasklet Model은 처리할 데이터가 작거나 단순 작업을 수행할 때 유용하다.

사용 예시 비교

  • Chunk Model은 대용량 데이터 처리가 필요한 경우에 적합하다. 예를 들어, CSV 파일이나 데이터베이스에서 대량의 데이터를 읽고 처리한 후 저장하는 작업에 주로 사용된다.
  • Tasklet Model은 단순하고 독립적인 작업을 수행할 때 적합하다. 예를 들어, 파일 이동, 로그 기록, 시스템 명령어 실행과 같은 단일 작업을 수행할 때 사용된다.

결론적으로 대량 데이터를 처리해야 할 때는 Chunk Model을 사용하고, 단순한 작업을 수행할 때는 Tasklet Model을 선택하는 것이 좋다.

마무리

참고글 - [SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel
깃허브 - https://github.com/hysong4u/springbatch

profile
개발 기록 끄적끄적✏️ #백엔드개발자

1개의 댓글

comment-user-thumbnail
2024년 10월 20일

너무 열심히 하는 울 하연님 너무 진짜 ㅠㅠ

답글 달기