Spring Boot Flyway with Routing DataSource

TMT

Routing DataSource 환경에서 Flyway 설정 방법
여러 DataSource를 사용하는 경우 Flyway 마이그레이션을 Writer DataSource에 적용해야 합니다.


1. application.yml 설정 예시

# Writer DataSource 설정
spring:
  datasource:
    writer:
      url: jdbc:mysql://writer-db:3306/mydb
      username: writer_user
      password: writer_pass
      driver-class-name: com.mysql.cj.jdbc.Driver

# Flyway: Writer DB에만 마이그레이션 적용
spring:
  flyway:
    url: ${spring.datasource.writer.url} # Writer DB URL 사용
    user: ${spring.datasource.writer.username}
    password: ${spring.datasource.writer.password}
    locations: classpath:db/migration
    enabled: true

2. 필수 구성 요소

(1) Writer DataSource 빈 정의

@Bean
@ConfigurationProperties("spring.datasource.writer")
public DataSource writerDataSource() {
    return DataSourceBuilder.create().build();
}

(2) Routing DataSource 빈 정의

@Bean
@Primary // 주의: Flyway는 @Primary DataSource를 사용하지 않도록 설정해야 함
public DataSource routingDataSource(
    @Qualifier("writerDataSource") DataSource writer,
    @Qualifier("readerDataSource") DataSource reader
) {
    // AbstractRoutingDataSource 구현체 사용
}

3. Flyway가 Writer DB를 사용하도록 강제 설정

방법 1: application.yml에서 직접 URL 지정 (권장)

  • Flyway의 url, user, passwordWriter DB 정보로 명시합니다.
  • 장점: 간단하고 오류 가능성이 적음.

방법 2: DataSource 빈을 명시적으로 주입

@Bean
public Flyway flyway(@Qualifier("writerDataSource") DataSource dataSource) {
    return Flyway.configure()
            .dataSource(dataSource)
            .locations("classpath:db/migration")
            .load();
}
  • 주의: Spring Boot의 자동 구성 (FlywayAutoConfiguration)을 비활성화해야 합니다.
    @SpringBootApplication(exclude = { FlywayAutoConfiguration.class })

4. 주의사항

  • @Primary DataSource 문제:
    Routing DataSource에 @Primary가 설정되어 있으면, Flyway가 의도치 않게 Routing DataSource를 사용할 수 있습니다.
    해결책: application.yml에서 Flyway의 url을 명시적으로 지정합니다.

  • 멀티 테넌시 환경:
    테넌트별로 별도의 DB를 사용하는 경우 Flyway의 다중 스키마 지원을 활용합니다.

  • 마이그레이션 스크립트 위치:
    src/main/resources/db/migrationV1__init.sql 형식으로 작성합니다.


5. 검증 방법

  1. 애플리케이션 시작 시 Flyway 로그 확인:

    Flyway Community Edition 9.22.3 by Redgate
    Database: jdbc:mysql://writer-db:3306/mydb (MySQL 8.0)
    Successfully validated 2 migrations (execution time 00:00.018s)
    Creating Schema History Table: mydb.flyway_schema_history
    Current version of schema `mydb`: << Empty Schema >>
    Migrating schema `mydb` to version "1.0 - Initial schema"
  2. Writer DB에서 flyway_schema_history 테이블 생성 여부 확인.


✅ 정리

  • 목표: Flyway 마이그레이션을 Writer DB에만 적용.
  • 핵심: spring.flyway.url을 Writer DB로 직접 지정.
  • 주의: @Primary DataSource가 Flyway에 영향을 주지 않도록 설정.
Edit this page