반응형
해당 글에서는 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을 기반으로 주요한 용어들을 설명합니다.
1. 전체 프로세스
1. Job Launcher로 Job을 실행합니다. (Job Launcher -> Job)
2. Job은 Step을 통해 실제 배치처리를 수행합니다. (Job → Step)
3. Step에서는 읽어오고(Item Reader) → 처리하고(Item Processor) → 저장(Item Writer)을 수행합니다. (Step → Item Reader, Processor, Writer)
2. Job
💡 Job 이란?
- 하나 이상의 Step으로 구성이 되며 ‘배치 처리의 최상위 단위’를 의미합니다.
- 실행 시점에 파라미터를 전달받을 수 있으며 실행 결과를 반환할 수 있습니다.
- 1개의 Job은 1개 이상의 Step으로 구성되어 있습니다.
💡 Job 수행과정
💡 JobParameters가 포함되어 수행되는 경우
용어 | 설명 |
Job | 배치 처리의 ‘단위 작업’을 의미합니다 |
JobInstance | 하나의 Job 실행을 나타내는 ‘인스턴스’를 의미합니다 |
JobParameters | Job 실행 시 필요한 ‘파라미터’를 의미합니다 |
JobRepository | Job 실행 정보를 저장하고 관리하는 ‘저장소’를 의미합니다 |
JobLauncher | Job을 실행하는 인터페이스를 의미합니다 |
JobExecution | Job 실행 정보를 나타내는 인스턴스를 의미합니다 |
JobExecutionListener | Job 실행 전후로 수행할 작업을 정의하는 인터페이스를 의미합니다 |
3. Step
💡 Step 이란?
- 실제로 배치 처리를 ‘수행’하는 단위를 의미합니다. Spring Batch Job안에는 한 개 이상의 Step으로 구성되어 있습니다.
- Step에서는 하나의 작업만 처리를 수행하는 ‘Tasklet’ 방식 또는 Reader-Processor-Writer 묶음으로 여러 작업을 처리를 하는 ‘Chunk’ 방식이 있습니다.
용어 | 설명 |
Step | Job을 구성하는 작은 단위 작업을 의미합니다 |
ItemReader | 데이터를 읽어오는 인터페이스를 의미합니다 |
ItemProcessor | 읽어온 데이터를 처리하는 인터페이스를 의미합니다 |
ItemWriter | 처리한 데이터를 출력하는 인터페이스를 의미합니다 |
ExecutionContext | Step 실행 중 필요한 컨텍스트 정보를 의미합니다 |
StepExecution | Step 실행 정보를 나타내는 인스턴스를 의미합니다 |
StepExecutionListener | Step 실행 전후로 수행할 작업을 정의하는 인터페이스를 의미합니다 |
3) Spring Boot Batch의 종류
1. Tasklet 방식
💡Tasklet 방식
- Tasklet을 이용한 Task 기반 처리 방식
- Batch의 Step 단계에서 ‘단일한 레코드(row)’나 ‘파일’을 하나의 작업만 처리하는 방식을 의미합니다. 해당 모델에서는 처리는 각각의 처리를 하나의 트랜잭션에서 처리합니다.
- 일반적으로 파일을 읽고 처리한 다음 결과를 데이터베이스에 쓰는 등의 작업을 수행합니다.
- 단일 작업을 처리하기 때문에 작업이 끝날 때까지 대기해야 합니다. 그렇기에 대용량 데이터 처리에는 적합하지 않습니다.
[ 더 알아보기 ]
💡 데이터베이스의 레코드(row)
- 테이블에 저장된 실제 데이터를 나타냅니다.
- 예를 들어, 학생 정보를 저장하는 데이터베이스 테이블 '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를 병렬로 처리’합니다. 병렬 처리를 통해 처리 속도를 높일 수 있다는 장점이 있습니다.
- 예를 들어, 여러 대의 서버에서 동시에 작업을 처리해야 할 때 사용됩니다.
💡 Parallel Chunk 수행 과정
1. 데이터를 적절한 크기로 분할합니다.
2. 분할된 각각의 부분을 병렬처리할 수 있도록 작업을 분배합니다.
3. 각각의 부분을 병렬처리합니다.
4. 처리된 결과를 다시 합칩니다.
4. Remote Chunking 방식
💡 Remote Chunking 방식
-여러 대의 서버에서 대용량 데이터 처리를 수행할 때 사용됩니다. 서버 간에 데이터를 공유하고, 각각의 서버에서 병렬로 처리합니다.
참고사이트
[참고] 공식사이트 Spring Boot Batch
[참고] Baeldung: Spring Boot With Spring Batch
https://www.baeldung.com/spring-boot-spring-batch
[참고] Baeldung: Introduction to Spring Batch
Introduction to Spring Batch | Baeldung
💡 Spring Boot에서 스케줄링과 Spring Boot Quartz에 대해 관심이 있으시다면 아래의 글이 도움이 됩니다.
오늘도 감사합니다. 😀
반응형
'Java > Spring Boot' 카테고리의 다른 글
[Java] Spring Cloud 이해하기 -1 : 주요 특징으로 이해하기 (0) | 2023.06.19 |
---|---|
[Java] 스케줄링 & Spring Boot Quartz 이해하고 적용하기 -1 : 설정 및 간단예시 (1) | 2023.04.22 |
[Java] Spring Boot Cache 이해하고 설정하기 -2 : 사용 및 활용 예시 (0) | 2023.04.16 |
[Java] Spring Boot Cache 이해하고 설정하기 -1 : 정의, 환경 설정 (2) | 2023.04.16 |
[Java] Spring Boot AOP(Aspect-Oriented Programming) 이해하고 설정하기 (2) | 2023.03.01 |