Spring

[Spring Batch] Table "BATCH_JOB_INSTANCE" not found

천방지축 개발노트 2024. 11. 20. 00:05

Batch 프로젝트의 초기 Config를 구성하는 과정에서 로컬과 개발 서버에서는 정상적으로 동작하는데,

이상하게 운영 서버에서 실행하면 에러가 발생했다.

해결하는 과정에서 여러 에러를 마주쳤는데, 최대한 상기하며 정리해보겠습니다.


 

BadSqlGrammarException
[SELECT JOB_INSTANCE_ID, JOB_NAME from BATCH_JOB_INSTANCE where JOB_NAME = ? and JOB_KEY = ?]

운영에 배포하기 전에 개발서버에서 정상 동작하는 것을 확인했었다. 그리고 에러 로그도 SQL Exception 관련 문제라고 말하지만 문제가 되는 테이블은 Spring Batch에서 관리하는 메타 테이블이기 때문에 mapper 쪽을 잘못 작성해서 발생한 문제는 아니다. 어쨌든 해당 에러에 대해 구글링을 해봐도 'BATCH_JOB_INSTANCE' 테이블이 존재하지 않아서 발생하는 문제라는 것을 알 수 있고, 대부분 아래 설정으로 해결하라고 알려주고 있다.

spring.batch.jdbc.initialize-schema = always

실제로 설정 파일(yaml)에 위 속성을 추가해서 로컬과 개발서버에서의 에러를 해결할 수 있기는 했다. 하지만 말도 안 되게도 저의 경우엔 이게 운영서버에선 적용되지 않는 듯 같은 에러가 계속됐다(왜 내게만 이런 시련을..) application-prod.yaml 파일에 DB 설정이나 오타가 있던 것은 당연히 아니었고 계정에 대한 DB권한 문제도 아니였다. 공식 문서에서도 해당 설정에 대한 내용이 있다.

내용을 보면, "스프링 배치를 사용하면 대부분의 데이터베이스에 대한 SQL 초기화 Script를 함께 제공하는데, 스프링부트가 데이터베이스 유형을 감지해서 시작 시 해당 스크립트를 실행한다" 라고 설명돼있다. 이게 무슨 말이냐면, 스프링 배치를 사용하기 위한 관련 Dependency를 추가하면 org.springframework.batch:spring-batch-core 라이브러리가 받아지는데, 이 라이브러리 패키지 내에 스프링 배치가 관리하는 메타 테이블에 대한 초기화용 DDL이 내장돼있다는 말이다.

메타 테이블의 초기화를 위한 DB별 SQL파일

그리고 기본적으로 제공되는 메타 테이블의 초기화 방법에 대해서 커스터마이징할 수 있고, 속성 값으로 '애플리케이션 시작 시 스키마를 항상 초기화' 하도록 'always'로 지정하라는 것이다(참고로 한 번만 실행하거나 이미 있다면 생성하지 않는 속성 값은 없다). 어쨌든 제 경우에는 같은 소스가 개발 환경에만 적용되는 슬픈 현상이 있었지만, 애초에 운영의 배치 실행 이력까지 매번 초기화시키면 데이터 손실이 발생하니 권장되지 않는다. 그래서 한 번만 실행하고 'never'로 수정하여 재배포하거나 애플리케이션 기동 이전에 org/springframework/batch/core 라이브러리 내의 SQL을 직접 실행시키는 방법이 있겠다. 간단한 방법이 있지만 springboot의 스타일로 적용시켜보고 싶어 다른 방법을 찾아봤다.

 

 

Spring Boot Reference Documentation

This section goes into more detail about how you should use Spring Boot. It covers topics such as build systems, auto-configuration, and how to run your applications. We also cover some Spring Boot best practices. Although there is nothing particularly spe

docs.spring.io

위 내용을 보면 spring.sql.init.mode 설정으로 스프링 부트가 schema-${platform}.sql 및 data-${platform}.sql 형식의 데이터베이스 벤더별 스크립트를 처리할 수 있다고 한다. 그니까 애플리케이션 기동 시에 내가 정의해놓은 SQL 스크립트를 자동으로 실행시켜준다는 건데, 이걸 활용하면 꽤 유용한 것을 할 수 있겠다는 생각도 든다. 어쨌든 해당 설정으로 Batch 테이블을 초기화하는데 이용해 봤고 DB에 테이블이 정상적으로 생성된 것을 확인했다.

spring:
  sql:
    init:
      mode: always
      schema-locations: classpath:org/springframework/batch/core/schema-oracle.sql

 

 

비교 정리
설정 대상 초기화 범위 사용 형태
spring.batch.jdbc.initialize-schema Spring Batch 전용 테이블 관리 Spring Batch 메타 테이블(BATCH_*) 배치 작업을 위한 테이블 자동 생성 및 관리
spring.sql.init.mode 일반 SQL 스크립트 실행 데이터베이스 전체 테이블 생성, 기본 데이터 삽입 등 일반 작업

 

 

 

 


하지만 이후 또 다른 에러가 발생하는데..😫

다음 글에서 정리해보겠습니다.