๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Spring

Spring Boot 3 + JPA๋ฅผ ํ™œ์šฉํ•œ Liquibase ์‹ค์Šตํ•˜๊ธฐ (4, final)

by ํ‘์‹œ๋ฐ” 2023. 6. 6.

๐Ÿ“– ์‹ค์Šต ๋‚ด์šฉ

 

1. Spring Boot 3 + Spring Data JPA ํ™˜๊ฒฝ์—์„œ Liquibase ํ™˜๊ฒฝ์„ ์„ค์ •ํ•œ๋‹ค.

2. Entity ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ ๋’ค, ๋กœ์ปฌ DB์™€ ์Šคํ‚ค๋งˆ ์ฐจ์ด์— ๋Œ€ํ•œ ChangeLog ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. (diff)

3. Liquibase๋ฅผ ํ†ตํ•ด ChangeLog ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ์šฉํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•œ๋‹ค.

4. profile ์„ค์ •์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋ณ„๋กœ ์ ์šฉํ•œ๋‹ค.

 

๐Ÿ“– ์‹ค์Šต 4. profile ์„ค์ •์„ ํ†ตํ•ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋ณ„๋กœ ์ ์šฉํ•ด๋ณด๊ธฐ

์ด์ „ ์‹ค์Šต์„ ํ†ตํ•ด changeLog ํŒŒ์ผ์„ ์ ์šฉํ•˜๊ณ  DB์— ๊ด€๋ จ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. 

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” Profile(dev, prod) ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •์„ ์ ์šฉํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ™•์ธํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

 

`dev ํ™˜๊ฒฝ`์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ > ๊ฐœ๋ฐœ DB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋„๋ก ์„ค์ •ํ•˜๊ณ ,

`prod ํ™˜๊ฒฝ`์—์„œ๋Š” ๊ฐœ๋ฐœDB > ์šด์˜ DB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

1. pom.xml ์„ค์ •ํ•˜๊ธฐ

pom.xml์—์„œ profile์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ • ํŒŒ์ผ์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. pom.xml ํŒŒ์ผ์— ํ•˜๋‹จ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

dev์˜ ๊ฒฝ์šฐ๋Š” ์—”ํ‹ฐํ‹ฐ์—์„œ DB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๊ณผ์ •์ด๋ฏ€๋กœ ๊ด€๋ จํ•œ ์˜์กด์„ฑ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ๊ณ , prod๋Š” DB ๊ฐ„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ฏ€๋กœ ๋ณ„๋„์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

    <profiles>
        <profile>
            <id>dev</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-maven-plugin</artifactId>
                        <configuration>
                            <diffChangeLogFile>src/main/resources/db/changelog/diff/dev/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
                            <verbose>true</verbose>
                            <propertyFile>src/main/resources/liquibase-dev.properties</propertyFile>
                        </configuration>
                        <dependencies>
                            <dependency>
                                <groupId>org.liquibase.ext</groupId>
                                <artifactId>liquibase-hibernate6</artifactId>
                                <version>4.20.0</version>
                            </dependency>
                            <dependency>
                                <groupId>org.springframework.boot</groupId>
                                <artifactId>spring-boot-starter-data-jpa</artifactId>
                                <version>3.0.6</version>
                            </dependency>
                        </dependencies>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>prod</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-maven-plugin</artifactId>
                        <configuration>
                            <diffChangeLogFile>src/main/resources/db/changelog/diff/prod/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
                            <verbose>true</verbose>
                            <propertyFile>src/main/resources/liquibase-prod.properties</propertyFile>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

 

ํ•ด๋‹น ์„ค์ •์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ <diffChangeLogFile> ๊ฒฝ๋กœ์™€ <propertyFile> ๊ฒฝ๋กœ์ด๋‹ค.

changeLog  ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š” ์œ„์น˜์™€ ์„ค์ • ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์ด๋ฏ€๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ด์ค€๋‹ค.

2. properties ์„ค์ • ํŒŒ์ผ ์ž‘์„ฑํ•˜๊ธฐ

dev, prod ํ™˜๊ฒฝ๋งˆ๋‹ค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅด๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

liquibase-dev.properties

contexts=dev
logLevel=info
changeLogFile=src/main/resources/db/changelog/db.changelog-master.xml

referenceUrl=hibernate:spring:com.shibaholic.blogliquibase.model?dialect=org.hibernate.dialect.MariaDBDialect

url=jdbc:mariadb://localhost:3306/shibaholic
username=
password=
driver=org.mariadb.jdbc.Driver

liquibase-prod.properties

contexts=prod
logLevel=info
changeLogFile=src/main/resources/db/changelog/db.changelog-master.xml

referenceUrl=jdbc:mariadb://localhost:3306/shibaholic
referenceUsername=
referencePassword=
referenceDriver=org.mariadb.jdbc.Driver

url=jdbc:mariadb://localhost:3306/shibaholic2
username=
password=
driver=org.mariadb.jdbc.Driver

 

์œ„์— ์ž‘์„ฑ๋œ ์„ค์ •ํŒŒ์ผ์„ ๋ณด๊ณ  reference ์ ‘๋‘๊ฐ€์‚ฌ ๋ถ™์€ ์„ค์ •๊ณผ ์ผ๋ฐ˜ ์„ค์ •์€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฑด์ง€ ๊ถ๊ธˆํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์ผ๋ฐ˜ ์„ค์ •(url, username, password, driver)์ด ๊ธฐ์ค€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. DB ์ฐจ์ด ์ •๋ณด(changeLog)๋ฅผ ์ถœ๋ ฅํ•˜๋Š” diff ๋ช…๋ น์„ ์˜ˆ์‹œ๋กœ ๋“ ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

diff = ์ผ๋ฐ˜ ์„ค์ •์„ ๊ธฐ์ค€์œผ๋กœ reference ์„ค์ •๋œ DB(ํ˜น์€ ์—”ํ‹ฐํ‹ฐ)์™€ ๋น„๊ตํ•ด์„œ ์—†๋Š” ๋‚ด์šฉ(์Šคํ‚ค๋งˆ, ์ œ์•ฝ ๋“ฑ)์„ ์ถ”์ถœํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ผ๋ฐ˜ ์„ค์ •์— dev ์—์„œ๋Š” ๊ฐœ๋ฐœ DB ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ–ˆ๊ณ , prod ์—์„œ๋Š” ์šด์˜ DB ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค.

3. db.changelog-master.xml ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

master ์„ค์ • ํŒŒ์ผ์€ ํ™˜๊ฒฝ๋งˆ๋‹ค ๋ณ„๋„์˜ ๋งˆ์Šคํ„ฐ ํŒŒ์ผ์„ ๋‘๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ context๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ํ•„์ž๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ํ™˜๊ฒฝ๋ณ„๋กœ context๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

(2๋ฒˆ์—์„œ ์„ค์ •ํŒŒ์ผ์„ ์‚ดํŽด๋ณด๋ฉด ๊ฐ ์„ค์ • ํŒŒ์ผ์— contexts= dev, prod๊ฐ€ ์ž‘์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

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

    <includeAll path="/db/changelog/diff/dev/" context="dev"></includeAll>
    <includeAll path="/db/changelog/diff/prod/" context="prod"></includeAll>

</databaseChangeLog>

 

context๋Š” ์–ด๋–ค changeset์„ ์‹คํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹ํ‘œํ˜„์‹์ด๋‹ค.

4. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๊ธฐ

ํ™˜๊ฒฝ๋ณ„๋กœ ์„ค์ •์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด ์•„๋ž˜ 4๊ฐœ์˜ ๋ช…๋ น์–ด๋ฅผ ์ฐจ๋ก€๋กœ ์ž…๋ ฅํ•ด๋ณธ๋‹ค.

update ๋ช…๋ น์–ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ์‹คํ–‰ํ•ด์„œ ํ…Œ์ŠคํŠธํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค. (profile ์„ค์ • ํ•„์ˆ˜)

 

1. mvn compile liquibase:diff -Pdev 

2. mvn compile liquibase:update -Pdev

3. mvn compile liquibase:diff -Pprod

4. mvn compile liquibase:update -Pprod

 

1,2๋Š” ์—”ํ‹ฐํ‹ฐ์—์„œ ๊ฐœ๋ฐœ DB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๊ณผ์ •์ด๋ฉฐ,

3,4๋Š” ๊ฐœ๋ฐœ DB์—์„œ ์šด์˜ DB๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•ด์„œ ํ™•์ธํ•ด๋ณด๋ฉด dev์™€ prod ํ™˜๊ฒฝ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜์—ˆ๊ณ  ์ œ์•ฝ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๊ฒƒ์œผ๋กœ liquibase ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹ค์Šต ๊ณผ์ •์„ ๋งˆ๋ฌด๋ฆฌ ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ์— ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•ด๋ณด๋ฉด ์ข‹๊ฒ ๋‹ค.

 

REFERENCE

https://github.com/tsk902000/LiquibaseSpringboot

๋Œ“๊ธ€