[Spring Batch] 데이터베이스 연동 오류 해결

chrkb1569·2024년 3월 1일
0

오류 해결 일지

목록 보기
11/11

Spring Batch를 공부하는 과정에서 발생했던 오류입니다.

간단하게 Job, Step, Tasklet을 구성한 뒤, Batch Application을 동작시키니 다음과 같은 오류로 인하여 실행이 중단되었습니다.

처음 오류 메세지를 읽어봤을때에는 왜 데이터베이스와 관련된 에러가 발생하는 것인지 이해하지 못했습니다.

아니 난 배치 썼는데 왜 너가...?

오늘은 오류를 해결하면서 공부했던 오류가 발생하는 원인 및 해결 방안을 알아보도록 하겠습니다.

MetaData

혹시 메타 데이터라는 용어를 알고 계시나요?

이를 간단하게 설명하자면, 데이터의 형식을 나타내는 데이터를 의미합니다.

흔하게 찾아볼 수 있는 예시로는 파일 정보를 예시로 들 수 있을 것 같습니다.

다음처럼 파일의 생성일, 수정일, 위치, 크기 등 '파일'이라는 데이터의 구조, 형식 등을 나타내는 데이터들을 모두 메타 데이터라고 합니다.

MetaData와 Spring Batch

Spring Batch는 정해진 시간에 주어진 작업을 수행해야합니다.

여기서 작업과 관련된 정보, 작업을 수행할 시간과 관련된 정보들이 모두 메타 데이터에 해당됩니다.

Spring Batch는 이러한 메타 데이터를 어딘가에 저장해놓아야 쉽게 작업을 수행할 수 있는데, 이러한 이유에서 메타 데이터를 데이터베이스에 저장하기 시작하였습니다.

[Reference : https://docs.spring.io/spring-batch/reference/schema-appendix.html#metaDataSchema]

이를 메타 데이터 스키마라고하는데, Spring Batch가 동작하기 위해서는 지금 보이는 테이블들이 데이터베이스에 존재해야합니다.

저는 데이터베이스에 테이블들이 존재하지 않았기 때문에 다음과 같은 오류가 발생했던 것입니다.

그런데 이걸 보면서 이걸 직접 쳐야하나라는 생각이 들 수 있습니다.

에 뭐 치라고 하면 치겠는데 좀 많긴 합니다ㅋㅋ

Spring Batch는 이러한 메타 데이터 스키마를 구성하는 2가지 방법을 제공하는데, 수동 방법과 자동 방법이 존재합니다.

수동 방식

일단 수동으로 메타 데이터 스키마를 구축하는 방식입니다.

외부 라이브러리 -> spring-batch-core -> org로 접근해보면,

다음처럼 데이터베이스 종류별로 sql 실행 스크립트가 존재하는 것을 확인할 수 있습니다.

저는 Batch Application과 MySQL을 연동해놨기 때문에, MySQL과 관련된 스크립트를 실행해보도록 하겠습니다.

일단 스크립트를 실행하기 전, 아무것도 존재하지 않는 데이터베이스입니다.

다음처럼 스크립트를 복사해서 실행해주었습니다.

그럼 다음처럼 Batch Application이 동작하기 위해 필요한 메타 데이터 스키마가 구성되었음을 확인할 수 있습니다.

이 상태에서 Application을 동작시키니, 잘 동작하는 것을 확인할 수 있었습니다.

자동 방식

수동 방식이 낭만 있는 방식이지만, 귀찮다는 점은 부정할 수 없는 단점입니다.

이러한 단점을 보완하기 위해 Spring Batch에서는 메타 데이터 스키마 자동 생성 방식을 제공해줍니다.

application.yml 파일에서 설정을 할 수 있습니다.

다음처럼 spring.batch.jdbc.initialize-shema 라는 옵션을 통해 자동 생성 방식을 지정할 수 있습니다.

방식은 총 3가지로, 각각의 특징은 다음과 같습니다.

  • always -> 수동 방식에서 사용했던 스크립트를 찾아서 자동으로 실행
  • embedded -> 연동되어 있는 데이터베이스가 내장 데이터베이스인 경우에만 스크립트를 실행한다.
  • never -> 자동 생성 방식 사용하지 않음

각 방식이 동작하는 모습을 확인해보기위해서 데이터베이스를 초기화해주었습니다.

always

스크립트를 사용했던 수동 방식과 동일한 결과가 나오는 것을 확인할 수 있었습니다.

embedded

내장 데이터베이스 대신 MySQL을 사용하고 있기 때문에 스크립트를 실행하지 않아, 다음처럼 오류가 발생하는 것을 확인할 수 있었습니다.

never

메타 데이터 테이블이 존재하지 않아 오류가 발생하는 모습을 볼 수 있습니다.

해결책

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: 
    username: 
    password: 
  batch:
    jdbc:
      initialize-schema: always

번거로운 수동 방식보다는 다음처럼 자동 방식을 사용하여 메타 데이터 테이블을 만들어주도록 설정하여 문제를 해결할 수 있었습니다.

0개의 댓글