실무 DB 연결: MySQL/Oracle에서 Spring Batch 설정하는 방법

안녕하세요. IT 교육 전문가입니다.

로컬에서 H2 DB로 개발을 마쳤다면, 이제 실제 운영 서버인 MySQL이나 Oracle에 연결할 차례입니다.
하지만 인메모리 DB와 달리, 실제 RDBMS를 붙일 때는 드라이버 설정부터 스키마 초기화 전략까지 신경 써야 할 부분이 많습니다.

오늘은 실무에서 가장 많이 쓰이는 MySQL과 Oracle 데이터베이스 연동 가이드를 정리해 드립니다.


1. JDBC 드라이버 의존성 추가

먼저 build.gradle에 각 DB에 맞는 드라이버를 추가해야 합니다.

MySQL (Connector/J)

runtimeOnly 'com.mysql:mysql-connector-j'

Oracle (OJDBC)

runtimeOnly 'com.oracle.database.jdbc:ojdbc11'

2. application.yml 설정 (MySQL 편)

MySQL 8.0 이상을 기준으로 한 설정입니다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/batch_db?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
    username: root
    password: password1234
    driver-class-name: com.mysql.cj.jdbc.Driver

  batch:
    jdbc:
      # 초기 1회만 always로 실행하여 테이블 생성 후, 운영 시 never로 변경 권장
      initialize-schema: always 
      # DDL 스크립트 위치 명시 (필요시)
      schema: classpath:org/springframework/batch/core/schema-mysql.sql

  jpa:
    database: mysql
    database-platform: org.hibernate.dialect.MySQL8Dialect

주의할 점: 메타 테이블 생성

Spring Batch는 자신이 사용할 테이블(BATCH_JOB_INSTANCE 등)이 없으면 에러를 뱉습니다.
* 최초 실행 시: initialize-schema: always로 설정하면 Spring Boot가 알아서 schema-mysql.sql을 찾아 실행해 줍니다.
* 운영 배포 시: 테이블이 이미 존재하므로 never로 바꾸거나, validate 모드를 사용하는 것이 안전합니다.


3. application.yml 설정 (Oracle 편)

오라클은 설정이 약간 다릅니다.

spring:
  datasource:
    url: jdbc:oracle:thin:@localhost:1521:XE
    username: batch_user
    password: password1234
    driver-class-name: oracle.jdbc.OracleDriver

  batch:
    jdbc:
      initialize-schema: always
      # 오라클용 스키마 스크립트 지정
      schema: classpath:org/springframework/batch/core/schema-oracle.sql

  jpa:
    database: oracle
    database-platform: org.hibernate.dialect.OracleDialect

4. 다중 데이터베이스 설정 (Advanced)

실무에서는 배치 메타 데이터는 MySQL에 저장하고, 비즈니스 데이터는 Oracle에서 읽어오는 경우가 많습니다. 이때는 DataSource를 2개 등록해야 합니다.

@Configuration
public class DataSourceConfig {

    // 1. 메타 데이터용 DB (Primary)
    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.meta")
    public DataSource metaDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 2. 비즈니스 데이터용 DB
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.biz")
    public DataSource bizDataSource() {
        return DataSourceBuilder.create().build();
    }
}

이후 JobConfigReader에서 @Qualifier("bizDataSource") 등을 통해 원하는 DB를 주입받아 사용하면 됩니다.


5. 트러블슈팅 가이드

Q1. “Table doesn’t exist” 에러가 나요!

  • 원인: 메타 테이블이 생성되지 않았습니다.
  • 해결: spring.batch.jdbc.initialize-schema: always로 설정하고 한 번 실행하세요. 혹은 org/springframework/batch/core/schema-*.sql 파일을 찾아 DB 툴에서 직접 실행하세요.

Q2. MySQL에서 “Public Key Retrieval is not allowed” 에러

  • 해결: JDBC URL에 &allowPublicKeyRetrieval=true&useSSL=false 옵션을 추가하세요.

6. 결론

H2에서 실제 DB로의 전환은 배치 애플리케이션이 ‘장난감’에서 ‘제품’으로 넘어가는 순간입니다.
데이터베이스별 특성(방언, 드라이버)을 잘 이해하고 설정을 분리하여 관리한다면, 어떤 환경에서도 안정적으로 돌아가는 배치를 만들 수 있습니다.

관련 글 보기