Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • Spring Batch | 스프링 배치란 무엇인가?
    ▼ Backend/└ 스프링 배치 (Spring Batch) 2022. 2. 3. 16:08
    반응형

    📌 스프링 배치(Spring Batch)란

    엔터프라이즈 시스템의 일상적인 운영에 필수적인 강력한 배치 애플리케이션을 개발할 수 있도록 설계된 가볍고 포괄적인 배치 프레임워크로 로깅/추적, 트랜잭션 관리, 작업 처리 통계, 작업 재시작, 건너뛰기, 리소스 관리 등 대용량 레코드 처리에 필수적인 재사용 가능한 기능을 제공한다. 또한 최적화 및 파티셔닝 기술을 통해 대용량 및 고성능 일괄 작업을 가능하게 하는 고급 기술 서비스 및 기능을 제공한다.

    📌 메타 테이블 스키마 (Meta-Table Schema)

    작업을 수행하면서 상태에 관한 정보들을 메타 테이블에 저장해서 작업에 대한 기록을 구조화된 데이터로 저장하여 관리한다. 3개의 Sequence Table과 6개의 Meta Table이 존재하고, Job이 실행될 때마다 다양한 정보들이 테이블에 저장된다.

    Sequence Table

    • BATCH_JOB_SEQ
    • BATCH_JOB_EXECUTION_SEQ
    • BATCH_STEP_EXECUTION_SEQ

    Meta Table

    • BATCH_JOB_INSTANCE
    • BATCH_JOB_EXECUTION
    • BATCH_JOB_EXECUTION_PARAMS
    • BATCH_JOB_EXECUTION_CONTEXT
    • BATCH_STEP_EXECUTION
    • BATCH_STEP_EXECUTION_CONTEXT

    Meta Table Schema

     

    📌 테이블에 대한 설명

    📝 BATCH_JOB_INSTANCE

    Job이 실행될 때에 생성되는 JobInstance에 관한 정보를 저장하고, 전체 계층 구조의 최상위 역할을 한다. 해당 테이블의 Row는 JobParameter(Spring Batch가 실행될 때 외부에서 받을 수 있는 파라미터) 값에 따라 생성된다.

     

    CREATE TABLE BATCH_JOB_INSTANCE (
      JOB_INSTANCE_ID BIGINT PRIMARY KEY,
      VERSION BIGINT,
      JOB_NAME VARCHAR(100) NOT NULL,
      JOB_KEY VARCHAR(2500)
    );

     

    컬럼 설명
    JOB_INSTANCE_ID Primary Key
    VERSION 해당 Row가 update 될때마다 1씩 증가
    JOB_NAME jobBuilderFactory.get에 설정한 Batch Job Name
    JOB_KEY 동일한 작업의 개별 인스턴스를 서로 고유하게 식별 하는 직렬화 값

     

    📝 BATCH_JOB_EXECUTION

    JobExcution에 관련된 모든 정보를 저장하고, JobInstance가 실행될 때마다 성공/실패했던 시작시간, 종료시간, 종료 코드 등 다양한 정보를 가지고 있으며 JOB_EXECUTIONJOB_INSTANCE부모-자식 관계이다.

     

    CREATE TABLE BATCH_JOB_EXECUTION (
      JOB_EXECUTION_ID BIGINT PRIMARY KEY,
      VERSION BIGINT,
      JOB_INSTANCE_ID BIGINT NOT NULL,
      CREATE_TIME TIMESTAMP NOT NULL,
      START_TIME TIMESTAMP DEFAULT NULL,
      END_TIME TIMESTAMP DEFAULT NULL,
      STATUS VARCHAR(10),
      EXIT_CODE VARCHAR(20),
      EXIT_MESSAGE VARCHAR(2500),
      LAST_UPDATED TIMESTAMP,
      JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
      constraint JOB_INSTANCE_EXECUTION_FK foreign key (JOB_INSTANCE_ID)
      references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
    );

     

    컬럼 설명
    JOB_EXECUTION_ID
    Primary Key
    VERSION 해당 Row가 업데이트가 될때마다 1씩 증가
    JOB_INSTANCE_ID BATCH_JOB_INSTANCE 테이블의 Foreign Key
    CREATE_TIME 실행이 생성된 시간을 나타내는 타임스탬프
    START_TIME 실행이 시작된 시간을 나타내는 타임스탬프
    END_TIME 성공 또는 실패에 관계없이 실행이 완료된 시간을 나타내는 타임스탬프
    이 열의 빈 값은 어떤 유형의 오류가 있었고 프레임워크가 실패하기 전에 마지막 저장을 수행할 수 없었음을 나타낸다.
    STATUS 실행 상태를 나타내는 문자열, COMPLETED, STARTED 및 기타 가 될 수 있다 . 이 열의 개체 표현은 BatchStatus 열거형
    EXIT_CODE 실행 종료 코드를 나타내는 문자열, 명령줄 작업의 경우 숫자로 변환될 수 있다.
    EXIT_MESSAGE 작업이 종료된 방법에 대한 보다 자세한 설명을 나타내는 문자열, 실패의 경우 여기에는 가능한 한 많은 스택 추적이 포함될 수 있다.
    LAST_UPDATED 실행이 지속된 마지막 시간을 나타내는 타임스탬프

     

    📝 BATCH_JOB_EXECUTION_PARAMS

    Job을 실행할 때 사용했던 JobParameters에 대한 정보를 저장한다. 이 테이블에는 기본 키가 없다. 이는 프레임워크가 하나를 사용하지 않으므로 필요하지 않기 때문이다. 필요의 경우 데이터베이스 생성 키로 기본 키를 추가할 수 있다.

     

    BATCH_JOB_INSTANCE 테이블에서 설명했던 것처럼 동일한 JobParameter값으로 실행하면 BATCH_JOB_INSTANCE 테이블에 Row가 생성되지 않는다.

     

    String, Date, Long, Double 형의 데이터만 저장할 수 있다.

     

    CREATE TABLE BATCH_JOB_EXECUTION_PARAMS(
      JOB_EXECUTION_ID BIGINT NOT NULL,
      TYPE_CD VARCHAR(6) NOT NULL,
      KEY_NAME VARCHAR(100) NOT NULL,
      STRING_VAL VARCHAR(250),
      DATE_VAL DATETIME DEFAULT NULL,
      LONG_VAL BIGINT,
      DOUBLE_VAL DOUBLE PRECISION,
      IDENTIFYING CHAR(1) NOT NULL,
      constraint JOB_EXEC_PARAMS_FK foreign key(JOB_EXECUTION_ID) references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
    );

     

    컬럼 설명
    JOB_EXECUTION_ID
    BATCH_JOB_EXECUTION 테이블에 대한 Foreign Key
    TYPE_CD 저장된 값의 데이터 유형, NULL일 수 없다.
    KEY_NAME
    저장된 값의 이름
    STRING_VAL 유형이 String인 값
    DATE_VAL 유형이 Date인 값
    LONG_VAL 유형이 Long인 값
    DOUBLE_VAL 유형이 Double인 값
    IDENTIFYING 매개변수가 관련 ID에 기여했는지 여부를 나타내는 플래그 JobInstance 

     

    📝 BATCH_JOB_EXECUTION_CONTEXT

    JobExecution의 ExecutionContext 정보가 들어있다. 데이터는 일반적으로 JobInstance가 실패 시 중단된 위치에서 다시 시작할 수 있는 정보를 저장하고 있다.

     

    CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT (
      JOB_EXECUTION_ID BIGINT PRIMARY KEY,
      SHORT_CONTEXT VARCHAR(2500) NOT NULL,
      SERIALIZED_CONTEXT CLOB,
      constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
      references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
    );

     

    컬럼 설명
    JOB_EXECUTION_ID
    BATCH_JOB_EXECUTION 테이블에 대한 Foreign Key
    SHORT_CONTEXT SERIALIZED_CONTEXT
    SERIALIZED_CONTEXT 직렬화된 ExecutionContext

     

    📝 BATCH_STEP_EXECUTION

    StepExecution 개체와 관련된 모든 정보가 저장된다. JobExecution에 대한 Step객체 정보를 기록하고 있습니다.  읽은 수, 커밋 수, 스킵 수 등 다양한 정보를  담고 있다.

     

    CREATE TABLE BATCH_STEP_EXECUTION (
      STEP_EXECUTION_ID BIGINT  PRIMARY KEY,
      VERSION BIGINT NOT NULL,
      STEP_NAME VARCHAR(100) NOT NULL,
      JOB_EXECUTION_ID BIGINT NOT NULL,
      START_TIME TIMESTAMP NOT NULL ,
      END_TIME TIMESTAMP DEFAULT NULL,
      STATUS VARCHAR(10),
      COMMIT_COUNT BIGINT,
      READ_COUNT BIGINT,
      FILTER_COUNT BIGINT,
      WRITE_COUNT BIGINT,
      READ_SKIP_COUNT BIGINT,
      WRITE_SKIP_COUNT BIGINT,
      PROCESS_SKIP_COUNT BIGINT,
      ROLLBACK_COUNT BIGINT,
      EXIT_CODE VARCHAR(20),
      EXIT_MESSAGE VARCHAR(2500),
      LAST_UPDATED TIMESTAMP,
      constraint JOB_EXECUTION_STEP_FK foreign key (JOB_EXECUTION_ID)
      references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
    );

     

    컬럼 설명
    STEP_EXECUTION_ID Primary Key
    VERSION  해당 Row가 업데이트가 될때마다 1씩 증가
    STEP_NAME  stepBuilderFactory.get에 설정한 Step Name
    JOB_EXECUTION_ID  BATCH_JOB_EXECUTION 테이블의 Foreign Key
    START_TIME  실행이 시작된 시간을 나타내는 타임스탬프
    END_TIME  성공, 실패에 상관없이 실행이 완료된 시간을 나타내는 타임스탬프
    작업이 현재 실행되고 있지 않더라도 이 열의 빈 값은 어떤 유형의 오류가 있었고 프레임워크가 실패하기 전에 마지막 저장을 수행할 수 없었음을 나타낸다.
    STATUS  실행 상태를 나타내는 문자열, COMPLETED, STARTED 및 기타 가 될 수 있다 . 이 열의 개체 표현은 BatchStatus 열거형이다.
    COMMIT_COUNT  실행 중에 단계가 트랜잭션을 커밋한 횟수
    READ_COUNT  실행 중에 읽은 항목 수
    FILTER_COUNT  실행에서 필터링된 항목 수
    WRITE_COUNT  실행 중에 작성되고 커밋된 항목 수
    READ_SKIP_COUNT  실행 중 읽기에서 건너뛴 항목 수
    WRITE_SKIP_COUNT  실행 중 쓰기에서 건너뛴 항목 수
    PROCESS_SKIP_COUNT  실행 중 처리 중에 건너뛴 항목 수
    ROLLBACK_COUNT  실행 중 롤백 수, 재시도를 위한 롤백과 복구 건너뛰기 절차의 롤백을 포함하여 롤백이 발생할 때마다 포함된다.
    EXIT_CODE  실행 종료 코드를 나타내는 문자열, 명령줄 작업의 경우 숫자로 변환될 수 있다.
    EXIT_MESSAGE  작업이 종료된 방법에 대한 보다 자세한 설명을 나타내는 문자열, 실패의 경우 여기에는 가능한 한 많은 스택 추적이 포함될 수 있다.
    LAST_UPDATED  실행이 지속된 마지막 시간을 나타내는 타임스탬프

     

    📝 BATCH_STEP_EXECUTION_CONTEXT

    StepExecution의 ExecutionContext 정보가 들어있다. 데이터는 일반적으로 JobInstance가 실패 시 중단된 위치에서 다시 시작할 수 있는 정보를 저장하고 있다.

     

    CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT (
      STEP_EXECUTION_ID BIGINT PRIMARY KEY,
      SHORT_CONTEXT VARCHAR(2500) NOT NULL,
      SERIALIZED_CONTEXT CLOB,
      constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
      references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
    );

     

    컬럼 설명
    STEP_EXECUTION_ID  BATCH_STEP_EXECUTION 테이블에 대한 Foreign Key
    주어진 실행과 관련된 행이 두 개 이상있을 수 있다.
    SHORT_CONTEXT SERIALIZED_CONTEXT
    SERIALIZED_CONTEXT 직렬화된 ExecutionContext

     

    📌 용어 설명

    Job

    전체 배치 프로세스를 캡슐화하는 엔터티, 실행시킬 작업

    JobInstance

    논리적인 Job의 실행의 단위, Job을 실행시키게 되면 하나의 JobInstance가 생성된다.

    JobParameters

    Job을 실행하는데 사용하는 파라미터의 집합으로 Job이 실행되는 동안에 Job의 식별 외에도 매개변수 역할도 한다.

    JobExecution

    JobInstance에 대한 실행 시도에 대한 객체이다. 실행에 대한 JobExecution은 개별로 생성된다. JobInstance 실행에 대한 상태, 시작시간, 종료시간, 생성시간 등의 정보를 가진다.

    ExecutionContext

    Job에서 데이터를 공유할 수 있는 데이터 저장소이다. ExecutionContext는 JobExecutionContext, StepExecutionContext 2가지 종류가 있으나 이 두 가지는 지정되는 범위가 다르다. JobExecutionContext의 경우 Commit 시점에 저장되는 반면 StepExecutionContext는 실행 사이에 저장된다. ExecutionContext를 통해 Step 간 Data 공유가 가능하며 Job 실패 시 ExecutionContext를 통한 마지막 실행 값을 재구성할 수 있다.

    JobRepository

    모든 배치 처리 정보를 담고 있는 메커니즘, Job이 실행되게 되면 JobRepository에 JobExecution과 StepExecution을 생성하게 되며 JobRepository에서 Execution 정보들을 저장하고 조회하며 사용하게 된다.

    JobLauncher

    JobLauncher는 Job과 JobParameters를 사용하여 Job을 실행하는 객체

    Step

    Step은 Job의 배치 처리를 정의하고 순차적인 단계를 캡슐화한다. Job은 최소한 1개 이상의 Step을 가져야 하며 Job의 실제 일괄 처리를 제어하는 모든 정보가 들어있다. Tasklet 처리 방식과 Chunk 지향 처리 방식을 지원한다.

    Tasklet: 단순한 데이터 프로세스 처리에 적합한 모델로, SQL 1회 명령 등 단순하거나, 작업 프로세스의 표준화가 어려운 복잡한 경우에 Custom 작업 생성을 위해 사용한다.

     

    Chunk: 메모리에 가지고 있기 너무 많고 큰 데이터 들을 효율적으로 처리하는데 적합하고, 일정량의 데이터를 일괄적으로 read / process / write 프로세스 흐름에 따라 표준화(또는 이 중 일부만 구현)하여 작업을 구현하는데 사용한다.

     

    Chunk란 각 커밋 사이에 처리되는 row 수이다.
    즉, Chunk 지향 처리란 한 번에 하나씩 데이터를 읽어 Chunk라는 덩어리를 만든 뒤, Chunk 단위로 트랜잭션을 다루는 것을 의미한다.

     

    1. Reader에서 데이터를 읽어온다.
    2. 읽어온 데이터를 Processor에서 가공한다.
    3. 가공된 데이터들을 별도의 공간에 모은 뒤, Chunk 단위만큼 쌓이게 되면 Writer에 전달하고 Writer는 일괄 저장한다.

    StepExecution

    StepExecution은 JobExecution과 동일하게 Step 실행 시도에 대한 객체를 나타냅니다. 하지만 Job이 여러 개의 Step으로 구성되어 있을 경우 이전 단계의 Step이 실패하게 되면 다음 단계가 실행되지 않음으로 실패 이후 StepExecution은 생성되지 않는다. StepExecution 또한 JobExecution과 동일하게 실제 시작이 될 때만 생성된다.

    ItemReader

    ItemReader는 Step에서 Item을 읽어오는 인터페이스

    ItemWriter

    ItemWriter는 처리된 Data를 Writer 할 때 사용한다. Writer는 처리 결과물에 따라 Insert가 될 수도 Update가 될 수도 Queue를 사용한다면 Send가 될 수도 있다. Writer 또한 Read와 동일하게 다양한 인터페이스가 존재한다. Writer는 기본적으로 Item을 Chunk로 묶어 처리하고 있다.

    ItemProcessor

    Item Processor는 Reader에서 읽어온 Item을 데이터를 처리하는 역할, Processor는 배치를 처리하는데 필수 요소는 아니며 Reader, Writer, Processor 처리를 분리하여 각각의 역할을 명확하게 구분하고 있다.

     

    Reference

     

    반응형

    댓글

Designed by Tistory.