해당 글에서는 Spring Boot Batch에 대해서 이해하고 주요 용어인 Job, Step, Tasklet, Chunk에 대해서 이해를 돕기 위해서 작성한 글입니다.
1) Spring Boot Batch
💡 Spring Boot Batch 란? - 대량의 데이터를 처리하는 작업을 의미하며 이를 ‘자동화’하여 ‘시스템의 부하를 줄이고 효율적인 데이터 처리’를 가능하게 하는 프레임워크를 의미합니다.
- Spring Boot Batch 라이브러리로 설치를 하면 ‘스프링 스케줄러’도 함께 사용이 가능합니다.
💡 배치 프로그램(Batch Program)이란?
- ‘대량의 데이터를 처리하는 작업을 자동화’하는 프로그램을 의미합니다.
- 이러한 작업들은 보통 ‘스케줄러’를 이용하여 특정시간에 수행하도록 구성합니다. - 예를 들어 매일 밤 12시에 일괄적으로 데이터를 업데이트하는 작업이 배치 프로그램의 예시입니다.
[ 더 알아보기 ]
💡 스케줄러(Scheduler)란? - 일정한 시간 간격으로 반복적으로 수행되거나 특정 시간에 수행되도록 예약해 놓은 작업을 자동으로 실행해 주는 시스템입니다. - 스케줄러를 이용하면 주기적으로 반복되는 일일 업무나 특정 시간에 실행해야 하는 작업 등을 자동으로 처리할 수 있습니다.
💡 배치 프로그램과 스케줄러는 동일한 것이 아닌가?
- 비슷한 기능을 가지고 있지만 동일한 것은 아닙니다. 실행방법과 목적에 큰 차이가 있습니다. - 배치 프로그램은 일괄 처리를 위한 프로그램이며 ‘정해진 시간에 실행되지 않고 사용자의 명령이 있을 때 실행’합니다. - 스케줄러는 ‘정해진 시간에 자동으로 실행’되는 프로그램이며 ‘주기적으로 실행되는 작업’을 설정할 수 있습니다.
💡 Spring Boot Batch 라이브러리를 종속성으로 추가하고 스케줄러를 이용하려면 또 추가를 해야 하는가?
- 아닙니다. Spring Boot Batch 라이브러리로 설치를 하면 ‘스프링 스케줄러’도 함께 사용이 가능합니다.
1. 배치 사용 목적
💡 배치 프로그램을 사용하는 목적에 대해서 확인해 봅니다.
목적
설명
대량 데이터 처리
대규모 데이터베이스, 로그 파일, CSV 파일 등에서 ‘데이터 추출 및 처리’를 위해 사용됩니다.
자동화된 작업 처리
스케줄러를 이용하여 주기적으로 ‘반복되는 작업’ 자동 처리를 위해 사용됩니다.
분산 처리
여러 서버에서 대량의 ‘데이터 처리 가능’을 위해 사용됩니다.
재시도 및 로깅
데이터 처리 중 오류 발생 시 ‘자동 재시도 및 로깅 기능’ 지원을 위해 사용됩니다.
데이터 분석
데이터 마이그레이션, 백업 및 복원, 데이터 분석 등 다양한 용도로 사용됩니다.
2. 배치 주요 기능
💡 배치 프로그램에서 주요한 기능들에 대해서 확인해 봅니다.
주요 기능
설명
Job과 Step을 이용한 배치 프로세스 구현
배치 처리의 단위 작업(Job)과 작은 단위 작업(Step)을 이용하여 배치 프로세스를 구현하는 기능을 제공합니다.
Chunk 지향 처리 방식을 통한 대용량 데이터 처리
Chunk 단위로 데이터를 처리하여 대용량 데이터 처리 기능을 제공합니다.
Quartz, Cron 등의 스케줄러를 이용한 배치 작업 스케줄링
스케줄러를 이용하여 배치 작업을 주기적으로 실행하도록 스케줄링을 제공합니다.
Batch 작업에 대한 로깅과 예외 처리 기능 제공
Batch 작업 수행 중 로깅과 예외 처리를 지원하여 안정적인 배치 작업 제공합니다.
[ 간단하게 알아가기 : 뒤에서 설명 예정 ]
💡 Chunk 지향 처리 방식
- 대용량 데이터를 처리하는 데 있어서 ‘메모리 사용량을 최소화’하고 ‘대용량 데이터를 작은 Chunk 단위로 나누어 처리’하는 방식입니다.
💡 Quartz
- Java 기반의 오픈 소스 ‘스케줄링 라이브러리’이며 특정 시간에 작업을 자동으로 실행하도록 예약을 할 수 있도록 기능을 제공합니다.
💡Cron
- Cron은 리눅스와 유닉스 계열 운영체제에서 사용되는 예약 작업 ‘스케줄링 시스템’입니다. 특정 시간에 실행되어야 하는 작업을 정의하는 데 사용됩니다.
2) Spring Boot Batch 프로세스 및 용어
💡 Spring Batch의 주요한 Job과 Step을 기반으로 주요한 용어들을 설명합니다.
- 테이블에 저장된 실제 데이터를 나타냅니다. - 예를 들어, 학생 정보를 저장하는 데이터베이스 테이블 'students'가 있다면, 각 학생의 정보는 레코드로 저장되며 학생 정보가 저장된 칼럼들은 학생의 이름, 학과, 학번 등의 속성을 나타냅니다.
2. Chunk 방식
💡Chunk 방식
- Chunk를 이용한 Chunk 기반 처리 방식 - Batch의 Step 단계에서 ‘단일한 레코드(row)를 묶어서’ 여러 작업을 처리하는 방식을 의미합니다. 해당 방식에서는 ‘묶인 레코드를 하나의 트랜잭션으로 처리’하며 실패를 하는 경우 롤백을 수행합니다.
- 해당 방식은 병렬 처리를 위해 Chunk를 사용하되 ‘순차적으로 처리하는 방식’이며 Parallel Chunk 방식은 Chunk를 독립적으로 처리하여 병렬 처리를 수행합니다. - 대용량 데이터를 처리할 때, 성능이 향상되고 중복 레코드 처리나 실패한 레코드 처리 등 예외 상황에 대한 대처가 용이합니다. - 예를 들어, 파일을 읽어들여 데이터를 처리하는 작업이나 DB에서 데이터를 조회하여 처리하는 작업 등이 있습니다.
[ 더 알아보기 ]
💡 Chunk 란?
- 데이터를 일정한 크기로 나눈 데이터 셋을 의미합니다. - Chunk 단위로 나누면 전체 데이터를 한 번에 처리하지 않기에 메모리 부하를 줄이고 성능을 향상할 수 있습니다.
💡 단일한 레코드를 묶어서 처리한다라는 말은 무슨 말인가? - Chunk 방식에서는 ‘Reader-Processor-Writer 방식’을 이용합니다. - 이러한 처리 방식은 대용량 처리를 위해서 사용하며 ‘Reader’는 데이터를 읽어 들이는 역할을 하며 ‘Processor’는 읽어 들인 데이터를 가공하거나 필터링하는 역할을 합니다. ‘Writer’는 가공된 데이터를 저장하는 역할을 수행합니다.
💡 Chunk 기반의 STEP의 Reader-Processor-Writer 처리 방식 순차적 확인
1. 데이터 베이스에서 데이터를 읽어옵니다 (Item Reader) 2. 읽어온 데이터를 처리합니다.(Item Processor) 3. 데이터를 저장합니다(Item Writer)
[참고] Chunk 기반 처리 방식
[참고] Tasklet, Chunk 처리방식의 비교표
구분
Tasklet
Chunk
실행 시점
STEP 실행 중
STEP 실행 전
실행 방식
‘작은 단위’로 분할하여 실행
‘하나의 큰 덩어리’로 실행
커밋 방식
‘Tasklet’ 단위로 처리 후 커밋
‘Chunk’ 단위로 처리 후 커밋
배치 성능
‘작은 단위’의 데이터 처리 시 유리
‘대량의 데이터’ 처리 시 유리
재시작
실패한 태스크릿만 다시 실행
실패 시 청크 전체 다시 실행
가독성
코드가 분할되어 가독성 향상
코드가 길어져 가독성 저하
유지보수
수정이 용이
수정이 어려움
3. Parallel Chunk 방식
💡 Parallel Chunk 방식
- Chunk 방식의 처리에서 더욱 빠른 처리 속도를 위해 Chunk를 독립적으로 처리하여 여러 개의 ‘Chunk를 병렬로 처리’합니다. 병렬 처리를 통해 처리 속도를 높일 수 있다는 장점이 있습니다. - 예를 들어, 여러 대의 서버에서 동시에 작업을 처리해야 할 때 사용됩니다.