죽지도 않고 돌아온 Spring Batch 미동작 문제

호기성세균·2024년 5월 15일
0

트러블슈팅

목록 보기
12/19

Spring Batch 테이블 문제를 해결하고 다음날....
참고 : 테이블 문제 트러블 슈팅 링크

서버 로그에 이런 에러 메시지가 찍혀있었다.
발생한 에러는 DataAccessResourceFailureException이다. 데이터 접근 중 발생하는 예외를 처리할 때 사용되는 일반적인 예외 유형이다.
이 경우 데이터베이스 작업 중 리소스 관련 실패가 발생했음을 나타내는데, 이 경우 MySQLMaxValueIncrementer가 BATCH_JOB_SEQ 테이블의 다음 키(즉, 다음 ID 값)를 가져오려고 시도했을 때, 해당 테이블이 데이터베이스에 존재하지 않아 발생한 것이다.

[원인 분석]

로그 그대로 BATCH_JOB_SEQ 테이블이 db에 존재하지 않기 때문에 발생한 에러이기 때문에 해당 테이블을 생성해주면 끝일 것이다. 하지만 난 BATCH_JOB_SEQ란 테이블을 공식 문서에서 본 기억이 없다....
이 테이블은 어떤 역할을 하는 테이블일까?

(BATCH_JOB_SEQ란)
일반적으로 스프링 배치에서 ID를 자동으로 생성하기 위해 사용하는 테이블이라고 한다.

그런데 이 프로젝트에서는 MySQL을 사용한다. MySQL에서는 AUTO_INCREMENT 속성을 사용하여 테이블의 특정 열에 자동으로 고유한 값을 증가시킬 수 있다. 그럼 BATCH_JOB_SEQ 같은 시퀀스 테이블이 없어도 자동으로 id를 생성할 수 있다는 소리 아닌가??? 거의 동일한 역할을 수행하는데, BATCH_JOB_SEQ 테이블이 있을 필요가 있나???

[해결 방법]

MySQL에서의 AUTO_INCREMENT 활용 :
스프링 배치는 내부적으로 JobRepository를 사용하여 작업 실행에 필요한 정보(예: 실행 ID, 상태, 결과 등)를 데이터베이스에 저장한다. MySQL 데이터베이스에서 AUTO_INCREMENT를 사용하도록 JobRepository를 구성하려면, 다음과 같이 JobRepositoryFactoryBean을 설정할 수 있다.

@Bean
public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(dataSource);
    factory.setTransactionManager(transactionManager);
    factory.setDatabaseType(DatabaseType.MYSQL.getProductName());
    factory.afterPropertiesSet();
    return factory.getObject();
}

이 과정을 거치면 MySQL 데이터베이스의 AUTO_INCREMENT 기능을 활용하여 ID 관리를 자동화하기 때문에 별도의 BATCH_JOB_SEQ같은 시퀀스 테이블을 생성하지 않아도 된다.
이제 각 Job과 Step의 구성은 MySQL의 자동 증가 기능에 의존하여 ID를 관리하게 된다.

profile
공부...열심히...

0개의 댓글