[Spring Batch] 구조

728x90

Batch란…?

사전 정의

네이버 영어사전 검색 결과

  • 큰 단위의 작업을 일괄 처리
  • 대부분 처리량이 많고 비 실시간성 처리에 사용
    • 대용량 데이터 계산, 정산, 통계, 데이터베이스, 변환 etc…
  • 컴퓨터 자원을 최대로 활용
    • 컴퓨터 자원 사용이 낮은 시간대에 배치를 처리하거나
    • 배치만 처리하기 위해 사용자가 사용하지 않는 또 다른 컴퓨터 자원을 사용
  • 사용자 상호작용으로 실행되기 보단, 스케줄러 같은 시스템에 의해 실행되는 대상
    • ex) 매일 오전 10시에 배치 실행, 매주 월요일 12시 마다 실행 etc…
    • crontab, jenkins…

Spring Batch 란…?

  • 배치 처리를 하기 위한 Spring Framework 기반 기술
    • Spring의 주요 기능 사용 가능 (DI, AOP, PSA)
  • 스프링 배치의 실행 단위: Job, Step
  • 비교적 간단한 작업(Tasklet) 단위 처리와 대량 묶음(Chunk) 단위 처리

배치 프로그램 실행 시, 주의 사항

  • 별 다름 옵션을 주지 않고 실행하게 되면, 모든 Batch Job이 다 실행되게 된다.
  • 보통은 모든 Job을 한 번에 실행하지 않는다.
    • 따라서 어떤 Job을 실행할 것인지 설정할 수 있다.
    • 실행하려는 특정 Job Name만 설정 값으로 넣어주면 된다.

ex) helloJob Job만 실행하기 위해서는 아래의 설정을 필요로한다.

 

설정한 뒤에 실행 결과

 

별다른 설정이 없는 경우 다른 Job이 실행되는 것을 방지하는 옵션

application.yml

# 모든 배치가 실행되지 않도록 설정 추가!
spring:
  batch:
    job:
      names: ${job.name:NONE}

위와 같이 설정하면 job.name 파라미터로 Job을 실행할 수 있게되고, 추가적으로 설정 값이 없으면 아무런 배치가 실행되지 않도록 막을 수도 있다.

(설정 파라미터 값 spring.batch.job.names에 Job Name을 설정할 필요 없이, job.name 프로퍼티에 Job Name을 추가하면 동일하게 작동한다!)

맘시터 서비스는…?

config 설정에서 jobNames가 없는 경우 jobNames가 NONE 으로 설정되도록 config를 설정함.

 

Spring Batch 기본 구조

실제로 예제를 실행해보면 Bean을 생성만했을 뿐인데, 자동으로 Job이 실행 된다.

Spring Batch는 Job time에 Bean이 생성되면 JobLauncher 객체에 의해서 Job을 수행한다.
JobLauncher --(실행) → Job --(실행) → Step 구조가 된다.

JobRepository는 DB or memory에 Spring Batch가 실행될 수 있도록 배치의 메타데이터를 관리하는 클래스
스프링 배치의 전반적인 데이터를 관리하는 클래스 정도로 이해하면된다.

Job

  • Job은 JobLauncher에 의해 실행
  • Job은 배치의 실행 단위를 의미
  • Job은 N개의 Step을 실행할 수 있으며, 흐름(Flow)을 관리할 수 있음.
    • ex) A Step 실행 후, 조건에 따라 B Step 또는 C Step을 실행하도록 설정할 수 있음.

Step

  • Job의 세부 실행 단위이며, Job은 최소 1개 이상의 Step으로 구성
  • Step의 실행 단위는 크게 2가지로 나뉨
    • Task 기반: 하나의 작업 기반으로 실행
    • Chunk 기반: 하나의 큰 덩어리를 n개씩 나눠서 실행 (chunk = 덩어리 라는 뜻을 가짐
      • ex) 처리 대상이 한 번에 실행해도 컴퓨터 자원에 문제가 없으면 Tasklet을 사용
      • ex) 10,000명의 회원을 1,000명 씩 나눠서 처리한다면 Chunk
  • ItemReader : 배치 처리 대상 객체를 읽어 ItemProcessor 또는 ItemWriter에게 전달
  • ItemProcessor: input 객체를 output 객체로 filtering 또는 processing해 ItemWriter에게 전달
    • ex) ItemReader에서 읽은 데이터를 수정 또는 ItemWriter 대상인지 filtering 한다.
    • ItemProcessor는 optional (있을 수도 있고 없을 수도 있음)
    • ItemProcessor가 하는 일은 ItemReader 또는 ItemWriter가 대신할 수 있다.
  • ItemWriter: 배치 처리 대상 객체를 최종 처리
    • ex) DB Update를 하거나, 처리 대상 사용자에게 알림을 보낸다.

스프링 배치 테이블 구조

Spring Batch Table 구조

 
  • 배치 실행을 위한 메타 데이터가 저장되는 테이블
  • BATCH_JOB_INSTANCE
    • Job이 실행되며 생성되는 최상위 계층의 테이블
    • job_namejob_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이 실행되며 공유해야할 데이터를 직렬화해 저장
  • External Library 하단에 org.springframework/batch/core 하위에 schema 스크립트 파일 존재
  • 스프링 배치를 실행하고 관리하기 위한 테이블
  • schema.sql 설정
    • schema-**.sql의 실행 구분
      • DB 종류별로 script가 구분됌.
    • spring.batch.initialize-schma config로 구분(properties 기준)
    • ALWAYS, EMBEDDED, NEVER로 구분
      • ALWAYS: 항상 실행
      • EMBEDDED: 내장 DB일 때만 실행 (default)
      • NEVER: 항상 실행 안함 (운영환경)

 
 

Job, JobInstance, JobExecution 이해

 
  • JobInstance: BATCH_JOB_INSTANCE 테이블과 매핑
  • JobExecution: BATCH_JOB_EXECUTION 테이블과 매핑
  • JobParameters: BATCH_JOB_EXECUTION_PARAMS 테이블과 매핑
  • ExecutionContext: BATCH_JOB_EXECUTION_CONTEXT 테이블과 매핑
  • JobInstance의 생성 기준은 JobParameters 중복 여부에 따라 생성된다.
  • 다른 parameter로 Job이 실행되면 JobInstance가 생성된다.
  • 같은 parameter로 Job이 실행되면, 이미 생성된 JobInstance가 실행된다.
  • JobExecution은 (재실행 여부와 상관없이) 항상 새롭게 생성된다.
  • ex)
    • 처음 Job 실행 시, data parameter가 2022-01-01로 실행 됐다면, 1번 JobInstance가 생성
    • 다음 Job 실행 시, data parameter가 2022-01-02로 실행 됐다면, 2번 JobInstance가 생성
    • 다음 Job 실행 시, data parameter가 2022-01-02로 실행 됐다면, 2번 JobInstance가 재 실행
      • 이때 Job이 재실행 대상이 아닌 경우 에러가 발생
  • Parameter가 없는 Job을 항상 새로운 JobInstance가 실행되도록 RunIncrementer가 제공
    • RunIdIncrementer는 항상 다른 run.id를 Parameter로 설정

Step, StepExecution 이해

  • StepExecution: BATCH_STEP_EXECUTION 테이블과 매핑
  • ExecutionContext: BATCH_STEP_EXECUTION_CONTEXT 테이블과 매칭
    • ExecutionContext 클래스는 Job과 Step에 Context를 모두 맵핑할 수 있는 클래스이다.
  • Job 내에서 공유할 수 있는 BATCH_JOB_EXECUTION_CONTEXT
  • 하나의 Step에서 공유할 수 있는 BATCH_STEP_EXECUTION_CONTEXT
  • 예제 참고
    • 참고로 mysql DB에서 batch 실습을 진행할 때는 schema.mysql.sql의 내용 그대로 DB에 insert 하면된다. 
728x90