1. 소개
Flyway 라이브러리를 사용하면 SQL 소스 코드로 저장된 변경 사항을 추적하여 데이터베이스 버전을 지정할 수 있습니다. 각 변경 세트를 마이그레이션 이라고 합니다 .
개별 마이그레이션은 마이그레이션 , 정리, 정보, 유효성 검사, 기준선 및 복구 를 포함하는 일련의 명령을 사용하여 순차적으로 데이터베이스에 적용됩니다 . 대상 데이터베이스의 현재 버전에 따라 통제된 방식으로 적용됩니다.
일반적으로 마이그레이션은 대부분의 사용 사례를 처리하기에 충분하지만 콜백에 적합한 여러 시나리오가 있습니다.
이 기사에서는 Flyway 콜백을 사용하여 제공하는 다양한 명령의 수명 주기에 연결합니다.
2. 사용 사례 시나리오
콜백이 제공하는 일종의 유연성이 필요한 매우 구체적인 요구 사항이 있을 수 있습니다. 다음은 몇 가지 가능한 사용 사례입니다.
- 구체화된 뷰 재구축 – 해당 뷰의 기본 테이블에 영향을 미치는 마이그레이션을 적용할 때마다 구체화된 뷰 를 재구축 해야 할 수 있습니다. SQL 콜백은 이러한 유형의 논리를 실행하는 데 적합합니다.
- 캐시 비우기 – 캐시 된 데이터를 수정하는 마이그레이션이 있을 수 있습니다. 콜백을 사용하여 캐시를 플러시 하여 응용 프로그램이 데이터베이스에서 최신 데이터를 가져오도록 할 수 있습니다.
- 외부 시스템 호출 – 콜백을 사용하여 랜덤의 기술을 사용하여 외부 시스템을 호출 할 수 있습니다. 예를 들어 이벤트를 게시하거나 이메일을 보내거나 서버 재시작을 트리거할 수 있습니다.
3. 지원되는 콜백
사용 가능한 각 Flyway 명령에 해당하는 이전 및 이후 콜백 이벤트가 있습니다. 이러한 명령에 대한 자세한 내용은 주요 Flyway 문서 또는 공식 문서 를 참조하십시오 .
- BEFORE_ 이벤트는 작업이 실행되기 전에 시작됩니다.
- 작업이 성공한 후 AFTER_ 이벤트가 시작됩니다. 이러한 사후 이벤트에는 몇 가지 더 세분화된 이벤트도 있습니다.
- ERROR에 해당하는 항목은 작업이 실패한 후 실행됩니다.
- OPERATION_FINISH 이벤트는 작업이 완료된 후 시작됩니다.
- 마이그레이션 및 실행 취소 에는 각 개별 마이그레이션에 대해 실행되는 _EACH 이벤트도 있습니다. 마이그레이션 및 실행 취소 명령 은 이러한 명령을 실행하면 많은 마이그레이션이 실행되는 경우가 많기 때문에 이러한 추가 콜백을 제공합니다.
콜백 이벤트의 전체 List은 Event 클래스에서 찾을 수 있습니다.
예를 들어 clean 명령에 대한 콜백 이벤트 는 BEFORE_CLEAN 및 AFTER_CLEAN 입니다. Flyway는 clean 명령 실행 직전과 직후에 그것들을 발사합니다 .
소개 에서 논의한 내용을 상기하면 사용 가능한 명령 은 다음 과 같습니다 .
Flyway 작성자는 이러한 추가 후크를 제공하여 Flyway가 작동하는 최고 수준의 세분성, 즉 개별 마이그레이션에서 사용자 지정 콜백 논리를 제어할 수 있도록 했습니다.
4. 의존성
콜백이 실제로 어떻게 작동하는지 확인하기 위해 간단한 예제를 살펴보겠습니다. pom.xml 에서 flyway-core를 의존성으로 선언하여 예제를 시작할 수 있습니다 .
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>8.5.13</version>
</dependency>
Maven Central 에서 최신 버전의 flyway-core 를 찾을 수 있습니다 .
5. 콜백
Flyway를 사용하면 Java 또는 SQL의 두 가지 접근 방식을 사용하여 콜백을 만들 수 있습니다. 전자가 가장 유연합니다. 랜덤의 코드를 실행할 수 있는 자유를 제공합니다.
후자를 사용하면 데이터베이스와 직접 상호 작용할 수 있습니다.
5.1. 자바 콜백
Java API 계약은 콜백 인터페이스에서 정의됩니다.
가장 간단한 경우 사용자 정의 콜백을 생성하려면 ExampleFlywayCallback 에서와 같이 콜백 인터페이스 를 구현해야 합니다.
public class ExampleFlywayCallback implements Callback {
private final Log log = LogFactory.getLog(getClass());
@Override
public boolean supports(Event event, Context context) {
return event == Event.AFTER_EACH_MIGRATE;
}
@Override
public boolean canHandleInTransaction(Event event, Context context) {
return true;
}
@Override
public void handle(Event event, Context context) {
if (event == Event.AFTER_EACH_MIGRATE) {
log.info("> afterEachMigrate");
}
}
@Override
public String getCallbackName() {
return ExampleFlywayCallback.class.getSimpleName();
}
}
5.2. SQL 콜백
SQL 콜백 계약은 locations(s) 로 구성된 디렉터리에 포함된 특정 이름을 가진 파일을 사용하여 정의됩니다 . Flyway는 구성된 위치 에서 SQL 콜백 파일을 찾고 그에 따라 실행합니다.
예를 들어 위치 로 구성된 디렉터리에 있는 beforeEachMigrate.sql 이라는 파일 은 마이그레이션 명령 을 실행하는 동안 각 마이그레이션 스크립트 전에 실행 됩니다.
6. 구성 및 실행
다음 예에서는 Java 콜백을 구성하고 두 개의 SQL 스크립트 위치를 지정합니다. 하나는 마이그레이션을 포함하고 다른 하나는 SQL 콜백을 포함합니다.
마이그레이션 및 SQL 콜백을 위해 별도의 위치를 구성할 필요는 없지만, 이러한 방식을 별도로 유지하는 방법을 보여주기 위해 예제에서 이러한 방식으로 설정했습니다.
@Test
public void migrateWithSqlAndJavaCallbacks() {
Flyway flyway = Flyway.configure()
.dataSource(dataSource)
.locations("db/migration", "db/callbacks")
.callbacks(new ExampleFlywayCallback())
.load();
flyway.migrate();
}
Java와 SQL 모두에서 beforeEachMigrate 를 정의하는 경우 Java 콜백이 먼저 실행된 후 즉시 SQL 콜백이 실행된다는 점을 아는 것이 도움이 됩니다.
이는 위 테스트의 출력에서 볼 수 있습니다.
21:50:45.677 [main] INFO c.b.f.FlywayApplicationUnitTest - > migrateWithSqlAndJavaCallbacks
21:50:45.848 [main] INFO o.f.c.i.license.VersionPrinter - Flyway Community Edition 8.0.0 by Redgate
21:50:45.849 [main] INFO o.f.c.i.d.base.BaseDatabaseType - Database: jdbc:h2:mem:DATABASE (H2 1.4)
21:50:45.938 [main] INFO o.f.core.internal.command.DbValidate - Successfully validated 2 migrations (execution time 00:00.021s)
21:50:45.951 [main] INFO o.f.c.i.s.JdbcTableSchemaHistory - Creating Schema History table "PUBLIC"."flyway_schema_history" ...
21:50:46.003 [main] INFO o.f.c.i.c.SqlScriptCallbackFactory - Executing SQL callback: beforeMigrate -
21:50:46.015 [main] INFO o.f.core.internal.command.DbMigrate - Current version of schema "PUBLIC": << Empty Schema >>
21:50:46.023 [main] INFO o.f.c.i.c.SqlScriptCallbackFactory - Executing SQL callback: beforeEachMigrate -
21:50:46.024 [main] INFO o.f.core.internal.command.DbMigrate - Migrating schema "PUBLIC" to version "1.0 - add table one"
21:50:46.025 [main] INFO c.b.f.ExampleFlywayCallback - > afterEachMigrate
21:50:46.046 [main] INFO o.f.c.i.c.SqlScriptCallbackFactory - Executing SQL callback: beforeEachMigrate -
21:50:46.046 [main] INFO o.f.core.internal.command.DbMigrate - Migrating schema "PUBLIC" to version "1.1 - add table two"
21:50:46.047 [main] INFO c.b.f.ExampleFlywayCallback - > afterEachMigrate
21:50:46.067 [main] INFO o.f.core.internal.command.DbMigrate - Successfully applied 2 migrations to schema "PUBLIC", now at version v1.1 (execution time 00:00.060s)
7. 결론
이 기사에서는 Flyway 콜백 메커니즘이 Java와 SQL 모두에서 어떻게 사용될 수 있는지 살펴보았습니다. 가능한 사용 사례를 살펴보고 예를 자세히 설명했습니다.
항상 그렇듯이 모든 소스 코드는 GitHub 에서 찾을 수 있습니다 .