1. 개요
이전 기사 에서 데이터베이스 스키마 및 데이터를 관리하기 위한 도구로 Liquibase를 보여주었습니다.
이 기사에서는 롤백 기능과 Liquibase 작업을 취소하는 방법에 대해 자세히 알아볼 것입니다.
당연히 이것은 모든 생산 등급 시스템의 중요한 기능입니다.
2. Liquibase 마이그레이션의 범주
두 가지 범주의 Liquibase 작업이 있어 롤백 문의 생성이 다릅니다.
- 자동 , 여기서 마이그레이션은 롤백에 필요한 단계를 결정적으로 생성할 수 있습니다.
- 수동 , 마이그레이션 명령을 사용하여 명령문을 결정적으로 식별할 수 없기 때문에 롤백 명령을 실행해야 합니다.
예를 들어, "테이블 생성" 문의 롤백은 생성된 테이블을 " 삭제" 하는 것 입니다. 이것은 의심할 여지 없이 결정할 수 있으므로 롤백 문을 자동으로 생성할 수 있습니다.
반면에 "drop table" 명령 에 대한 롤백 문은 결정할 수 없습니다 . 테이블의 마지막 상태를 확인할 수 없으므로 롤백 문을 자동 생성할 수 없습니다. 이러한 유형의 마이그레이션 문에는 수동 롤백 지침이 필요합니다.
3. 간단한 롤백 문 작성
실행될 때 테이블을 생성하고 변경 집합에 롤백 문을 추가하는 간단한 변경 집합을 작성해 보겠습니다.
<changeSet id="testRollback" author="baeldung">
<createTable tableName="baeldung_turorial">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
<column name="author" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="baeldung_test"/>
</rollback>
</changeSet>
위의 예는 위에서 언급한 첫 번째 범주에 해당합니다. 추가하지 않으면 자동으로 롤백 문을 생성합니다. 그러나 롤백 문을 만들어 기본 동작을 재정의할 수 있습니다.
다음 명령을 사용하여 마이그레이션을 실행할 수 있습니다.
mvn liquibase:update
실행 후 다음을 사용하여 작업을 롤백할 수 있습니다.
mvn liquibase:rollback
이렇게 하면 변경 집합의 롤백 세그먼트가 실행되고 업데이트 단계에서 완료된 작업을 되돌려야 합니다. 그러나 이 명령만 실행하면 빌드가 실패합니다.
그 이유는 – 롤백 제한을 지정하지 않기 때문입니다. 데이터베이스는 초기 단계로 롤백하여 완전히 지워집니다. 따라서 조건이 충족될 때 롤백 작업을 제한하려면 아래 세 가지 제약 조건 중 하나를 정의해야 합니다.
- 롤백태그
- 롤백카운트
- 롤백날짜
3.1. 태그로 롤백
데이터베이스의 특정 상태를 태그로 정의할 수 있습니다. 따라서 우리는 그 상태를 다시 참조할 수 있습니다. 태그 이름 "1.0"으로 롤백하면 다음과 같습니다.
mvn liquibase:rollback -Dliquibase.rollbackTag=1.0
이것은 태그 "1.0" 이후에 실행된 모든 변경 집합의 롤백 문을 실행합니다.
3.2. 개수별 롤백
여기에서 롤백해야 하는 변경 집합의 수를 정의합니다. 1로 정의하면 마지막 변경 집합 실행이 롤백됩니다.
mvn liquibase:rollback -Dliquibase.rollbackCount=1
3.3. 날짜로 롤백
롤백 대상을 날짜로 설정할 수 있으므로 해당 날짜 이후에 실행된 모든 변경 집합은 롤백됩니다.
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
날짜 형식은 ISO 데이터 형식이거나 실행 플랫폼 의 DateFormat.getDateInstance() 값과 일치해야 합니다.
4. 변경 집합 옵션 롤백
변경 집합에서 롤백 문의 가능한 사용법을 살펴보겠습니다.
4.1. 다중 명령문 롤백
단일 롤백 태그는 실행할 둘 이상의 명령어를 포함할 수 있습니다.
<changeSet id="multiStatementRollback" author="baeldung">
<createTable tableName="baeldung_tutorial2">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
</createTable>
<createTable tableName="baeldung_tutorial3">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="baeldung_tutorial2"/>
<dropTable tableName="baeldung_tutorial3"/>
</rollback>
</changeSet>
여기에서 동일한 롤백 태그에 두 개의 테이블을 삭제합니다. 여러 문장으로 작업을 분할할 수도 있습니다.
4.2. 다중 롤백 태그
변경 집합에는 둘 이상의 롤백 태그가 있을 수 있습니다. 변경 집합에 나타나는 순서대로 실행됩니다.
<changeSet id="multipleRollbackTags" author="baeldung">
<createTable tableName="baeldung_tutorial4">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
</createTable>
<createTable tableName="baeldung_tutorial5">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
</createTable>
<rollback>
<dropTable tableName="baeldung_tutorial4"/>
</rollback>
<rollback>
<dropTable tableName="baeldung_tutorial5"/>
</rollback>
</changeSet>
4.3. 롤백을 위해 다른 변경 집합 참조
데이터베이스의 일부 세부 사항을 변경하려는 경우 다른 변경 세트, 아마도 원래 변경 세트를 참조할 수 있습니다. 이렇게 하면 코드 중복이 줄어들고 완료된 변경 사항을 올바르게 되돌릴 수 있습니다.
<changeSet id="referChangeSetForRollback" author="baeldung">
<dropTable tableName="baeldung_tutorial2"/>
<dropTable tableName="baeldung_tutorial3"/>
<rollback changeSetId="multiStatementRollback" changeSetAuthor="baeldung"/>
</changeSet>
4.4. 빈 롤백 태그
기본적으로 Liquibase는 제공하지 않은 경우 롤백 스크립트를 생성하려고 시도합니다. 이 기능을 중단해야 하는 경우 롤백 작업이 되돌려지지 않도록 빈 롤백 태그를 가질 수 있습니다.
<changeSet id="emptyRollback" author="baeldung">
<createTable tableName="baeldung_tutorial">
<column name="id" type="int"/>
<column name="heading" type="varchar(36)"/>
<column name="author" type="varchar(36)"/>
</createTable>
<rollback/>
</changeSet>
5. 롤백 명령 옵션
데이터베이스를 이전 상태로 롤백하는 것 외에도 Liquibase는 다양한 방법으로 사용할 수 있습니다. 즉, 롤백 SQL 생성, 향후 롤백 스크립트 생성, 그리고 마지막으로 마이그레이션과 롤백을 한 번에 테스트할 수 있습니다.
5.1. 롤백 스크립트 생성
롤백과 마찬가지로 롤백 SQL을 생성하기 위한 세 가지 옵션이 있습니다. 사람들은:
- rollbackSQL <tag> – 언급된 태그로 데이터베이스를 롤백하기 위한 스크립트
- rollbackToDateSQL <날짜/시간> – 데이터베이스를 언급된 날짜/시간의 상태로 롤백하는 SQL 스크립트
- rollbackCountSQL <값> – 이전 단계 수에서 언급한 상태로 데이터베이스를 롤백하는 SQL 스크립트
실제 사례 중 하나를 살펴보겠습니다.
mvn liquibase:rollbackCountSQL 2
5.2. 향후 롤백 스크립트 생성
이 명령은 현재 실행할 수 있는 변경 집합이 완료된 상태에서 데이터베이스를 현재 상태로 가져오는 데 필요한 롤백 SQL 명령을 생성합니다. 이것은 우리가 수행하려는 변경에 대한 롤백 스크립트를 제공해야 하는 경우 매우 유용합니다.
이것은 우리가 수행하려는 변경에 대한 롤백 스크립트를 제공해야 하는 경우 매우 유용합니다.
mvn liquibase:futureRollbackSQL
5.3. 업데이트 테스트 롤백 실행
이 명령은 데이터베이스 업데이트를 실행한 다음 변경 집합을 롤백하여 데이터베이스를 현재 상태로 만듭니다. 향후 롤백 및 업데이트 테스트 롤백은 모두 실행이 완료된 후 현재 데이터베이스를 변경하지 않습니다. 그러나 업데이트 테스트 롤백은 실제 마이그레이션을 수행한 다음 롤백합니다.
이것은 데이터베이스를 영구적으로 변경하지 않고 업데이트 변경 실행을 테스트하는 데 사용할 수 있습니다.
mvn liquibase:updateTestingRollback
6. 결론
이 빠른 사용방법(예제)에서는 Liquibase 롤백 기능의 몇 가지 명령줄 및 변경 집합 기능을 살펴보았습니다.
항상 그렇듯이 소스 코드는 GitHub 에서 찾을 수 있습니다 .