배치란?
배치는 일정 시간 동안 대량의 데이터를 한 번에 처리하는 방식이다. 대량 데이터를 복잡한 쿼리를 통해 이동시키는 도중 프로그램이 멈추면 처음부터 다시 시작해야 하는 문제가 생길 수 있다. 이를 방지하기 위해 작업 중간 지점을 기록하는 메커니즘을 활용한다. 이렇게 함으로써 중단된 지점에서 다시 작업을 이어갈 수 있다.
배치는 일반적으로 반복적이고 스케줄 기반으로 실행된다. 예를 들어, 매일 새벽 특정 데이터를 처리하거나 정기적으로 보고서를 생성하는 작업이 이에 해당한다.
현재 Batch는 5.x 버전이 나오면서 이전에 사용했던 방식과 많은 변화가 있어 문서를 학습하고 실제로 사용해보지 않으면 쓰기 힘들다고 느꼈다. 계속 박치기?를 하면서 성공한 나의 환경 설정을 공유해보려 한다.
Spring Batch의 핵심 기능
Spring Batch는 단순한 데이터 처리를 넘어 다양한 기능을 제공한다.
- 체계적인 작업 관리
- Job, Step, Chunk 단위로 작업을 나눠 세밀하게 관리한다.
- Job 내부에서 여러 Step을 정의할 수 있고, 각 Step은 "읽기 -> 처리 -> 쓰기"를 반복한다.
- 트랜잭션 관리
- 배치 작업 중 데이터 처리의 신뢰성을 보장하기 위해 트랜잭션 기반으로 작업을 처리한다.
- 실패 시 특정 지점에서 작업을 재시작할 수 있다.
- 스케줄링 및 재시도
- Spring Scheduler나 Quartz와 같은 스케줄링 도구와 연동 가능하다.
- 작업 실패 시 재시도와 복구를 지원한다.
- 페이징 및 청크 처리
- 대량 데이터를 한 번에 처리하지 않고, 청크(Chunk) 단위로 나눠 반복 작업을 수행한다.
- 이를 통해 메모리 사용량을 줄이고 성능을 최적화한다.
- 다양한 데이터 소스 지원
- 데이터베이스, 파일 시스템, 웹 API 등 여러 소스와의 유연한 연동이 가능하다.
- 이로 인해 다양한 형태의 데이터를 처리할 수 있다.
- 병렬 처리 및 분산 처리
- 병렬 실행과 분산 작업을 통해 대량 데이터를 더 빠르게 처리할 수 있다.
- 예를 들어, 멀티스레드 방식이나 클러스터 환경에서 작업을 분배할 수 있다.
- 메타 데이터 관리
- 배치 작업의 상태, 실행 이력, 오류 기록 등을 관리하는 메타 테이블을 제공한다.
- 이를 통해 작업 진행 상황을 모니터링하고 분석할 수 있다.
메타 테이블
Spring Batch는 데이터 처리 정보를 저장하는 메타 테이블을 제공한다. 이는 배치 작업의 상태와 이력을 관리하는 데 사용된다. 메타 테이블은 기본적으로 다음 정보를 포함한다.
- 작업 이름, 실행 시간, 실행 상태
- 각 Step의 처리 상태 및 오류 정보
- 재시작을 위한 체크포인트 정보
이를 활용하면 테이블 간 데이터 이동, 엑셀 파일 변환, 웹 API 호출 등 다양한 데이터 작업을 효율적으로 수행할 수 있다.
배치 작업의 동작 방식
Spring Batch의 기본 동작 방식은 다음과 같다.
- 데이터를 읽어온다 (Item Reader).
- 데이터를 처리한다 (Item Processor).
- 처리된 데이터를 저장한다 (Item Writer).
Chunk 기반 처리
Spring Batch는 데이터를 Chunk 단위로 나눠 처리한다. 청크는 메모리 사용량을 제어하고, 작업 중 실패 시 체크포인트에서 다시 시작할 수 있도록 돕는다. 예를 들어, 청크 크기를 100으로 설정하면 100개의 데이터를 읽고 처리한 후 한 번에 저장한다.
배치 활용 사례
배치 작업은 다음과 같은 다양한 분야에서 활용된다.
- 은행 업무: 매일 자정 전일 데이터를 기반으로 이자 계산
- 회원 관리: 주기적인 회원 상태 확인
- 급여 처리: 정기적으로 급여 계산 및 지급
- 보고서 생성: 매주 또는 매월 데이터를 기반으로 보고서 작성
- 데이터 정리: 오래된 데이터를 삭제하거나 백업
Spring Batch의 아키텍처
Spring Batch의 주요 구성 요소는 다음과 같다.
- Job Launcher: 배치 작업을 실행하는 시작점
- Job: 읽기, 처리, 쓰기 과정을 정의한 작업 단위
- Step: Job 내부에서 실행되는 하나의 단위 작업
- Item Reader: 데이터를 읽는 역할
- Item Processor: 데이터를 처리하는 역할
- Item Writer: 처리된 데이터를 저장하는 역할
Spring Batch는 또한 병렬 처리와 분산 처리를 지원하며, 대규모 데이터 처리를 더 효율적으로 수행할 수 있다. 아래 그림은 Spring Batch의 기본 아키텍처를 나타낸다.
Spring Batch에서 두 개의 DB 연결
Spring Batch 작업에서는 메타데이터 저장용 DB와 배치 데이터 처리용 DB를 별도로 구성할 수 있다. 이를 구현하기 위한 환경과 설정 방법은 다음과 같다.
환경
- Java 17
- Spring Framework 3.x
- Spring JPA
- Spring Batch
- Lombok
- MySQL
application.yaml 설정
두 데이터 소스를 설정하고 충돌 방지를 위해 하나의 데이터 소스를 기본값으로 지정한다.
spring:
batch:
job:
enabled: false
datasource-data:
url: jdbc:mysql://localhost:3306/스키마1?serverTimezone=Asia/Seoul
driver-class-name: com.mysql.cj.jdbc.Driver
username: 아이디
password: 비밀번호
datasource-meta:
url: jdbc:mysql://localhost:3306/스키마2?serverTimezone=Asia/Seoul
driver-class-name: com.mysql.cj.jdbc.Driver
username: 아이디
password: 비밀번호
위 내용은 아래 깃허브에서도 확인이 가능하다!
잘 읽었다면 댓글 또는 링크에 들어와서 별하나만 눌러주고 가주면 감사하겠다...ㅎ
https://github.com/Sunro1994/TIL/tree/main/spring/batch
'Spring > Batch' 카테고리의 다른 글
[Spring Batch5] Batch를 사용해서 추가정보 미 등록 유저 삭제하기 (2) | 2024.12.24 |
---|