Liquibase is an open-source database-independent library for tracking,
managing and applying database schema changes.
ํ๋ก์ ํธ ์คํ ์ .yml ํ์ผ์ ์ค์ ํด์ฃผ์ธ์. ๋์ปค ์ค์ ํ์ผ์ docker ํด๋ ๋ด๋ถ์ ์์ต๋๋ค.
Java17 / Kotlin1.7 ๋ฒ์ ์ด์์ JDK๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
$ ./gradlew bootRun
$ ./gradlew test
$ ./gradlew build
์ ์ฉํ ์คํค๋ง(schema) ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ(local, dev, prod) db.changelog.xml ์์ฑ
- ๊ฐ ๋ฐฐํฌ ๋ฒ์ ๋ง๋ค ํด๋ ๋ฐ .xml ์์ฑ
- ์ต์ข ๋ฐ์ ์คํค๋ง ํ์ผ ์์ฑ
๊ฐ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ง๋ db.changelog.xml์ ์์ฑํฉ๋๋ค. local, dev์์ ์์ ๋ ํ์ผ์ prod์ ์ ์ฉํ๋ฉฐ, prod๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์๋์ผ๋ก ๋ฐ์
ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ์ผ์ ์์ฑํ ํ์๋
์์ต๋๋ค.
๋ฐฐํฌ ๋ฒ์ ๋ณ ํด๋๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๊ด๋ฆฌํ .xml ํ์ผ์ ์์ฑํฉ๋๋ค. .xml ํ์ผ์ ํตํด ํด๋น ๋ฒ์ ์ ์คํค๋ง ๋ณ๊ฒฝ ์ด๋ ฅ์ ๊ด๋ฆฌ
ํฉ๋๋ค.
์ฆ, ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ฒ์ ๋ณ .xml ํ์ผ์ ํตํด ์ถ์ /๊ด๋ฆฌ ๋๋ ๊ฒ์ ๋๋ค.
๋ณ๊ฒฝํ ์คํค๋ง๋ .sql ํํ๋ก ํด๋ ๋ด์ ๊ด๋ฆฌ
ํ๋ฉฐ, ์ด๋ .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.1.xsd">
<changeSet id="v1.0.0/datachangelog/table-create" author="jun" context="dev">
<comment>๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๊ด๋ฆฌ ํ
์ด๋ธ ์์ฑ</comment>
<sqlFile path="databasechangelog.sql" relativeToChangelogFile="true"/>
</changeSet>
<changeSet id="v1.0.0/user/table-create" author="jun" context="dev">
<comment>์ฌ์ฉ์ ํ
์ด๋ธ ์์ฑ</comment>
<sqlFile path="user-table-create.sql" relativeToChangelogFile="true"/>
</changeSet>
<changeSet id="v1.0.0/user/column-add/last-modified-at" author="jun" context="dev">
<sqlFile path="add-last-modified-at.sql" relativeToChangelogFile="true"/>
</changeSet>
<changeSet id="v1.0.0/user/column-delete/last-modified-at" author="jun" context="dev">
<sqlFile path="delete-last-modified-at.sql" relativeToChangelogFile="true"/>
</changeSet>
</databaseChangeLog>
๋ฐฐํฌ ํ๊ฒฝ์ ์ ์ฉํ ์ต์ข
์คํค๋ง ํ์ผ์ ์์ฑ
ํ๊ณ , ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ฐ์
ํฉ๋๋ค.
์คํค๋ง ๋ณ๊ฒฝ ๋ด์ญ์ ์ํฐํฐ๋ก ๋ง๋ค๋ฉด, ๋ณ๊ฒฝ ์ด๋ ฅ์ UI๋ก ์ ๊ณตํ ์ ์์ต๋๋ค.
@Entity(name = "databasechangelog")
@Table(name = "databasechangelog")
data class DatabaseChangelog(
@Id
@Column(name = "ID", length = 255, nullable = false)
var id: String,
@Column(name = "AUTHOR", length = 255, nullable = false)
var author: String,
@Column(name = "FILENAME", length = 255, nullable = false)
var fileName: String,
@Column(name = "DATEEXECUTED", nullable = false)
var dateExecuted: LocalDateTime,
@Column(name = "ORDEREXECUTED", nullable = false)
var orderExecuted: Int,
@Column(name = "EXECTYPE", length = 10, nullable = false)
var execType: String,
@Column(name = "MD5SUM", length = 35)
var md5Sum: String? = null,
@Column(name = "DESCRIPTION", length = 255)
var description: String? = null,
@Column(name = "COMMENTS", length = 255)
var comments: String? = null,
@Column(name = "TAG", length = 255)
var tag: String? = null,
@Column(name = "LIQUIBASE", length = 20)
var liquibase: String? = null,
@Column(name = "CONTEXTS", length = 255)
var contexts: String? = null,
@Column(name = "LABELS", length = 255)
var labels: String? = null,
@Column(name = "DEPLOYMENT_ID", length = 10)
var deploymentId: String? = null
)
prod ํ๊ฒฝ์ ์๋ํ์ ์์กดํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๊ธ์ local, dev์์ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค. ๋ํ, Liquibase๋ Tag๋ RollbackCount๋ฅผ ํตํด ํน์ ์ง์ ์ผ๋ก Rollbackํ ์ ์๋๋ฐ, ์ด๋ ์ด๋ค ๋ถ์์ฉ์ ์ผ์ผํฌ์ง ์ ์ ์์ผ๋ฏ๋ก, ์ ์คํ ์ ์ฉํ๋๋ก ํฉ๋๋ค.
- prod ํ๊ฒฝ์๋ ๊ฐ๊ธ์ ์ ์ฉํ์ง ์๋๋ค.
- Rollback์ ์ ์คํ ์ ์ฉํ๋ค.