아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.
DEVOCEAN에 연재 중인 KIDO님의 글을 참고하여 실습한 내용을 기록했습니다.
원본: [SpringBatch 연재 03] SpringBatch ChunkModel과 TaskletModel
Spring Batch의 Chunk Model과 Tasklet Model에 대해서 알아봅니다.
Chunk Model
Chunk Model의 동작 순서는 2회차에서 진행되었던 내용에서도 볼 수 있듯이 청크 단위에 따라 ItemReader, ItemProcessor, ItemWriter 를 반복 실행 합니다.
- 주의할 점은 읽어온 데이터를 Processor에서 가공하여 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장합니다.
이 때 Chunk 지향 처리의 전체 로직을 다루는 것은 ChunkOrientedTasklet
클래스입니다.
ChunkOrientedTasklet를 구성하는 Reader, Processor, Writer에 대해 알아보겠습니다.
ItemReader
- 데이터를 읽어 들입니다.
- DB의 데이터만을 얘기하는 것이 아닌 File, XML, JSON 등 여러 데이터 소스를 사용할 수 있습니다.
- 이외에 지원하지 않는 Reader라면 직접 만들 수도 있습니다.
DataBase Reader는 두 가지의 방법으로 데이터를 읽어 옵니다.
- 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)의 메서드를 배치 작업의 일부로 호출할 수 있습니다.
- 간단한 비즈니스 로직 수행: 별도의 복잡한 로직을 구현하지 않고도, 이미 작성된 메서드를 호출하여 작업을 처리할 수 있습니다.
- 재사용성: 재사용 가능한 비즈니스 로직이 이미 존재하는 경우, 해당 로직을 배치에서 그대로 호출할 수 있습니다.
그 외 참고
'알아두면 좋은 개발 지식 > Spring Batch 스터디' 카테고리의 다른 글
[4회차] FlatFileItemReader로 단순 파일 읽고, FlatFileItemWriter로 파일에 쓰기 (1) | 2024.10.26 |
---|---|
[3회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (4) | 2024.10.22 |
[2회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (2) | 2024.10.15 |
[2회차] SpringBatch 코드 설명 및 아키텍처 알아보기 (0) | 2024.10.13 |
[1회차] Spring Batch 스터디: 후기 및 추가 학습 내용 (1) | 2024.10.09 |