소스 형상 관리는 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)
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
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) |
'개발(합니다) > 방법론' 카테고리의 다른 글
[git] git flow 사용법(+인텔리제이 설정) (0) | 2021.05.16 |
---|---|
[버전관리] Semantic Versioning(시맨틱 버전관리)와 Version Ranges (0) | 2021.05.11 |
JPA 사용 시 주의 사항 (0) | 2019.01.29 |
java와 javascript 정규 표현식 주의점 및 사용법 (0) | 2019.01.23 |
TDD 학습 및 실습 정리9(예제연습) (0) | 2018.12.28 |