Flyway는 대표적인 데이터베이스 마이그레이션 도구로써, 애플리케이션의 버전 관리와 데이터베이스 스키마 변경을 용이하게 해줍니다. Flyway를 사용하면 데이터베이스의 스키마 변화를 추적하고, 이를 자동으로 적용하여 애플리케이션과 데이터베이스의 일관성을 유지할 수 있습니다.
하지만 멀티 테넌시 애플리케이션에서는 각 테넌트마다 독립적인 데이터베이스를 사용하는 경우가 많습니다. 이 경우 각 테넌트별로 별도의 데이터베이스 마이그레이션을 관리해야 합니다. Flyway는 이러한 멀티 테넌시 전략에 유연하게 대응할 수 있도록 다양한 방법을 제공합니다.
별도의 스키마를 이용한 멀티 테넌시
가장 일반적인 멀티 테넌시 전략 중 하나는 각 테넌트별로 별도의 스키마를 사용하는 것입니다. 각 테넌트의 데이터베이스에 대해 별도의 마이그레이션 스크립트를 작성하고, Flyway의 schemas
설정 옵션을 사용하여 각 스키마에만 해당 스크립트를 적용합니다.
flyway.setSchemas("tenant1", "tenant2", "tenant3");
flyway.migrate();
이렇게 설정하면 Flyway는 각 테넌트의 데이터베이스에만 해당하는 마이그레이션 스크립트만 적용하게 됩니다.
동일 스키마 내에서 테넌트 구분
또 다른 방법은 동일한 스키마를 이용하되, 테넌트를 구분하는 필드를 추가하여 데이터를 구분하는 것입니다. 예를 들어, 테넌트를 구분하는 컬럼을 추가하고 해당 컬럼을 이용하여 데이터베이스 마이그레이션 스크립트에서 테넌트별로 데이터를 구분할 수 있습니다.
flyway.setTable("tenant_table");
flyway.setPlaceholders(Map.of("tenant", "tenant1"));
flyway.migrate();
이러한 방식을 사용하면 하나의 스키마 내에서 테넌트별로 데이터를 구분할 수 있습니다.
마이그레이션 스크립트 분리
마지막으로 각 테넌트별로 별도로 마이그레이션 스크립트를 작성하여 관리하는 방법도 있습니다. 이 경우 각 테넌트의 마이그레이션 스크립트 디렉토리를 분리하여 관리하고, Flyway의 locations
설정 옵션을 사용하여 각 테넌트의 스크립트 디렉토리를 지정합니다.
flyway.setLocations("db/migration/tenant1", "db/migration/tenant2", "db/migration/tenant3");
flyway.migrate();
이렇게 설정하면 Flyway는 각 테넌트의 스크립트 디렉토리에 있는 마이그레이션 스크립트만 적용하게 됩니다.
위에서 소개한 세 가지 방법을 적절히 활용하여, Flyway를 사용하는 Java 애플리케이션에서 멀티 테넌시 전략을 유연하게 구성할 수 있습니다.