들어가기 앞서,
스프링 부트는 실무에서 사용할 수밖에 없는 기술 중 하나입니다. 계정계 업무에서는 배치를 스케쥴러와 함께 사용하여 지정된 시간에 수행할 수 있습니다. 예를 들어 재무 파트에서는, 은행 마감 시 차변과 대변의 금액이 다른 경우 배치를 실행시켜 알림을 알려주고, 예외 처리를 할 수 있습니다. 또한 특정 일자나 특정 시간에 맞춰 메일 발송을 할 수 있는 로직을 구성한 경험이 있습니다. 대용량 데이터의 기준은 사람마다 다른 것으로 보입니다. 아래 커뮤니티에서는 100만 건이나 1억 이상건이 대부분이지만 개발자나 회사마다 조금씩 다르고 과거와 다르게 지금은 점점 더 성능이 향상되면서 기준을 조금 더 높게 잡는 것 같습니다.
대용량의 데이터 기준 - Okky
여러 채용 공고를 보면 "대용량 데이터를 처리하기 위한 배치/SQL 사용 여부"라는 문구가 있습니다. 마침 Batch 공부를 하려고 하기도 했었기 때문에 스프링 배치를 활용하여 대용량 데이터 처리하는 방법을 정리해 보도록 하겠습니다.
스프링 배치란(Spring Batch)?
- 엔터프라이즈 시스템의 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 배치 프레임워크 입니다.
- 배치 프로세싱은 일괄처리라는 뜻을 가지며, 일괄처리는 일련의 작업을 정해진 로직으로 수행하는 것입니다.
- 스프링 배치는 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 기능을 제공합니다.
Spring Batch를 언제 사용하면 좋을까?
- 대용량의 비즈니스 데이터를 복잡한 로직으로 처리 해야 하는 경우
- 특별한 일자나 시간에 스케쥴러를 통하여 자동화된 작업을 해야하는 경우
- 대용량 데이터의 포맷 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야 하는 경우
Spring Batch Architecture
Application
- 스프링 배치를 사용하여 개발자가 작성한 모든 배치 작업과 사용자 지정 코드를 포함합니다.
Batch Core
- 배치 작업을 시작하고 제어하는 데 필요한 핵심 런타임 클래스를 포함합니다.
- 여기에는 JobLauncher, Job 및 Step을 위한 구현이 포함됩니다.
Batch Infrastructure
애플리케이션 개발자(ItemReader 및 ItemWriter와 같은 리더 및 라이터)와 코어 프레임워크 자체(재시도, 자체 라이브러리)가 모두 사용하는 공통 리더 및 라이터 및 서비스(예: RetryTemplate)가 포함됩니다.
Spring Batch 용어
JoB
- 배치처리 과정을 하나의 단위로 만들어 놓은 객체입니다.
- 하나 이상의 Step을 가집니다.
- 배치 처리 과정에 있어 계층 최상단에 위치합니다.
JobInstance
- Job의 실행 단위입니다.
- 11월 12일, 11월 13일 실행 시 각각의 JobInstance 가 생성됩니다.
- 11월 12일 실행 실패 시, 11월 13일에 대한 데이터만 처리합니다.
- 개발자가 설정을 통하여 유니크 인스턴스 식별 규칙을 바꿀 수 있습니다.
JobParameters
- JobInstance를 구별할 때 사용합니다.
- JobInstance에 전달되는 매개변수 역할 도 하고 있습니다.
- String, Double, Long, Date 4가지 형식을 지원합니다.
JobExecution
- JobInstance 에 대한 실행 시도에 대한 객체입니다.
- 11월 12일 실행한 Joinstance 가 실패하여 재실행을 한다면, 동일한 JobInstance를 실행시키지만, 2번의 실행에 대한 JobExecution 은 개별로 생기게 됩니다.
- JobExecution 은 JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 담고 있습니다.
Step
- Job의 배치처리를 정의하고 순차적인 단계를 캡슐화합니다.
- Job 은 최소 1개 이상의 Step을 가져야 합니다.
- Job의 일괄 처리를 제어하는 모든 정보가 들어있습니다.
StepExecution
- JobExecution과 동일하게 Step 실행 시도에 대한 객체를 나타냅니다.
- Job 이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step 이 실패하게 되면 다음 단계가 실행되지 않기 때문에, 실패 이후 StepExecution 은 생성되지 않습니다.
- JobExecution과 동일하게 실제 시작이 될 때만 생성됩니다.
- JobExecution에 저장되는 정보 외에, Read 수, Write 수, Commit 수, Skip 수 등의 정보들도 저장이 됩니다.
ExecutionContext
- Job에서 데이터를 공유할 수 있는 데이터 저장소입니다.
- ExecutionContext는 JobExecutionContext와 StepExecutionContext 가 있습니다. 이 두 가지는 지정되는 범위가 다릅니다.
- JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExecutionContext는 실행 사이에 저장이 되게 합니다.
- ExecutionContext를 통해 Step 간 Data 공유가 가능하며 Job 실패 시 ExecutionContext 를 통한 마지막 실행 값을 재구성할 수 있습니다.
JobRepository
- 위에서 말한 모든 배치 처리 정보를 담고 있는 메커니즘입니다.
- Job 이 실행되게 되면 JobRepository에 JobExecution과 StepExecution 정보들을 저장하고 조회하며 사용하게 됩니다.
JobLauncher
- Job과 JobParameters를 사용하여 Job을 실행하는 객체입니다.
ItemReader
- Step에서 Item을 읽어오는 인터페이스입니다.
- 다양한 인터페이스가 존재하며 다양한 방법으로 Item 을 읽어 올 수 있습니다.
ItemWriter
- 처리된 Date를 Writer 할 때 사용합니다.
- 처리 결과물에 따라 INSERT, UPDATE 될 수 있고, Queue를 사용한다면 Send 가 될 수도 있습니다.
- Write 또한 Read와 동일하게 다양한 인터페이스가 존재한다.
- 기본적으로 Item을 Chunk로 묶어 처리하고 있습니다.
ItemProcessor
- Reader에서 읽어온 Item을 데이터 처리하는 역할입니다.
- Processor 은 배치를 처리하는데 필수 요소는 아니며 Reader, Writer, Processor 처리를 분리하여 각각의 역할을 명확하게 구분하고 있습니다.
Spring Boot Batch의 종류
Tasklet 방식
- Batch의 Step 단계에서 '단일한 레코드(Row)'나 '파일' 을 하나의 작업만 처리하는 방식을 의미합니다.
- 단일 작업이 끝날 때까지 대기해야 하므로, 대량 처리가 필요하지 않을 때 주로 사용됩니다.
- 일반적으로 비교적 간단한 작업, 예를 들어 파일을 읽고 처리한 다음 결과를 데이터베이스에 쓰는 등의 작업을 수행합니다.
Chunk 방식
- Batch 의 Step 단계에서 '단일한 레코드(Row)를 묶어서' 여러 작업을 처리하는 방식을 의미합니다.
- Chunk 단위로 트랜잭션을 수행하기 때문에 실패할 경우엔 해당 Chunk 만큼만 롤백이 되고, 이전에 커밋된 트랜잭션 범위까지는 반영이 됩니다.
- ItemReader, ItemProcessor, ItemWriter를 사용하여 Chunk 단위로 데이터를 처리합니다. 사전에 해당 내용에 대한 이해가 필요합니다.
- 대용량 데이터를 효율적으로 처리하며, 병렬 처리 및 페이징 읽기에 적합합니다.
글을 정리하며,
이번 글은 이론적인 부분을 정리하려고 노력하였습니다. 이렇게 글자로만 보면 조금 이해가 더딘 부분도 있고, 실제로 업무에서는 어떻게 사용되는지 참고하기에 부족할 수 있다고 생각합니다.
다음 게시글에 이어서 실제 개인 프로젝트로 간단한 예제를 만들어 보겠습니다.
References
Spring Batch - Reference Documentation
'개발 > Spring Batch' 카테고리의 다른 글
[Spring Batch] 환율 정보 SMS API 로 문자 보내기 (2023.10.18 이후 불가) - 예제편 (2) | 2023.12.02 |
---|---|
[Spring Batch] 환율 정보 API 를 간단한 배치 스케줄러 추가 - 예제편 (2) | 2023.11.24 |
[Spring Batch] 환율 정보 Open API를 활용한 간단한 배치 만들기 - 예제편 (3) | 2023.11.23 |