SpringWebflux 에서 Flyway 적용하기
SpringWebflux 에서 Flyway 적용하기

SpringWebflux 에서 Flyway 적용하기

Tags
SpringWebflux
R2DBC
JDBC
Flyway
TroubleShooting
Published
October 25, 2025
Author
lkdcode
 
신규 프로젝트를 Spring-Webflux 로 진행하기로 했다.
데이터베이스 형상 관리로 Flyway 를 채택했는데 프로젝트를 셋업하는 중 에러와 함께 동작하지 않는다.
Spring-Webflux 와 Flyway 는 함께 사용할 수 없는 것인가?
 
데이터베이스 형상관리는 많은 도움을 주므로 꼭 적용하고 싶다.
어떻게 적용하는지 알아보자!
 

🔥 Webflux with Flyway

Spring-WebFlux 는 비동기 논블로킹 리액티브 웹 프레임워크로 기존 MVC 동기 방식과 많이 다르다.
이벤트 루프 기반으로 동작하는데 데이터베이스 통신 역시 비동기/논블로킹을 지원하는 라이브러리를 사용하지 않는다면 원하는 성능을 얻기 힘들다. (전체 코드가 모두 비동기 논블로킹으로 동작해야함)
 
Spring-WebFlux 는 R2DBC 를 이용해 데이터베이스와의 통신 또한 비동기 논블로킹으로 수행하고,
Flyway 는 JDBC 를 기반으로 동작한다.
 
그렇다면 어플리케이션이 시작할 때 Flyway 는 JDBC 를 이용하게 하고, 나머지 어플리케이션의 동작은 모두 R2DBC 로 해도 될까? 운이 좋게도 빠른 해결법이 떠올랐고 마침 레퍼런스도 있어서 해당 방법을 적용하기로 했다. https://www.baeldung.com/spring-r2dbc-flyway
 

🚀 의존성

Spring-Webflux 기본 의존성과 함께 기존에 Flyway 가 사용할 JDBC 를 추가해준다.
Connector 역시 R2DBC, JDBC 2가지를 추가해주면 된다.
 
// Database dependencies { implementation("org.springframework.boot:spring-boot-starter-jdbc") implementation("org.springframework.boot:spring-boot-starter-data-r2dbc") runtimeOnly("org.postgresql:postgresql") runtimeOnly("org.postgresql:r2dbc-postgresql") }
 
// Flyway dependencies { implementation("org.flywaydb:flyway-core:11.12.0") implementation("org.flywaydb:flyway-mysql:11.12.0") implementation("org.flywaydb:flyway-database-postgresql") }
 

🚀 Config

 
Spring 컨테이너가 Bean 을 등록할 때는 어플리케이션을 실행하기 위한 초기 단계라 볼 수 있다.
이때 Flyway 를 실행시키면서 데이터베이스 형상 관리를 수행할 수 있게 세팅해주면 된다.
Flyway 가 데이터베이스 형상관리를 수행하기 위해 내부적으로 수행되는 메서드가 migrate() 인데 이 메서드를 @Bean 의 속성 중 하나인 initMethod 에 등록하여 Flyway 가 동작할 수 있도록 해당 메서드를 실행시키자.
 
import org.flywaydb.core.Flyway import org.springframework.boot.autoconfigure.flyway.FlywayProperties import org.springframework.boot.autoconfigure.r2dbc.R2dbcProperties import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @Configuration @EnableConfigurationProperties(R2dbcProperties::class, FlywayProperties::class) class FlywayInit { @Bean(initMethod = "migrate") fun flyway( flywayProperties: FlywayProperties, r2dbcProperties: R2dbcProperties, ): Flyway = Flyway.configure() .dataSource( flywayProperties.url, r2dbcProperties.username, r2dbcProperties.password ) .locations(*flywayProperties.locations.toTypedArray()) .baselineOnMigrate(true) .load() }
 
데이터베이스 연결 정보가 R2DBC 에 등록한 URL, username, password 와 같다면 그대로 이용해도 된다. 다르다면 FlywayProperties 에서 값을 가져와 등록하면 된다.
 
  • Flyway#migrate 메서드는 실제 내부 동작 구현체이다.
notion image