본문 바로가기
Today I Learned 2024. 8. 6.

(24.08.06)[17주차] Spring Batch와 스케쥴링

프로젝트에서 특정 시간마다 코드 챌린지의 순위의 갱신, 그리고 Top 검색어의 30분마다의 갱신의 주기적인 작업이 필요했다.

 

이로써 본인의 로직은 아니지만, 담당 팀원의 구현으로 Spring Batch 의 스케쥴 기능을 사용함으로 일련의 기능들이 구현을 완성했고,

 

대용량 데이터 처리에 관련해서 SpringBatch를 사용 하면서 참고할 시간이 없었기에 관련되어 학습하고 정리를 하려고 한다.


Spring Batch

  • 대량의 데이터를 처리하기 위한 Framework
    • Spring Framework 기반의 서브 프로젝트
  • 로깅, 트랜잭션 관리, 리소스 관리 기반으로 대규모 데이터를 일괄적으로 반복 처리, 데이터 변환 및 집계, 배치 작업, 주기적인 처리를 안정적으로 자동화 작업 시행
    • 복잡한 대용량 및 고성능 일괄 작업을 효율적으로 수행할 수 있는 장점
  • DB, 파일 시스템, Messaging 등 다양하게 데이터소스 연동 가능확장
    • 다양하게 확장할 수 있는 Framework
  • 오류가 발생해도, 재시도 로직과 오류 처리 기능을 사용하게 할 수 있음
    • 로깅 및 알림 등으로 추적이 가능

주요 기능별 구조

출처 : https://terasoluna-batch.github.io/

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 등 다양한 데이터 소스를 여러 방법으로 읽어올 수 있음
    ItemProcessor
    • Reader 에서 읽어온 item을 처리하는 Component
    • Spring Batch 처리에서는 필수적인 요소는 아니지만, 데이터를 변환, 필터, 집계 등의 데이터 처리가 필요할 때 사용
    ItemWriter
    • 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까지 같이 동작시키면서 주기적으로 작업을 하게끔 할 수 있도록 활용 코드를 간단하게 작업을 할 예정!