SpringBoot3에서 배치를 사용할 때 왜 테이블을 자동으로 만들어 주지 않을지 알아보고 이것을 해결해 보자
1. 배치를 사용할 때 자동으로 테이블을 생성해 주지 않는 문제
1-1. 테이블이 생성되지 않는 원인 파악하기
- Spring Boot 3에서 Spring Batch를 사용할 때 'application.yml'에 batch.jdbc.initialize-schema: ALWAYS와 job.enabled: true를 설정했는데도 불구하고 자동으로 DB 테이블이 생성되지 않는 문제가 있다. 이 문제의 원인은 Spring Boot 3에서 일부 자동 구성 변경 사항 때문이다.
batch:
jdbc:
initialize-schema: ALWAYS
job:
enabled: true
원인1: 자동 구성 방법의 변경
- Spring Boot 3.0에서는 '@EnableBatchProcessing' 사용이 권장되지 않는다. 이전에는 이 어노테이션이 Spring Batch의 자동 구성을 활성화하는 데 사용되었지만, 이제는 더 이상 필요하지 않으며, 어플리케이션에서 제거해야 한다. 만약 '@EnableBatchProcessing'을 추가하면 Spring Batch의 자동 구성(메타데이터 테이블 생성, 작업 시작 시 자동 실행 등)이 비활성화된다. 이로 인해 설정한 'spring.batch.*' 속성들이 효력을 잃게 되는 것이다.
원인2: 기본 동작 변경
- 기본적으로 Spring Boot는 내장 데이터베이스를 사용할 때만 메타데이터 테이블을 생성하도록 설정되어 있다. 'spring.batch.initialize-schema=always' 속성을 사용해도, 내장 데이터베이스가 아닌 경우 테이블이 자동으로 생성되지 않을 수 있다.
원인3: 버그 보고
- GitHub와 Stack Overflow를 확인해 보면 여러 사용자들이 이와 비슷한 문제를 보고했다. Spring Boot 3.0.0으로 전환 후에 'batch.jdbc.initialize-schema: always' 설정에도 불구하고 메타 테이블이 생성되지 않는 문제가 있었던 것이다.
2. 해결 방안
의외로 해결방법은 간단했는데 이 방법이 맞다고 볼 수는 없다. 다만 이렇게 했을 때 해결이 되었기에 소개하도록 하겠다.
2-1. schema-postgresql.sql 검색하기
- 인텔리제이의 검색을 활용해서 프로젝트에서 schema-postgresql을 검색해 봤다. (spring-batch 의존성이 추가되어있어야 한다.)
2-2. 배치를 동작시키기 위해 필요한 테이블이 sql문으로 모두 적혀있다.
postgreSQL의 배치 테이블은 아래의 코드다. 복사해서 그대로 실행하면 된다.
-- Autogenerated: do not edit this file
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)
) ;
CREATE TABLE BATCH_JOB_EXECUTION (
JOB_EXECUTION_ID BIGINT NOT NULL 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,
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 ,
PARAMETER_NAME VARCHAR(100) NOT NULL ,
PARAMETER_TYPE VARCHAR(100) NOT NULL ,
PARAMETER_VALUE VARCHAR(2500) ,
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 NOT NULL PRIMARY KEY ,
VERSION BIGINT NOT NULL,
STEP_NAME VARCHAR(100) NOT NULL,
JOB_EXECUTION_ID BIGINT NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT 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 TEXT ,
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 TEXT ,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
CREATE SEQUENCE BATCH_JOB_SEQ MAXVALUE 9223372036854775807 NO CYCLE;
2-3. 이 sql문을 사용해서 배치 테이블을 만들어 준다.
- 위에서 모든 sql문을 복사해서 내 데이터베이스 콘솔에서 실행한다.
- 아래와 같이 테이블이 생성되는 것을 확인할 수 있다.
2-4. 배치 실행 확인하기
- 배치 테이블을 추가하고 스프링부트를 실행하니 문제없이 실행되었고 배치도 잘 동작했다.
3. 출처 (커뮤니티에 올라온 글)
Spring batch job not creating tables
I have a configuration class annotated with The metadata tables are getting created but without table prefix. Initialize-schema is ALWAYS and table-prefix is CUSTOM_ @Configuration @Slf4j @
stackoverflow.com
Not working batch.jdbc.initialize-schema: always with spring boot 3.0.0 · Issue #4273 · spring-projects/spring-batch
Bug description When I set the parameter "batch:jdbc:initialize-schema:" to always, I expect the creation of meta tables with a description of the work of spring batch, but when switching to spring...
github.com
Spring batch 5.x, not able to create the metadata tables in database (sqlserver)
Using spring batch5 and boot 3.x and java17, I'm trying to start a batch job and its failing while querying the table which is not created while bootstrapping of the application. 2023-11-01 09:20:...
stackoverflow.com
이 글을 다 읽었다면 아래의 글을 통해 MSA에 대한 지식을 늘려보는 것을 추천합니다!
Spring Boot MSA 환경에서 트랜잭션을 관리하며 스프링 이벤트/SNS/SQS를 사용하여 DB 정합성 보장하기1
나는 MSA 프로젝트에서 DB 정합성 보장을 위해 Spring Event를 다음과 같이 사용했다. 잠시 이전 글의 서론을 다시 가져왔다. 한번 읽어보자 내가 구성한 MSA 프로젝트에서는 멤버 서버와 또 다른 서버
curiousjinan.tistory.com
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7'님의 블로그도 한번 봐주세요 :)
하다보니 재미있는 개발
하다 보니 재미있는 개발에 빠져있는 중입니다. 문의사항: ysoil8811@gmail.com
yijoon009.tistory.com
'Spring > Spring 오류해결' 카테고리의 다른 글
[스프링, 스프링부트] Spring - 게시글 삭제중 발생한 오류 해결 (0) | 2023.08.22 |
---|---|
사용법 미숙지로 인한 controller test - 오류해결 (2) | 2023.08.08 |