[3회차] SpringBatch ChunkModel과 TaskletModel

아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.
DEVOCEAN에 연재 중인 KIDO님의 글을 참고하여 실습한 내용을 기록했습니다.

 

 

[SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel

 

devocean.sk.com

원본: [SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel

 

Spring Batch의 Chunk Model과 Tasklet Model에 대해서 알아봅니다.

 

Chunk Model

출처:  https://jojoldu.tistory.com/331

 

Chunk Model의 동작 순서는 2회차에서 진행되었던 내용에서도 볼 수 있듯이 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 를 반복 실행 합니다.

  • 주의할 점은 읽어온 데이터를 Processor에서 가공하여 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장합니다.

이 때 Chunk 지향 처리의 전체 로직을 다루는 것은 ChunkOrientedTasklet 클래스입니다.

ChunkOrientedTasklet를 구성하는 Reader, Processor, Writer에 대해 알아보겠습니다.

 


ItemReader

  • 데이터를 읽어 들입니다.
  • DB의 데이터만을 얘기하는 것이 아닌 File, XML, JSON 등 여러 데이터 소스를 사용할 수 있습니다.
  • 이외에 지원하지 않는 Reader라면 직접 만들 수도 있습니다.

DataBase Reader는 두 가지의 방법으로 데이터를 읽어 옵니다.

출처:  https://jojoldu.tistory.com/336

 

  • Cursor 방식은 Database와 커넥션을 맺은 후, Cursor를 한 칸씩 옮겨가며 지속적으로 데이터를 읽습니다.(Streaming 방식)
  • Paging 방식은 한 번에 10개 혹은 지정한 size만큼 데이터를 가져옵니다.

제공하는 다양한 구현체

  • Cursor 기반
    • JdbcCursorItemReader
    • HibernateCursorItemReader
    • MyBatisCursorItemReader
    • StoredProcedureItemReader
  • Paging 기반
    • JdbcPagingItemReader
    • HibernatePagingItemReader
    • MyBatisPagingItemReader
    • JpaPagingItemReader

그 외에는 FlatFileItemReader(구조화 되지 않은 파일 ex. CSV), StaxEventItemReader(XML)등이 있습니다.

MyBatisXXXReader는 MyBatis-Spring에서 제공되며, 더 자세한 내용은 공식 문서를 참고하시면 좋을 것 같습니다.


ItemProcessor

  • 데이터 처리 단계입니다.
  • 필수로 구현해야하는 것이 아닙니다.

ItemProcessor를 사용하는 방법은 2가지입니다.

  • 변환
    • Reader에서 읽은 데이터를 원하는 타입으로 변환하여 writer에게 넘겨 줍니다.
  • 필터
    • Reader에서 읽은 데이터를 writer에게 넘겨줄 것인지 정합니다.
    • null을 반환하면 writer에 전달되지 않습니다.

예제 코드는 jojoldu님의 블로그에 잘 나타나 있으니 참고하시면 좋을 것 같습니다.

jojoldu님 블로그: 9. Spring Batch 가이드 - ItemProcessor


ItemWriter

  • Spring Batch에서 사용하는 출력 기능입니다.
  • Reader의 read()는 Item 하나를 반환하는 반면, Writer의 write()는 인자로 Item List를 받습니다.

DB와 관련된 Writer는 아래의 3가지가 존재합니다.

  • JdbcBatchItemWriter
  • HibernateItemWriter
  • MyBatisBatchItemWriter
  • JpaItemWriter

그 외에 Reader와 동일하게 FlatFileItemWriter(구조화 되지 않은 파일), StaxEventItemWriter(XML) 등이 존재합니다.

Writer의 예제 코드도 jojoldu님의 블로그를 참고하시면 좋을 것 같습니다.

jojoldu님 블로그: 8. Spring Batch 가이드 - ItemWriter


Tasklet Model

  • 한 번에 하나의 레코드만 읽어야 할 경우 tasklet model이 적합합니다.
  • tasklet 모델을 사용하려면 tasklet 인터페이스를 구현해야 합니다.

 

Tasklet 인터페이스의 구현체 클래스

SystemCommandTasklet

  • 시스템 명령어를 실행하는 역할을 합니다.
  • 시스템 명령어는 비동기적으로 실행되며, 실행을 관리하기 위해 setTaskExecutor(TaskExecutor)로 지정된 실행기가 사용됩니다. 외부 프로세스가 멈추거나 문제가 발생할 경우, 작업이 멈추지 않고 무한히 대기하는 상황을 방지하기 위해 타임아웃을 반드시 설정해야 합니다.
  • 주기적으로 명령어가 종료되었는지, 타임아웃이 만료되었는지, 또는 작업이 중단되었는지를 확인합니다. 이 확인은 setTerminationCheckInterval(long)을 통해 설정된 간격으로 이루어집니다. 작업이 중단된 것이 감지되면, JobInterruptedException을 발생시켜 Tasklet 실행이 즉시 종료됩니다.
  • 또한, setInterruptOnCancel(boolean) 옵션을 통해 Tasklet이 비정상 종료될 때, 시스템 명령어를 실행 중인 스레드를 강제로 중단할지 여부를 설정할 수 있습니다.
  • 특징
    • 명령어 실행: 리눅스 또는 윈도우 명령어를 실행할 수 있으며, 이를 통해 외부 스크립트(예: bash 스크립트, bat 파일)를 호출하거나 다른 프로그램을 실행할 수 있습니다.
    • 비동기 실행: 스프링 배치의 단계 중 하나로서 실행되며, 성공적으로 완료되면 다음 단계로 넘어갑니다.
    • 예외 처리: 명령어가 실패하면 해당 오류를 캐치하고 처리할 수 있으며, 실패 시 배치 작업이 중단될 수도 있습니다.

MethodInvokingTaskletAdapter

  • POJO 메서드를 호출하는 Tasklet입니다.
    • POJO(Plain Old Java Object): 스프링에서는 빈(Bean)이나 객체를 POJO라고 합니다. 즉, 특수한 인터페이스를 구현하거나 프레임워크에 의존하지 않는 순수한 자바 객체를 의미합니다.
  • targetObject에 지정된 객체의 targetMethod로 설정된 메서드가 실행됩니다. 메서드가 ExitStatus 타입을 반환하면 그 값이 종료 상태로 설정되고, 그렇지 않으면 ExitStatus.COMPLETED로 간주됩니다. 메서드는 일반적으로 인수를 받지 않지만, arguments 속성을 통해 인수나 배열을 전달할 수 있습니다.
  • 특징
    • 메서드 호출: 스프링의 일반적인 빈(Bean)의 메서드를 배치 작업의 일부로 호출할 수 있습니다.
    • 간단한 비즈니스 로직 수행: 별도의 복잡한 로직을 구현하지 않고도, 이미 작성된 메서드를 호출하여 작업을 처리할 수 있습니다.
    • 재사용성: 재사용 가능한 비즈니스 로직이 이미 존재하는 경우, 해당 로직을 배치에서 그대로 호출할 수 있습니다.

 


그 외 참고