[Spring Batch 1편] EZ하게 SpringBatch 시작하기

송하연·2024년 10월 8일
1
post-thumbnail

1. SpringBatch 주요 개념

1.1 SpringBatch란?

Spring Batch는 대용량 데이터를 처리하기 위한 배치 처리 프레임워크이다.배치 처리란, 사용자와의 실시간 상호작용 없이 대량의 데이터를 정기적으로 일괄 처리하는 작업을 의미한다.

1.2 SpringBatch 주요 키워드

Job (잡)
배치 작업의 전체 흐름을 관리하는 단위로, 하나 이상의 Step으로 구성

Step (스텝)
Job을 구성하는 작은 단위 작업.
데이터 읽기, 처리, 쓰기 등의 작업을 포함하며, 성공/실패에 따라 분기 처리

ItemReader
데이터를 읽어오는 역할.
데이터베이스, 파일, 큐 등 다양한 소스로부터 데이터를 가져옴

ItemProcessor
읽어온 데이터를 가공하거나 변환.

ItemWriter
처리된 데이터를 저장.
데이터베이스에 기록하거나 파일로 내보냄

JobRepository
Job과 Step의 실행 상태, 이력 등을 관리하는 메타데이터 저장소

JobLauncher
배치 작업을 실행하는 컴포넌트. Job을 시작하는 역할

2. SpringBatch 시작하기 실습

Spring Batch가 동작하기 위해서는 메타 데이터 스키마가 필요하다!
오늘은 스프링부트 프로젝트 내에서 이를 설정하고 H2 데이터베이스를 사용해 메타 데이터 스키마를 생성해보도록 하자

2.1 스프링 프로젝트 만들기

먼저, 새로운 Spring 프로젝트를 생성한다.

2.2 SpringBatch 의존성 추가

Spring Batch 의존성을 프로젝트에 추가한다.

 //spring batch
 implementation 'org.springframework.boot:spring-boot-starter-batch'

2.3 @EnableBatchProcessing 어노테이션 추가

❗스프링부트 버전 3이상에서는 @EnableBatchProcessing을 사용하지 않는다고 하네요❗

2.4 DataSource 구성하기

H2는 Java로 작성된 RDBMS으로 인메모리 모드와 서버 모드로 실행할 수 있으며, 간편하고 빠르게 사용할 수 있다는 특징을 가지고 있다.
H2를 사용해서 DataSource를 구성해보자

💡 H2 다운로드 및 실행법(Mac 기준)

H2 다운로드 및 사용법
[DB] H2 Database 다운로드 및 사용법을 알아보자

1. H2 다운로드 (https://h2database.com/html/main.html)

2. H2 콘솔 접속
터미널에서 아래의 명령어를 입력해 콘솔창이 뜨면 http://localhost:8082 로 접속한다.

cd h2/bin            //h2의 bin 디렉토리로 이동
chmod 755 h2.sh      //권한 부여
./h2.sh              //h2 실행

❗참고 : H2 관련 이슈 해결법❗
[DB] H2를 설치하다 만난 이슈 모음 ZIP 📁 (+ 해결 방법)

2.5 스프링부트 프로젝트에 적용하기

application.yml파일에 datasource 관련 속성과 batch 관련 속성을 추가해주었다.

spring:
  batch:
    jdbc:
      initialize-schema: always
    job:
      enabled: true

  datasource:
    hikari:
      maximum-pool-size: 10
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa

이제 스프링 어플리케이션을 실행해보자.
근데 실행은 잘되는데 메타데이터 스키마가 자동으로 생성 되지 않는다?

❗스프링 배치를 사용할 때 자동으로 테이블을 생성해 주지 않는 문제❗
spring Boot 3.0에서 @EnableBatchProcessing 어노테이션과 관련한 이슈가 자주 보고되는편..
정확한 원인을 찾지는 못했지만 문제를 해결하기 위해 수동으로 스키마를 생성해보도록 하자.

1) External Libraries 디렉토리에서 spring batch 관련한 라이브러리 디렉토리를 찾는다. (spring-batch-core)
2) 폴더 내부에는 spring batch 메타데이터 스키마 생성 관련한 sql 스크립트 파일이 있다. 내가 사용하는 DB에 맞는 스크립트를 복사해준다.

-- Autogenerated: do not edit this file

CREATE TABLE BATCH_JOB_INSTANCE  (
	JOB_INSTANCE_ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY ,
	VERSION BIGINT ,
	JOB_NAME VARCHAR(100) NOT NULL,
	JOB_KEY VARCHAR(32) NOT NULL,
	constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY)
) ;

CREATE TABLE BATCH_JOB_EXECUTION  (
	JOB_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY 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(2500) ,
	EXIT_MESSAGE VARCHAR(2500) ,
	LAST_UPDATED TIMESTAMP,
	JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
	constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
	references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;

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 TIMESTAMP 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)
) ;

CREATE TABLE BATCH_STEP_EXECUTION  (
	STEP_EXECUTION_ID BIGINT GENERATED BY DEFAULT AS IDENTITY 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(2500) ,
	EXIT_MESSAGE VARCHAR(2500) ,
	LAST_UPDATED TIMESTAMP,
	constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID)
	references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;

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

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

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_SEQ;

3) 복사 후 쿼리 H2내에서 실행을 해보면 6개의 테이블과 3개의 시퀀스가 생성되는 것을 확인할 수 있다.

- 생성되는 테이블

BATCH_JOB_INSTANCE
배치 작업의 인스턴스 정보(이름, 키 등)를 저장.

BATCH_JOB_EXECUTION
배치 작업 실행 정보(실행 시간, 상태, 종료 메시지 등)를 저장.

BATCH_JOB_EXECUTION_PARAMS
배치 작업 실행 시 사용된 매개변수를 기록.

BATCH_STEP_EXECUTION
배치 단계(step)의 실행 정보를 기록(실행 시간, 처리된 레코드 수, 상태 등).

BATCH_STEP_EXECUTION_CONTEXT
각 스텝 실행에 대한 컨텍스트 데이터를 저장.

BATCH_JOB_EXECUTION_CONTEXT
작업 실행에 대한 컨텍스트 데이터를 저장.

- 생성되는 시퀀스

BATCH_STEP_EXECUTION_SEQ
단계 실행 테이블에서 사용할 고유 ID 생성.

BATCH_JOB_EXECUTION_SEQ
작업 실행 테이블에서 사용할 고유 ID 생성.

BATCH_JOB_SEQ
작업 인스턴스 테이블에서 사용할 고유 ID 생성.

3. 마무리

지금까지 스프링 배치를 위한 기초 설정과 스프링 배치가 실행될 때 자동 생성되는 테이블 구조와 주요 기능에 대해 알아보았다.

참고글 - [SpringBatch 연재 01] SpringBatch 빠르게 시작하기
GitHub - https://github.com/hysong4u/springbatch

profile
개발 기록 끄적끄적✏️ #백엔드개발자

0개의 댓글