spring batch 5 migration - batch schema에 맞게 database table 교체하기

su_y2on·2026년 2월 5일

Spring

목록 보기
31/31
post-thumbnail

batch schema에 맞게 database table 교체하기

spring boot 2.x -> 3.x로 업그레이드를 하다보면 spring batch를 사용하는 어플리케이션에서 batch 버전이 5대로 넘어가면서 아래와 같은 에러를 마주하게된다.

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'PARAMETER_NAME' in 'field list'

PARAMETER_NAME이라는 필드가 없다는 것인데 이유는 간단하다 batch 5대부터 BATCH_JOB_EXECUTION_PARAMS table의 스키마에 변경이 생겼기때문이다 따라서 기존에 없던 PARAMETER_NAME field가 추가되었는데 현재 table에서는 없기 때문에 터지는 에러이다

어떻게 해결할까?

문제는 이 테이블 뿐만아니라 짜잘한 수정들이 몇가지 더 있다는 것이다. 방법은 크게 두가지이다. 첫번째는 아예 밀어버리고 새로운 테이블로 대체하는 것이다. 근데 이방법은 사실 거의 사용할 수 있는 경우가 없을 것 같다.. 일단 되게 간단한 환경이어야하고 (테스트용 혹은 개인용 어플리케이션개발정도) 기존에 쌓은 데이터를 보관할 필요가 없을때 가능하다


내 상황의 경우 local, beta가 바라보고있는 beta DB가 있었고 staging, real환경이 바라보고있는 real DB가 있는 상황이었다. 이렇게 여러 phase에서 DB를 공유하고있다면 이 DB에 수정이 여러 phase에 영향을 주기 때문에 첫번째 방법은 바로 불가능하다

그럼 두번째 방법은 새로운 batch 테이블을 생성해서 마이그레이션하는 것이다. 나는 다행히 기존데이터를 재사용하는 경우는 없어서 기존 데이터 마이그레이션까지는 필요하지 않았다.

그럼 기존 테이블과 단지 구분해줄 prefix정도만을 붙인 batch5용 테이블을 생성해주고 자연스레 옮겨가기만 하면 된다!




테이블 생성

테이블은 spring-batch-core에서 제공해주는 schema file을 그대로 사용해서 쿼리를 돌리는 것이 가장 정확하고 좋다.

나는 인텔리제이를 쓰는데 아래 외부라이브러리 목록에서 내가 지금 끌어다 쓰고있는 batch-core에서 조회해서 그대로 사용했다

DB종류에 맞게 선택하면되고 나는 mysql을 썼기때문에 schema-mysql.sql을 봤다

대충 이런식이다 근데 주의할 것은 이미 테이블이 있기때문에 그대로 쓰면안되고 prefix를 붙여주는 식으로 기존 것과 구분해줘야한다 나는 BATCH5_ prefix를 사용했다. sql은 chatgpt에 부탁하면 prefix붙은 것으로 잘 짜준다 ㅎㅎ

CREATE TABLE BATCH_JOB_INSTANCE  (
	JOB_INSTANCE_ID BIGINT  NOT NULL 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)
) ENGINE=InnoDB;

CREATE TABLE BATCH_JOB_EXECUTION  (
	JOB_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
	VERSION BIGINT  ,
	JOB_INSTANCE_ID BIGINT NOT NULL,
	CREATE_TIME DATETIME(6) NOT NULL,
	START_TIME DATETIME(6) DEFAULT NULL ,
	END_TIME DATETIME(6) DEFAULT NULL ,
	STATUS VARCHAR(10) ,
	EXIT_CODE VARCHAR(2500) ,
	EXIT_MESSAGE VARCHAR(2500) ,
	LAST_UPDATED DATETIME(6),
	constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID)
	references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ENGINE=InnoDB;
...

이렇게 하고 마지막으로 어플리케이션에서 앞으로 batch table을 조회할때 prefix를 붙이도록 적절히 설정을 추가해주면 된다

spring:
  batch:
    jdbc:
      table-prefix: BATCH5_
      initialize-schema: never



왜 바뀐거지..?

이러면 문제는 해결되는데 추가로 이런 수정이 발생한 이유는 아래와 같다😁 이 외에도 개선의 이유로 자잘한 수정이 함께 된 것으로 보인다

Spring Batch 4 이하 (구버전 구조)
BATCH_JOB_EXECUTION_PARAMS
────────────────────────────────
JOB_EXECUTION_ID   (FK)
KEY_NAME           ← 파라미터 이름
TYPE_CD            ← 타입 코드 (STRING, LONG, DATE ...)
STRING_VAL         ← 문자열 값
DATE_VAL           ← 날짜 값
LONG_VAL           ← 정수 값
DOUBLE_VAL         ← 실수 값
IDENTIFYING

문제점

한 파라미터당 “값 컬럼이 여러 개”

실제 값은 한 컬럼에만 들어 있음

조회할 때 항상 타입 분기 필요

DB 타입에 강하게 묶임

Spring Batch 5 (Boot 3) 구조
BATCH_JOB_EXECUTION_PARAMS
────────────────────────────────
JOB_EXECUTION_ID   (FK)
PARAMETER_NAME     ← 파라미터 이름
PARAMETER_TYPE     ← Java 타입 (ex. java.lang.String)
PARAMETER_VALUE    ← 값 (문자열)
IDENTIFYING

개선 포인트

값 컬럼 1개로 통합

타입은 문자열로 명시

JobParameter가 DB에 직렬화되어 저장됨

Spring Batch 내부 SQL이 훨씬 단순해짐



0개의 댓글