Post

[Spring Batch 3] Chunk Model과 Tasklet Model

Spring Batch의 데이터 처리 방식으로 사용되는 Chunk ModelTasklet Model에 대해 알아보자.

1. Chunk 모델

Chunk Model이란 처리할 데이터를 일정 단위(청크)로 처리하는 방식이다.

1-1. Chunk 모델 알아보기

  • 대량의 데이터를 효율적으로 처리할 수 있도록 도와주며, 트랜잭션 관리성능 최적화에 유리하다.
  • ChunkOrientedTasklet은 청크 처리를 지원하는 Tasklet의 구체적인 클래스 역할을 수행한다.
    • 본 클래스의 commit-interval이라는 설정값을 이용하여 청크에 포함될 데이터의 최대 레코드 수(청크 Size)를 조정 가능하다.
  • ItemReader, ItemProcessor, ItemWriter 는 청크 단위를 처리하기 위한 인터페이스이다. Chunk 모델

    참고: DEVOCEAN KIDO님 SpringBatch 연재 03

    • 위 시퀀스 다이어그램과 같이 ChunkOrientedTaskletItemReader,ItemProcessor,ItemWriter 구현체를 각각 호출한다.
    • 이때 ChunkOrientedTasklet청크 단위에 따라 ItemReader,ItemProcessor,ItemWriter반복실행한다.
    • 청크 크기만큼 ItemReader가 데이터를 읽어 들인다.
    • 읽어들인 ItemProcessor로 전달하고, 데이터를 처리한다.
    • ItemProcessor를 처리하고난 청크 단위 데이터가 ItemWriter로 전달되어 저장하거나, 파일처리를 수행한다.

1-2. Chunk-oriented processing

Chunk-oriented processing

참고: SpringBatch 공식 문서

  • Spring Batch는 가장 일반적인 구현 방식으로 “Chunk-oriented(청크 지향)” 처리 스타일을 사용한다.
  • 한 번에 하나씩 데이터를 읽고 트랜잭션 경계 내에서 쓰여지는 ‘청크’를 만드는 것을 말한다.



2. ItemReader

ItemReader는 청크 기반의 데이터 처리에서 데이터를 읽어오는 역할을 담당하는 인터페이스다.
데이터 청크 단위를 하나씩 읽어들여 ItemProcessorItemWriter로 전달한다.
ItemReader는 직접 커스텀 구현을 할 수 있지만 Spring Batch에서는 이미 구현된 다양한 ItemReader 구현체를 제공한다.

2-1. 주요 구성 요소

FlatFileItemReader

  • 파일로부터 데이터를 읽어오는 구현체이다.
  • 플랫파일(CSV 파일, 텍스트 파일 등)을 읽어 들인다.
  • 읽어들인 데이터를 객체로 매핑하기 위해서 delimeter를 기준으로 매핑 룰을 이용하여 객체로 매핑한다.
  • 혹은 입력에 대해서 Resource object를 이용하여 커스텀하게 매핑할 수도 있다.

JdbcCursorItemReader / JdbcPagingItemReader는

  • JdbcCursorItemReader는 데이터베이스에서 커서 방식으로 데이터를 읽어오는 구현체이다.
  • SQL 쿼리를 통해 데이터를 한 행씩 읽어 올 수 있다.
  • JDBC를 사용하여 SQL을 실행하고 데이터베이스의 레코드를 읽는다.
  • JdbcPagingItemReaderJdbcTemplate을 이용하여 각 페이지에 대한 SELECT SQL을 나누어 처리하는 방식으로 구현된다.

MyBatisCursorItemReader / MyBatisPagingItemReader

  • MyBatisCursorItemReaderMyBatis를 사용하여 데이터베이스로부터 커서 방식으로 데이터를 읽어오는 구현체이다.
  • PagingCursor의 차이점은 MyBatis 구현 방법이 다를뿐이지 JdbcXXXItemReader와 동일하다
  • ItemReader JPA구현이나 Hibernate와 연동하여 데이터베이스의 레코드를 읽어오는 JpaPagingItemReader, HibernatePagingItemReader, HibernateCursor를 제공한다.

JmsItemReader / AmqpItemReader

  • JmsItemReaderJMS(Java Message Service)를 사용하여 메시지 큐(Message Queue)로부터 데이터를 읽어온다.
  • AMQP(Advanced Message Queuing Protocol)를 사용하여 메시지 브로커로부터 메시지를 읽어온다.



3. ItemProcessor

ItemProcessor는 Spring Batch에서 데이터 변환과 가공을 담당하는 핵심 인터페이스이다.
ItemReader에서 읽어들인 데이터를 ItemWriter로 전달하기 전에 가공하거나 필터링할 수 있는 역할을 한다.
chunk model에서 없어도 되는 옵션이다.

3-1. 주요 구성 요소

PassThroughItemProcessor

  • 입력된 데이터를 그대로 반환하는 ItemProcessor로, 아무런 변환도 수행하지 않고 데이터를 그대로 전달한다.

CompositeItemProcessor

  • 여러 개의 ItemProcessor순차적으로 실행할 수 있는 구현체이다.
  • ValidatingItemProcessor를 사용하여 입력 확인을 수행한 후 비즈니스 로직을 실행하려는 경우 활성화 된다.

ValidatingItemProcessor

  • 데이터를 처리하기 전에 유효성 검사를 수행하는 ItemProcessor이다.
  • Spring Batch의 Validator 인터페이스를 구현하여 유효성 검사 로직을 정의할 수 있다.
  • 일반적인 Spring Validator 의 어댑터인 SpringValidatororg.springframework.validation의 규칙을 제공한다.

ClassifierCompositeItemProcessor

  • 각 입력 항목에 따라 여러 ItemProcessor중 하나를 선택하여 처리할 수 있도록 하는 ItemProcessor이다.
  • 입력 데이터의 타입이나 조건에 따라 서로 다른 데이터 처리 로직을 적용할 수 있다.



4. ItemWriter

ItemWriter는 Spring Batch에서 데이터 저장 및 출력을 담당하는 인터페이스이다.
배치 처리의 마지막 단계에서 데이터를 파일, 데이터베이스, 메시지 큐 등의 최종 저장소로 쓰는 역할을 한다.

4-1. 주요 구성 요소

FlatFileItemWriter

  • 처리된 Java 객체를 플랫파일(CSV 파일, 텍스트 파일 등)로 데이터를 쓰는 구현체이다.
  • 파일에 쓰기 위한 형식을 직접 지정할 수 있으며, CSV 파일의 경우 구분자(Delimiter) 등을 설정할 수 있다.

StaxEventItemWriter

  • XML 파일로 데이터를 쓰는 구현체이다.
  • JAXB를 통해 객체를 XML로 변환할 수 있다.

JdbcBatchItemWriter

  • JDBC를 사용하여 SQL을 수행하고 자바 객체를 데이터베이스에 저장한다.
  • 내부적으로 JdbcTemplate를 사용하게 된다.

JpaItemWriter

  • JPA를 사용하여 데이터베이스에 저장하는 구현체이다.

MyBatisBatchItemWriter

  • MyBatis를 사용하여 자바 객체를 데이터베이스에 저장하는 구현체이다.

JmsItemWriter / AmqpItemWriter

  • JMS(Java Message Service)를 사용하여 메시지 큐(Message Queue)로 데이터를 쓰는 구현체이다.
  • AMQP(Advanced Message Queuing Protocol)를 사용하여 메시지 브로커로 데이터를 쓴다.



5. Tasklet 모델

한번에 하나의 레코드만 읽어서 쓰기해야하는 경우 Tasklet Model이 적합하다.
청크 단위의 처리가 딱 맞지 않을 경우 Tasklet Model이 유용하다.
사용자는 Tasklet 모델을 사용하면서 Spring Batch에서 제공하는 Tasklet 인터페이스를 구현해야한다.

5-1. 주요 구성 요소

SystemCommandTasklet

  • 시스템 명령어비동기적으로 실행하는 Tasklet이다.
  • 명령 속성에 수행해야할 명령어를 직접 지정하여 사용할 수 있다.
  • 비동기로 실행되기 때문에 프로세스 도중 타임아웃을 설정하고, 시스템 명령의 실행 스레드를 취소할 수 있다.

MethodInvokingTaskletAdapter

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

참고: DEVOCEAN KIDO님 SpringBatch 연재 03


This post is licensed under CC BY 4.0 by the author.