1. 개요

이 빠른 사용방법(예제)에서는 Liquibase 를 사용 하여 Java 웹 응용 프로그램 의 데이터베이스 스키마를 발전시킵니다 .

먼저 일반적인 Java 앱을 살펴보고 Spring 및 Hibernate에 사용할 수 있는 몇 가지 흥미로운 옵션에 대해서도 집중적으로 살펴볼 것입니다.

아주 간단히 말해서, Liquibase 사용의 핵심은 DB 업데이트를 위해 실행해야 하는 모든 변경 사항을 추적하는 XML 파일인 changeLog 파일 입니다 .

pom.xml 에 추가해야 하는 Maven 의존성부터 시작하겠습니다 .

<dependency>
    <groupId>org.liquibase</groupId>
     <artifactId>liquibase-core</artifactId>
      <version>3.4.1</version>
</dependency>

여기 에서 liquibase-core의 최신 버전이 있는지 확인할 수도 있습니다 .

2. 데이터베이스 변경 로그

이제 간단한 changeLog 파일 을 살펴보겠습니다 .

이것은 " users " 테이블에 " address " 열만 추가합니다 .

<databaseChangeLog 
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
  xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext
   http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd 
   http://www.liquibase.org/xml/ns/dbchangelog 
   http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
    
    <changeSet author="John" id="someUniqueId">
        <addColumn tableName="users">
            <column name="address" type="varchar(255)" />
        </addColumn>
    </changeSet>
    
</databaseChangeLog>

변경 세트가 ID작성자 로 식별되어 고유하게 식별되고 한 번만 적용될 수 있도록 하는 방법에 유의하십시오.

이제 이것을 응용 프로그램에 연결하고 응용 프로그램이 시작될 때 실행되는지 확인하는 방법을 살펴보겠습니다.

3. 스프링 빈으로 Liquibase 실행하기

애플리케이션 시작 시 변경 사항을 실행하는 첫 번째 옵션은 Spring 빈을 사용하는 것입니다.

물론 다른 많은 방법이 있지만 이것은 Spring 애플리케이션을 다룰 때 갈 수 있는 훌륭하고 간단한 방법입니다.

@Bean
public SpringLiquibase liquibase() {
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setChangeLog("classpath:liquibase-changeLog.xml");
    liquibase.setDataSource(dataSource());
    return liquibase;
}

클래스 경로에 존재해야 하는 유효한 changeLog 파일을 가리키는 방법에 유의하십시오 .

4. 스프링 부트와 함께 Liquibase 사용

Spring Boot 를 사용 하는 경우 Liquibase에 대한 을 정의할 필요가 없지만 여전히 liquibase-core 의존성을 추가해야 합니다.

그런 다음 변경 로그를 db/changelog/db.changelog-master.yaml 에 저장하기만 하면 시작 시 Liquibase 마이그레이션이 자동으로 실행됩니다.

liquibase.change-log 속성 을 사용하여 기본 변경 로그 파일을 변경할 수 있습니다 .

liquibase.change-log=classpath:liquibase-changeLog.xml

5. 스프링 부트에서 Liquibase 비활성화

경우에 따라 시작 시 Liquibase 마이그레이션 실행을 비활성화해야 할 수도 있습니다.

가장 간단한 옵션은 spring.liquibase.enabled 속성 을 사용하는 것입니다. 이렇게 하면 나머지 모든 Liquibase 구성이 그대로 유지됩니다.

다음은 Spring Boot 2의 예입니다.

spring.liquibase.enabled=false

Spring Boot 1.x의 경우 liquibase.enabled 속성을 사용해야 합니다.

liquibase.enabled=false

6. Maven 플러그인 으로 changeLog 생성

changeLog 파일을 수동으로 작성하는 대신 Liquibase Maven 플러그인을 사용하여 파일을 생성하고 많은 작업을 절약할 수 있습니다.

6.1. 플러그인 구성

다음은 pom.xml 에 대한 변경 사항입니다 .

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.4.1</version>
</dependency> 
...
<plugins>
    <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>3.4.1</version>
        <configuration>                  
            <propertyFile>src/main/resources/liquibase.properties</propertyFile>
        </configuration>                
    </plugin> 
</plugins>

6.2. 기존 데이터베이스에서 변경 로그 생성

플러그인을 사용하여 기존 데이터베이스에서 변경 로그를 생성할 수 있습니다.

mvn liquibase:generateChangeLog

다음은 liquibase 속성입니다.

url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
outputChangeLogFile=src/main/resources/liquibase-outputChangeLog.xml

최종 결과는 초기 DB 스키마를 생성하거나 데이터를 채우는 데 사용할 수 있는 changeLog 파일입니다.

다음과 같이 표시됩니다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog ...>
    
    <changeSet author="John (generated)" id="1439225004329-1">
        <createTable tableName="APP_USER">
            <column autoIncrement="true" name="id" type="BIGINT">
                <constraints primaryKey="true"/>
            </column>
            <column name="accessToken" type="VARCHAR(255)"/>
            <column name="needCaptcha" type="BIT(1)">
                <constraints nullable="false"/>
            </column>
            <column name="password" type="VARCHAR(255)"/>
            <column name="refreshToken" type="VARCHAR(255)"/>
            <column name="tokenExpiration" type="datetime"/>
            <column name="username" type="VARCHAR(255)">
                <constraints nullable="false"/>
            </column>
            <column name="preference_id" type="BIGINT"/>
            <column name="address" type="VARCHAR(255)"/>
        </createTable>
    </changeSet>
    ...
</databaseChangeLog>

6.3. 두 데이터베이스 간의 차이점에서 변경 로그 생성

플러그인을 사용하여 두 개의 기존 데이터베이스(예: 개발 및 프로덕션) 간의 차이점에서 changeLog 파일을 생성할 수 있습니다.

mvn liquibase:diff

속성은 다음과 같습니다.

changeLogFile=src/main/resources/liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=jdbc:h2:mem:oauth_reddit
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml
referenceDriver=org.h2.Driver
referenceUsername=sa
referencePassword=

다음은 생성된 changeLog 의 스니펫입니다 .

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog ...>
    <changeSet author="John" id="1439227853089-1">
        <dropColumn columnName="address" tableName="APP_USER"/>
    </changeSet>
</databaseChangeLog>

이것은 예를 들어 Hibernate가 개발을 위해 새로운 스키마를 자동 생성하도록 허용한 다음 이를 이전 스키마에 대한 참조 지점으로 사용하여 DB를 발전시키는 매우 강력한 방법입니다.

7. Liquibase Hibernate 플러그인 사용

우리 애플리케이션이 Hibernate를 사용하는 경우, 우리는 liquibase-hibernate 플러그인인 changeLog를 생성하는 매우 유용한 방법 살펴볼 입니다 .

7.1. 플러그인 구성

먼저 새 플러그인을 구성하고 올바른 의존성을 사용하도록 하겠습니다.

<plugins>
    <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>3.4.1</version>
        <configuration>                  
            <propertyFile>src/main/resources/liquibase.properties</propertyFile>
        </configuration> 
        <dependencies>
            <dependency>
                <groupId>org.liquibase.ext</groupId>
                <artifactId>liquibase-hibernate4</artifactId>
                <version>3.5</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.1.7.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
                <version>1.7.3.RELEASE</version>
            </dependency>
        </dependencies>               
    </plugin> 
</plugins>

7.2. 데이터베이스와 지속성 엔터티 간의 차이점에서 변경 로그 생성

이 플러그인을 사용 하여 기존 데이터베이스(예: 프로덕션)와 새로운 지속성 엔티티 간의 차이점에서 changeLog 파일을 생성할 수 있습니다.

따라서 간단하게 하기 위해 엔터티가 수정되면 이전 DB 스키마에 대해 변경 사항을 생성하여 프로덕션에서 스키마를 발전시키는 깨끗하고 강력한 방법을 얻을 수 있습니다.

다음은 liquibase 속성입니다.

changeLogFile=classpath:liquibase-changeLog.xml
url=jdbc:mysql://localhost:3306/oauth_reddit
username=tutorialuser
password=tutorialmy5ql
driver=com.mysql.jdbc.Driver
referenceUrl=hibernate:spring:org.baeldung.persistence.model
  ?dialect=org.hibernate.dialect.MySQLDialect
diffChangeLogFile=src/main/resources/liquibase-diff-changeLog.xml

referenceUrl 은 패키지 스캔을 사용하므로 dialect 매개 변수가 필요합니다.

8. JPA Buddy 플러그인을 사용하여 IntelliJ IDEA 에서 changeLog 생성

Hibernate가 아닌 ORM(예: EclipseLink 또는 OpenJPA)을 사용하거나 liquibase-hibernate 플러그인 과 같은 추가 의존성을 추가하고 싶지 않다면 JPA Buddy 를 사용할 수 있습니다 . 이 IntelliJ IDEA 플러그인은 Liquibase의 유용한 기능을 IDE에 통합합니다.

차등 변경 로그를 생성하려면 플러그인 을 설치한 다음 JPA 구조 패널에서 작업을 호출하기만 하면 됩니다. 어떤 소스(데이터베이스, JPA 엔터티 또는 Liquibase 스냅샷)와 어떤 대상(데이터베이스 또는 Liquibase 스냅샷)을 비교할 것인지 선택합니다.

JPA Buddy는 아래 애니메이션과 같이 changeLog 를 생성합니다 .

jpabuddy_intellij

liquibase-hibernate 플러그인 에 비해 JPA Buddy의 또 다른 장점은 Java와 데이터베이스 유형 간의 기본 매핑을 재정의하는 기능입니다. 또한 Hibernate 사용자 정의 유형 및 JPA 변환기에서 올바르게 작동합니다.

9. 결론

이 기사에서는 Liquibase를 사용 하고 Java 앱의 DB 스키마를 발전 및 리팩토링하는 안전하고 성숙한 방법에 도달하는 몇 가지 방법을 설명했습니다.

이러한 모든 예제와 코드 스니펫의 구현은 GitHub에서 사용할 수 있습니다 .

Persistence footer banner