Spring Boot Flyway with Routing DataSource
TMTRouting 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
,password
를 Writer 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/migration
에V1__init.sql
형식으로 작성합니다.
5. 검증 방법
-
애플리케이션 시작 시 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"
-
Writer DB에서
flyway_schema_history
테이블 생성 여부 확인.
✅ 정리
- 목표: Flyway 마이그레이션을 Writer DB에만 적용.
- 핵심:
spring.flyway.url
을 Writer DB로 직접 지정. - 주의:
@Primary
DataSource가 Flyway에 영향을 주지 않도록 설정.