[Spring Batch] 메타데이터 테이블 관련 이슈

mrcocoball·2025년 2월 17일

Spring Framework

목록 보기
15/20

개요

새로운 환경에 배치 어플리케이션을 배포하고 테스트하던 도중, BATCH_JOB_EXECUTION 테이블에 JOB 관련 데이터가 제대로 적재되지 않는 문제가 발생하였다.

확인 결과 및 대응

로그 확인 결과

배치 어플리케이션 내 로그를 확인해보니 BATCH_STEP_EXECUTION 테이블에서 PRIMARY KEY를 생성하던 도중 오류가 발생하였다.

org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO BATCH_STEP_EXECUTION(STEP_EXECUTION_ID, VERSION, STEP_NAME, JOB_EXECUTION_ID, START_TIME, END_TIME, STATUS, COMMIT_COUNT, READ_COUNT, FILTER_COUNT, WRITE_COUNT, EXIT_CODE, EXIT_MESSAGE, READ_SKIP_COUNT, WRITE_SKIP_COUNT, PROCESS_SKIP_COUNT, ROLLBACK_COUNT, LAST_UPDATED, CREATE_TIME)
	VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
]; Duplicate entry '0' for key 'BATCH_STEP_EXECUTION.PRIMARY'
	at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)
	at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1572)
	at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:667)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:960)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:1015)
	at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:1020)
	at org.springframework.batch.core.repository.dao.JdbcStepExecutionDao.saveStepExecution(JdbcStepExecutionDao.java:159)
	at org.springframework.batch.core.repository.support.SimpleJobRepository.add(SimpleJobRepository.java:210)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:391)
	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
	at org.springframework.aop.framework.ReflectiveMethodInvocation

원인

배치 어플리케이션과 DB를 연결할 때, 초기에만 spring.batch.initialize-schema 옵션을 always로 설정했었고 스테이징, 운영으로 넘어갈 때엔 never로 변경하였는데 이 상태에서 새로운 환경의 DB에는 Schema만 마이그레이션을 하여 시퀀스 관련 초기 데이터가 존재하지 않아 이런 문제가 발생하였다.

해결 방안

EXECUTION 테이블의 시퀀스 관련 데이터를 직접 추가해준다.

INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0, '0');
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0, '0');
INSERT INTO BATCH_JOB_SEQ values(0, '0');
profile
Backend Developer

0개의 댓글