Today I Learned
(24.08.06)[17주차] Spring Batch와 스케쥴링
프로젝트에서 특정 시간마다 코드 챌린지의 순위의 갱신, 그리고 Top 검색어의 30분마다의 갱신의 주기적인 작업이 필요했다.
이로써 본인의 로직은 아니지만, 담당 팀원의 구현으로 Spring Batch 의 스케쥴 기능을 사용함으로 일련의 기능들이 구현을 완성했고,
대용량 데이터 처리에 관련해서 SpringBatch를 사용 하면서 참고할 시간이 없었기에 관련되어 학습하고 정리를 하려고 한다.
Spring Batch
- 대량의 데이터를 처리하기 위한 Framework
- Spring Framework 기반의 서브 프로젝트
- 로깅, 트랜잭션 관리, 리소스 관리 기반으로 대규모 데이터를 일괄적으로 반복 처리, 데이터 변환 및 집계, 배치 작업, 주기적인 처리를 안정적으로 자동화 작업 시행
- 복잡한 대용량 및 고성능 일괄 작업을 효율적으로 수행할 수 있는 장점
- DB, 파일 시스템, Messaging 등 다양하게 데이터소스 연동 가능확장
- 다양하게 확장할 수 있는 Framework
- 오류가 발생해도, 재시도 로직과 오류 처리 기능을 사용하게 할 수 있음
- 로깅 및 알림 등으로 추적이 가능
주요 기능별 구조
Job
- Spring Batch에서 기본적인 작업을 정의하고, 여러 데이터 처리 작업에서의 실행 단위
- 여러단계의 Step으로 구성
JobLauncher
- Job을 생성, 실행하는 Interface
- JobParameters를 사용해 Job을 생성, 실행하면서 전달
- 개발자가 직접 수동으로 사용 가능
- CommandLineJobRunner 명령어를 통해서 일괄저리 가능
- 해당 명령어로 자동으로 다양한 프로세스를 수행하게끔 할 수 있음
JobRepository
- Job과 Step을 관리하는 시스템
- 관련 관리 정보는 Spring Batch에서 지정한 테이블 Schema 기반으로 DB에 사용
- 메타데이터의를 저장한다는 의미
- 실행 중 발생한 예외, 처리 레코드, 성공/실패 기록 등을 관리
- BATCH_JOB_EXECUTION_CONTEXT
- 관련 테이블
- BATCH_JOB_EXECUTION
- BATCH_JOB_EXECUTION_PARAMS
- BATCH_JOB_INSTANC
- BATCH_STEP_EXECUTION
- BATCH_STEP_EXECUTION_CONTEXT
JobExecution / StepExecution
- Job과 Step에 관한 실행 상태에 대한 정보를 모아놓은 객체
- 처리된 아이템 수, 실행 시간, 예외 정보, 재시도 정보 등
- 실행 중 발생한 예외와 처리 레코드 수 등을 추적할 때 사용 가능
- JobRepository에 저장되게 되어있음
Step
- Job을 구성하는 작업 처리 단위
- 각 Step은 독립적으로 배치 작업을 정의
- Read, Process, Write 작업으로 구성
- Step 에서 Item을 읽어오는 Interface
- DB, File, Queue 등 다양한 데이터 소스를 여러 방법으로 읽어올 수 있음
- Reader 에서 읽어온 item을 처리하는 Component
- Spring Batch 처리에서는 필수적인 요소는 아니지만, 데이터를 변환, 필터, 집계 등의 데이터 처리가 필요할 때 사용
- Processor에서 처리된 데이터를 저장하는 Component
- 읽어온 대상에 대해 저장, 수정(Update) 또는 Queue일 경우엔 Send 가능
- Chunk라는 단위로 Item들을 묶어서 처리가 가능
- ItemReader
Spring Batch 활용 예시
- 수동으로 많은 양의 데이터를 처리해야하는 작업을 자동화하는 기능을 중심으로 활용이 가능
- 일일 거래 내용 정리
- 금융 기관 등 매일 거래 데이터를 수집해서, 한 데 모아서 보고서를 생성하는 작업이 필요하기 때문에 매일 정해진 시간, 대량의 데이터를 읽고, 연산수행, 파일을 생성해서 저장
- 재고관리
- 커머셜 플랫폼에서 재고를 모니터링 하면서 자동으로 초과/부족에 관한 알람을 자동으로 보내거나 문서작성, 주문 생성 작업
- 주기적으로 재고 데이터를 조회, 로직에 따라 재고 수준을 유지하기 위한 작업을 자동으로 일괄적으로 진행, 업데이트
→ 그렇다면 정해진 시간에 또는 주기적으로 일괄 데이터 처리를 진행해야하는 부분에 있어서 Spring Batch 는 Scheduler를 사용이 가능
Quartz
- 강력한 Scheduling 관련 작업 관리 Framework
- Java의 환경 및 규모와 독립적으로 구분되나 같이 가능해서 Spring과 기본적으로 지원을 같이 해나가고 있는 오픈 소스
- Cron 표현식을 사용한 매우 정교한 스케쥴링이 가능
- 일정한 주기로 작업을 예약하거나 실행하기 위해 사용하는 문자열 형식
- 초/분/시간/일/월/요일 6개의 필드를 숫자로 표현
-
- Asterisk 사용해서 해당 필드 전체값을 지정해 주기를 설정할 수도 있음
- ex) 0 0/5 * * * ? : 요일신경 없이 매 정각(초) 5분마다(0/5) 주기 0 12 * * MON : 매일 매월 월요일마다 정오 12시마다 주기
-
Quartz 작업
- 특정 시간에 작업
- 작업 수행 주기 설정
- 작업 수행 시간 설정 및 제어
내일은 좀더 코드를 작성하면서 Quartz까지 같이 동작시키면서 주기적으로 작업을 하게끔 할 수 있도록 활용 코드를 간단하게 작업을 할 예정!
'Today I Learned' 카테고리의 다른 글
(24.08.09)[17주차] WebSocket과 실시간 메시지 구조 (0) | 2024.08.09 |
---|---|
(24.08.07)[17주차] Spring Batch와 스케쥴링 - 활용 및 정리 (0) | 2024.08.07 |
(24.08.05)[17주차] Nginx 404 Not Found 오류 고찰과 해결 (0) | 2024.08.05 |
(24.08.02)[16주차] CD Pipeline 중 GitHubs자동화 배포에 대한 정리 (0) | 2024.08.02 |
(24.07.24)[15주차] Sprint Data JPA Tuple 객체의 사용 (2) | 2024.07.24 |