batch란?
- 큰 단위의 작업을 일괄 처리
- 대용량 처리량이 많고 비 실시간성 처리에 사용
- 대용량 데이터 계산, 정산, 통계, 데이터베이스, 변환 등
- 컴퓨터 자원을 최대로 활용
- 컴퓨터 자원 사용이 낮은 시간대에 배치를 처리하거나
- 배치만 처리하기 위해 사용자가 사용하지 않는 또다른 컴퓨터 자원을 사용
- 사용자 상호작용으로 실행되기 보단, 스케줄러와 같은 시스템에 의해 실행되는 대상
- crontab, jenkins 등을 이용해서 주기적으로 실행할 수 있다.
- 배치 프로그램은 보이진 않지만 늘 존재한다.
- 서비스를 운영하는 관점에서 주기적으로 작업을 처리하려면 배치 프로그램을 사용해야 한다.
batch 가 필요한 상황
- 필요한 데이터를 모아서 처리해야 할 때
- ex. 월별 거래 명세서 생성
- 일부러 지연시켜 처리할 때
- ex. 주문한 상품을 바로 배송 처리 하지 않고, 일정 시간 뒤 처리
- 자원을 효율적으로 활용하기 위해
- ex. 트래픽이 적은 시간 대에 서버 리소스를 활용
데이터 처리 관련 batch 가 사용되고 있는 예시
- 각 서비스의 데이터를 데이터 웨어하우스에 저장할 때
- ETL(Extract-Transform-Load)
- 아마존에서 연관 상품을 추천하는 데이터 모델을 만들 때
- 유저의 리텐션 등 마케팅에 참고할 데이터 지표를 집계할 때
서비스 batch 가 사용되고 있는 예시
- 메시지, 이메일, 푸시 등을 발송할 때
- 데이터를 마이그레이션 할 때
- 실패한 트랜잭션을 재처리할 때
- 쿠폰, 포인트 등이 만료 되었을때 소진시키는 처리를 할 때
- 월말 또는 월초에 특정 데이터를 생성할 때-월별거래 명세서
Spring batch란?
- 가볍고 다양한 기능을 가진 배치 프레임 워크 견고한 배치 어플리케이션 개발이 가능하도록 디자인 되어있다.
- Spring에서 지원하는 기술 적용 가능
- DI, AOP, 서비스 추상화
- 기업 시스템의 매일 운영에 필수적인 수준이다.
- 스프링 배치의 실행 단위인 Job과 Step
- 비교적 간단한 작업(Tasklet) 단위 처리와, 대량 묶음(Chunk)단위 처리
Spring batch 의 장점
- 스프링으로 작성된 코드를 재활용할 수 있다. 기존 Spring 프로젝트의 코드를 활용하거나 모듈을 이용할 수 있다.
- 만약 배치용 코드를 새로 작성한다면 Python, Shell script, Go 등 다른 언어로 비슷한 처리를 새로 구현해야 한다.
- 배치 처리를 위한 로직을 새로만드는 것보다 스프링 배치에서 제공하는 기능을 이용하는게 생산성 있는 방법이다.
- 로깅/추적, 트랜잭션관리, 작업처리통계, 재시작, 건너뛰기 등 대용량 처리에 필수적인 기능들을 제공
- 멀티코어 또는 멀티 서버에서 처리를 분산하는 기능을 제공한다.
- 프레임워크가 제공하는 기능들을 이해하고 잘 사용하면 된다.
@EnableBatchProcessing
public class SpringBatchExampleApplication {
public static void main(String[] args) {
}
}
- @EnableBatchProcessing 을 걸어둔다 -> 배치 작업을 한다는 것을 뜻함.
Spring batch 도메인 언어
- JobLauncher는 Job을 실행시키는 컴포넌트다.
- Job은 배치 작업이다.
- JobRepository는 Job 실행하고 Job, Step을 저장한다.
- Step은 배치 작업의 단계이고, Job 은 여러개의 Step 을 가질 수 있다.
- ItemReader, ItemProcessor, ItemWriter는 데이터를 읽고 처리하고 쓰는 구성한다.
- Step 은 ItemReader, ItemProcessor, ItemWriter 를 각각 하나씩만 가질 수 있다.
Spring batch 아키텍처
- Spring Batch가 제공하는 Core와 Infrastructure를 활용해 Application을 구현한다.
- Application Layer
- 사용자(=우리) 코드와 구성
- 비즈니스, 서비스 로직
- Core, Infrastructure를 이용해 배치의 기능을 만든다.
- Core Layer
- 배치 작업을 시작하고 제어하는데 필수적인 클래스다.
- Job, Step, JobLaucher 로 이루어져 있다.
- Infrastructure Layer
- 외부와 상호작용하는 Layer 이다.
- ItemReader, ItemWriter, RetryTemplate 와 같은 것들을 Infrastructure Layer 에 포함된다.
batch 동작 과정
- Spring batch 는 Job 타입의 빈이 생성되면, JobLauncher에 의해서 Job이 실행되고 Job에 의해서 Step이 실행됩니다.
- JobRepository 는 Job의 메타 데이터를 관리한다. -> Spring batch 의 전반적인 데이터를 관리한다.
- Job은 Nrodml Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다.
- Step의 실행 단위는 크게 2가지 이다.
- Chunk 기반 : 하나의 큰 덩어리를 N개씩 나눠서 실행
- Task 기반 : 하나의 작업 기반으로 실행
- Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 있다.
- 여기서 Item은 배치 처리 대상 객체를 의미한다.
- ItemReader: 배치 처리 대상 객체를 읽어서 ItemProcessor 또는 ItemWriter에게 전달한다. (ex> DB에서 데이터를 읽는다.)
- ItemProcessor: ItemReader로 받은 데이터를 가공하거나 필터링 한다. -> 필수값은 아니다. -> ItemReader나 ItemWriter가 대신할 수 있다.
- ItemWriter: 데이터를 최종 처리한다. -> DB에 값을 반영하거나 사용자에게 알림을 보낼 수도 있다.
yml 설정
spring:
batch:
job:
names: ${job.name:NONE}
- 이렇게 yml 파일을 설정하면, 모든 배치가 실행되는 것을 막을 수 있다.
- 원하는 배치 작업만 실행할 수 있게 된다.
- 위와 같이 Run/Debug configurations를 설정해 주면 해당 이름의 배치만 실행 된다.
REFERENCES
- 황지연님의 스프링 배치
'Spring Batch' 카테고리의 다른 글
JobExecutionListener (0) | 2022.02.27 |
---|---|
ItemWriter (0) | 2022.02.27 |
ItemProcessor (0) | 2022.02.27 |
ItemReader (0) | 2022.02.27 |
Tasklet, Chunk 비교 (0) | 2022.02.27 |