jun-labs / liquibase

πŸ”΅ Let's practice liquibase.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Liquibase




Liquibase is an open-source database-independent library for tracking,
managing and applying database schema changes.

Release Release






1. Getting Started

ν”„λ‘œμ νŠΈ μ‹€ν–‰ μ „ .yml νŒŒμΌμ„ μ„€μ •ν•΄μ£Όμ„Έμš”. 도컀 μ„€μ • νŒŒμΌμ€ docker 폴더 내뢀에 μžˆμŠ΅λ‹ˆλ‹€.

Java17 / Kotlin1.7 버전 μ΄μƒμ˜ JDKλ₯Ό μ„€μΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.




Run Application

$ ./gradlew bootRun




Run Test

$ ./gradlew test




Run Build

$ ./gradlew build







2. μŠ€ν‚€λ§ˆ 관리

μ μš©ν•œ μŠ€ν‚€λ§ˆ(schema) 관리 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. 각 개발 ν™˜κ²½(local, dev, prod) db.changelog.xml 생성
  2. 각 배포 λ²„μ „λ§ˆλ‹€ 폴더 및 .xml 생성
  3. μ΅œμ’… 반영 μŠ€ν‚€λ§ˆ 파일 생성





2-1. 각 개발 ν™˜κ²½ db.changelog.xml 생성

각 개발 ν™˜κ²½μ— λ§žλŠ” db.changelog.xml을 μƒμ„±ν•©λ‹ˆλ‹€. local, devμ—μ„œ μ•ˆμ •λœ νŒŒμΌμ„ prod에 μ μš©ν•˜λ©°, prodλŠ” λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μˆ˜λ™μœΌλ‘œ λ°˜μ˜ν•˜κΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ νŒŒμΌμ„ 생성할 ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.

image







2-2. 배포 버전 별 폴더 및 .xml 생성

배포 버전 별 폴더λ₯Ό μƒμ„±ν•˜κ³ , 이λ₯Ό 관리할 .xml νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€. .xml νŒŒμΌμ„ 톡해 ν•΄λ‹Ή λ²„μ „μ˜ μŠ€ν‚€λ§ˆ λ³€κ²½ 이λ ₯을 κ΄€λ¦¬ν•©λ‹ˆλ‹€.

image

즉, λͺ¨λ“  λ³€κ²½ 이λ ₯은 버전 별 .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>







2-3. μ΅œμ’… 반영 μŠ€ν‚€λ§ˆ 파일 생성

배포 ν™˜κ²½μ— μ μš©ν•  μ΅œμ’… μŠ€ν‚€λ§ˆ νŒŒμΌμ„ μƒμ„±ν•˜κ³ , λ³€κ²½λœ λ‚΄μš©μ„ λ°˜μ˜ν•©λ‹ˆλ‹€.

image

image







3. μŠ€ν‚€λ§ˆ λ³€κ²½λ‚΄μ—­

μŠ€ν‚€λ§ˆ λ³€κ²½ 내역을 μ—”ν‹°ν‹°λ‘œ λ§Œλ“€λ©΄, λ³€κ²½ 이λ ₯을 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
)







4. 주의 사항

prod ν™˜κ²½μ„ μžλ™ν™”μ— μ˜μ‘΄ν•˜λ©΄ λ¬Έμ œκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— 가급적 local, devμ—μ„œ μ‚¬μš©ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. λ˜ν•œ, LiquibaseλŠ” Tagλ‚˜ RollbackCountλ₯Ό 톡해 νŠΉμ • μ§€μ μœΌλ‘œ Rollbackν•  수 μžˆλŠ”λ°, μ΄λŠ” μ–΄λ–€ λΆ€μž‘μš©μ„ μΌμœΌν‚¬μ§€ μ•Œ 수 μ—†μœΌλ―€λ‘œ, μ‹ μ€‘νžˆ μ μš©ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

  1. prod ν™˜κ²½μ—λŠ” 가급적 μ μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  2. Rollback은 μ‹ μ€‘νžˆ μ μš©ν•œλ‹€.

About

πŸ”΅ Let's practice liquibase.


Languages

Language:Kotlin 100.0%