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μ μ μ€ν μ μ©νλ€.