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. 출처 (커뮤니티에 올라온 글)
이 글을 다 읽었다면 아래의 글을 통해 MSA에 대한 지식을 늘려보는 것을 추천합니다!
이 포스트는 Team chillwave에서 사이드 프로젝트 중 적용했던 부분을 다시 공부하며 기록한 것입니다.
시간이 괜찮다면 팀원 '평양냉면7'님의 블로그도 한번 봐주세요 :)
반응형
'Spring > Spring 오류해결' 카테고리의 다른 글
[스프링, 스프링부트] Spring - 게시글 삭제중 발생한 오류 해결 (0) | 2023.08.22 |
---|---|
사용법 미숙지로 인한 controller test - 오류해결 (2) | 2023.08.08 |