본문 바로가기

개발(합니다)/방법론

DB 버전를 관리 코드로 하는 방법 - LIQUIBASE

반응형

소스 형상 관리는 git이나 svn으로 하고 ppt나 보고서도 버전을 관리를 합니다.

DB에 대한 형상관리를 하는 방법이 없는지 고민하다가 프로젝트를 하면서 접하게 된 LIQUIBASE입니다.

 

 

리퀴베이스는 DB 스키마 변경을 버전별로 관리 할 수 있는 oepn source 입니다.

- 주의 사항 -
리퀴베이스를 적용한 프로젝트의 데이터베이스 스키마를 직접 수정하는 일은 절대 없어야 합니다.

 

특징

  • 데이터베이스 변경 문서 생성
  • 기존 데이터베이스에서 시작할 수 있는 change log 생성 기능
  • 데이터베이스끼리 비교 기능
  • 데이터베이스에 반영한 update를 rollback 기능
  • 자동 업데이트 또는 DBA가 직접 적용할 수 있는 sql 스크립트 생성
  • 안전한 클러스터 데이터베이스 업데이트
  • 운영 데이터와 다양한 테스트 데이터셋 관리
  • 여러 데이터베이스 지원
  • 코드 브런치 가능
  • 변경 사항 병합 기능
  • 스키마 확장성

기본 사용 방법

docs.liquibase.com/workflows/database-setup-tutorials/postgresql.html 에서 기본적은 형식을 확인할 수 있습니다.

 

1. www.liquibase.org/download 다운로드( docker hub.docker.com/r/liquibase/liquibase)

 

Download Liquibase Open Source | Liquibase

Download Liquibase open source. Choose from the latest versions, including Beta files, installer files and other options for running Liquibase.

www.liquibase.org

2. 원하는 폴더에 liliquibase.properties 를 생성(command line에서 옵션을 넣어 할 수 있지만 파일로 하는게 편합니다.)

  • 연결하고자 하는 Driver(postgresql-42.2.18.jar)를 준비합니다.
  • driver와 classpath를 경로에 맞춰줍니다.
  • liquibase가 읽어 들일 liquibase 기반 마스터 파일(db.changelog-master.xml)을 경로에 맞춰줍니다.
#liquibase.properties
changeLogFile: db.changelog-master.xml
driver: org.postgresql.Driver
classpath: postgresql-42.2.18.jar
url: jdbc:postgresql://localhost:5432/test
username: postgres
password: 1234

3. 기본적으로 필요한 파일과 경로입니다.

4. 연결하고자 하는 DB의 스키마를 생성해줍니다. (예시의 경우 test)

5. db.changelog-master.xml를 열어 xml 작성합니다.

  • 변경 된 사항을 관리하는 마스터 xml입니다.
<?xml version="1.0" encoding="UTF-8"?>   
<databaseChangeLog  
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">  

  <include  file="db.changelog-1.0.xml"/>   
  <!-- <include  file="com/example/db/changelog/db.changelog-1.1.xml"/>   
  <include  file="com/example/db/changelog/db.changelog-2.0.xml"/>    -->
</databaseChangeLog> 

6. db.changelog-1.0.xml을 열어 xml을 작성합니다.

  • 버전별로 관리하기 위해 이후에는 버전이 붙습니다.
<?xml version="1.0" encoding="UTF-8"?>   
<databaseChangeLog   
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"   
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                      http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">   
  <changeSet  author="authorName"  id="changelog-1.0">  
    <createTable  tableName="TablesAndTables">  
      <column  name="COLUMN1"  type="TEXT">  
        <constraints  nullable="true"  primaryKey="false"  unique="false"/>  
      </column>  
    </createTable>  
  </changeSet>  
</databaseChangeLog> 

7. cmd창에서 "liquibase update"를 입력합니다.

8. DB에서 확인하면 "TablesAndTables" 테이블이 생성된걸 확인할 수 있습니다.

  • 자세히 보면 ttttt 라는 테이블이 있는데 이미 만들어두었던 테이블로 liquibase를 적용해도 기존 테이블에는 영향을 미치지 않습니다.

 

 

9. databasechangeloglock 테이블은 liquibase에 문제가 생기면 락을 거는 테이블입니다.

10. databasechangelog 테이블은 적용된 changelog를 기록합니다.


Spring boot에서 liquibase 적용 방법

환경 설정은 아래 사이트에서 확인할 수 있습니다.

docs.liquibase.com/tools-integrations/springboot/springboot.html

 

Using Liquibase with Spring Boot

Using Liquibase with Spring Boot The purpose of this tutorial is to guide you through the process of using Liquibase as part of your Spring Boot workflow. Spring Boot makes it easy to create standalone, production grade Spring-based Applications that just

docs.liquibase.com

 

1. pom 등록

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

2. database change log 등록

<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>

3. Spring bean에 liquibase 등록

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

4. changelog-master 등록 

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

5. Spring boot에서 liquibase 사용 여부 

spring.liquibase.enabled=false

Spring boot 1.x 에서는 아래 설정 방법

liquibase.enabled=false

liquibase data type

Data types mapping in Liquibase 3.6.x

Liquibase data type SQL Server data type Oracle data type MySQL PostgreSQL
bigint bigint number(38,0) bigint bigint/bigserial
blob varbinary(max) blob blob oid
boolean bit number(1) bit bit
char char char char character
clob nvarchar(max) clob longtext text
currency money number(15,2) decimal decimal
datetime datetime timestamp timestamp timestamp
date date date date date
decimal decimal decimal decimal decimal 
double float float(24) double double precision
float float float float float
int int integer int integer/serial
mediumint int mediumint mediumint mediumint
nchar nchar nchar nchar nchar
nvarchar nvarchar nvarchar2 nvarchar varchar
number numeric number numeric numeric
smallint smallint number(5) smallint smallint/smallserial
time time date time time
timestamp datetime timestamp timestamp timestamp
tinyint tinyint number(3) tinyint smallint
uuid uniqueidentifier raw(16) char(36) uuid
varchar varchar varchar2  varchar varchar/character (varying)
반응형