운영하는 서비스에서 휴면대상 회원에게 알림메시지를 보내야하는 기능구현이 필요했다. 해당 기능 구현을 위해서 팀에서 Spring Boot Batch를 사용하기로 했다.
Spring Boot Batch란?
스프링부트에서는 앞서 설명한 휴면대상 회원에게 알람메시지를 보내야하는 일괄작업을 쉽고 안전하게 처리해줄 수 있는 배치 어플리케이션을 제공한다. 그 기능이 Spring Boot Batch이다.
Spring Batch 구조
Job
- Job은 JobLauncher에 의해 실행
- Job은 배치의 실행 단위를 의미
- Job은 N개의 Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있다.
예를 들면, A Step 실행 후 조건에 따라 B Step 또는 C Step을 실행 설정
Step
- Step은 Job의 세부 실행 단위이며, N개가 등록돼 실행된다.
- Step의 실행 단위는 크게 2가지로 분류
1. Chunk 기반 : 하나의 큰 덩어리를 n개씩 나눠서 실행
2. Task 기반 : 하나의 작업 기반으로 실행
Chunk 기반 Step은 ItemReader, ItemProcessor, ItemWriter가 있다.
ItemReader
배치 처리 대상 객체를 읽어 ItemProcessor 또는 ItemWriter에게 전달
ItemProcessor
input 객체를 output 객체로 filtering 또는 processing 하여 ItemWriter에게 전달
- ItemReader에서 읽은 데이터를 수정 또는 ItemWriter 대상인지 filtering
- ItemProcessor는 optional하다
- ItemProcessor가 하는 일을 ItemReader 또는 ItemWriter가 대신 할 수 있음
ItemWriter
- DB Update를 하거나, 처리 대상 사용자에게 알림 요청
Batch 테이블
배치 실행을 위한 메타 데이터가 저장되는 테이블
BATCH_JOB_INSTANCE
- Job이 실행되며 생성되는 최상위 계층의 테이블
- job_name과 job_key를 기준으로 하나의 row가 생성되며, 같은 job_name과 job_key가 저장될 수 없음
- job_key는 BATCH_JOB_EXECUTION_PARAMS에 저장되는 Parameter를 나열해 암호화해 저장
BATCH_JOB_EXECUTION
- Job이 실행되는 동안 시작/종료 시간, job 상태 등을 관리
BATCH_JOB_EXECUTION_PARAMS
- Job을 실행하기 위해 주입된 parameter 정보 저장
BATCH_JOB_EXECUTION_CONTEXT
- Job이 실행되며 공유해야할 데이터를 직렬화해 저장
BATCH_STEP_EXECUTION
- Step이 실행되는 동안 필요한 데이터 또는 실행된 결과 저장
BATCH_STEP_EXECUTION_CONTEXT
- Step이 실행되며 공유해야할 데이터를 직렬화해 저장
특징
- JobInstance의 생성 기준은 JobParameters 중복 여부에 따라 생성
- 다른 parameter로 Job이 실행되면, JobInstance가 생성
- 같은 parameter로 Job이 실행되면, 이미 생성된 JobInstance가 실행
- JobExcution은 항상 새롭게 생성
- 처음 Job 실행시 date parameter가 1월 1일로 실행 됐다면, 1번 JobInstance 생성
- 처음 Job 실행시 date parameter가 1월 2일로 실행 됐다면, 2번 JobInstance 생성
- 처음 Job 실행시 date parameter가 1월 2일로 실행 됐다면, 1번 JobInstance 재실행
- 이때 Job이 재실행 대상이 아닌 경우 에러가 발생
- Job을 항상 새로운 JobInstance가 실행 될 수 있도록 RunIdIncrementer 제공
- RunIdIncrementer는 항상 다른 run.id를 Parameter로 설정