[java] Flyway를 사용하는 Java 애플리케이션의 멀티 테넌시 전략

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 애플리케이션에서 멀티 테넌시 전략을 유연하게 구성할 수 있습니다.

참고 자료