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

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

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

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

 

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

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

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

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

 

๐Ÿ“– ์‹ค์Šต 3. ChangeLog ํŒŒ์ผ์„ ์ ์šฉํ•˜๊ณ  ๋กœ๊ทธ ํ™•์ธํ•˜๊ธฐ

์ด์ „ ์‹ค์Šต๋“ค์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— Liquibase ์„ค์ •๊ณผ ๋กœ์ปฌ DB์™€ ์—”ํ‹ฐํ‹ฐ ๊ฐ„์˜ ์Šคํ‚ค๋งˆ ์ฐจ์ด์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ChangeLog ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค. 

 

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

1. ChangeLog.xml ์ ์šฉํ•˜๊ธฐ

changelog.xml์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๋‹ค.

 

์ฒซ ๋ฒˆ์งธ๋Š” ํ„ฐ๋ฏธ๋„ ์ž…๋ ฅ์ด๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ์ง์ ‘ mvn ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์„œ update ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ์œ„์น˜์—์„œ mvn liquibase:update ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ๋ณด์ž.

 

์ด๋ฏธ์ง€์™€ ๊ฐ™์ด artifact ๋ชฉ๋ก ๋‚ด์šฉ์ด ์ž”๋œฉ ์ถœ๋ ฅ๋˜๊ณ , Build๊ฐ€ ์„ฑ๊ณตํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋‘ ๋ฒˆ์งธ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์ด๋‹ค. ํ”„๋กœ์ ํŠธ ์„ค์ • ํŒŒ์ผ(properties)์— ์„ค์ •๋œ change-master.xml ํŒŒ์ผ์„ ์ฝ์–ด ๋“ค์—ฌ์„œ include ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ changelog ํŒŒ์ผ์„ ์ ์šฉํ•œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ด์ „์— application.properties ํŒŒ์ผ์— spring.liquibase.change-log๋ฅผ ์„ค์ •ํ–ˆ์—ˆ๋‹ค.

ํ•ด๋‹น ํŒŒ์ผ์— ์žˆ๋Š” ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ถ”๊ฐ€๋œ ๋‚ด์—ญ์ด ์žˆ์œผ๋ฉด, update๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด์ž.

๋กœ๊ทธ ๋‚ด์šฉ ์ค‘ liquibase๋ฅผ ํ•„ํ„ฐ๋งํ•ด์„œ ์ฐพ์•„๋ณด๋ฉด changelog ํŒŒ์ผ์„ ์ฝ์€ ๋’ค, ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

2. ์ ์šฉ ํ™•์ธํ•˜๊ธฐ

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ํ™•์ธํ•˜์—ฌ ์˜๋„ํ•œ ๋Œ€๋กœ ํ…Œ์ด๋ธ”๊ณผ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€ ๋๋Š”์ง€์™€ ์ด๋ ฅ์ด ๋‚จ์•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณธ๋‹ค.

์˜ˆ์ƒ๋Œ€๋กœ ํ…Œ์ด๋ธ”์ด ์ž˜ ์ถ”๊ฐ€๋˜์—ˆ๊ณ , 3๊ฐœ์˜ ํ•„๋“œ์™€ ํฌ๊ธฐ(200), Unique, NotNull ๋“ฑ์˜ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์ž˜ ์ ์šฉ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

databasechangelog๋ผ๋Š” Liquibase์—์„œ ์ƒ์„ฑํ•œ ํ…Œ์ด๋ธ”์„ ํ™•์ธํ•˜๋ฉด ์ƒ๋‹จ ์ด๋ฏธ์ง€์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ ์ด๋ ฅ์ด ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ•ด๋‹น ํ…Œ์ด๋ธ” ๊ฐ ํ•„๋“œ์˜ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์—ด ์„ค๋ช…
ID changeset์˜ id
AUTHOR changeset์˜ author
FILENAME changeset ํŒŒ์ผ ๊ฒฝ๋กœ

changeLog
๊ฐ€ Liquibase ์— ์ „๋‹ฌ๋œ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ ๋˜๋Š” ์ƒ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.
๋…ผ๋ฆฌ์  ํŒŒ์ผ ๊ฒฝ๋กœ ์†์„ฑ์€ changelog ๋˜๋Š” ๊ฐœ๋ณ„ changeset์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
DATEEXECUTED ์‹คํ–‰๋œ ๋‚ ์งœ/์‹œ๊ฐ„.

๋กค๋ฐฑ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ORDEREXECUTED์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.
ORDEREXECUTED changeset์ด ์‹คํ–‰๋œ ์ˆœ์„œ.

์ˆœ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด DATEEXECUTED์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ’์€ ๊ฐœ๋ณ„ ์—…๋ฐ์ดํŠธ ์‹คํ–‰์—์„œ๋งŒ ์ฆ๊ฐ€๋ฅผ ๋ณด์žฅํ•˜๋ฉฐ,
0์—์„œ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
EXECTYPE changeset์ด ์‹คํ–‰๋œ ๋ฐฉ๋ฒ•.

์ข…๋ฅ˜๋Š” EXECUTED, FAILED, SKIPPEDRERAN, MARK_RAN ๋“ฑ์ด ์žˆ๋‹ค.
MD5SUM changelog์˜ checksum.

๊ฐ ์‹คํ–‰์—์„œ changelog ํŒŒ์ผ ์˜ changeset์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ณ€๊ฒฝ์ด ์—†๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
DESCRIPTION changeset์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ฐ„๋‹จํ•œ ์„ค๋ช…
COMMENTS changeset์˜ ์ฃผ์„
TAG tag์— ํ•ด๋‹นํ•˜๋Š” changeset์„ ์ถ”์ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
LIQUIBASE Liquibase ๋ฒ„์ „
CONTEXTS changeset์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปจํ…์ŠคํŠธ
LABELS changeset์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ ˆ์ด๋ธ”
DEPLOYMENT_ID ํ•จ๊ป˜ ๋ฐฐํฌ๋œ changeset์˜ ๋™์ผํ•œ ๊ณ ์œ  ์‹๋ณ„์ž

๋ณ€๊ฒฝ ๋กœ๊ทธ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์‹ค์ œ๋กœ ์‹คํ–‰๋œ ๊ฒƒ ์‚ฌ์ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Liquibase๋Š” databasechangelog ํ…Œ์ด๋ธ”์— ๊ฐ ๋ณ€๊ฒฝ ์ง‘ํ•ฉ ํ•ญ๋ชฉ๊ณผ ํ•จ๊ป˜ ์ฒดํฌ์„ฌ(checksum)์„ ์ €์žฅํ•œ๋‹ค.

 

๋งŒ์•ฝ changeset์ด ์‹คํ–‰๋œ ์ดํ›„ ์ˆ˜์ •๋œ ๊ฒฝ์šฐ(xml์„ ์ž„์˜๋กœ ์กฐ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ), Liquibase๊ฐ€ ์ค‘์ง€๋˜๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” REFERENCE์— ํฌ์ŠคํŒ…์„ ์ถ”๊ฐ€ํ•ด ๋†“์•˜์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

 

์ด๊ฒƒ์œผ๋กœ changelog ์ ์šฉํ•˜๊ธฐ ๋ฐ ๋กœ๊ทธ ์ด๋ ฅ ํ™•์ธํ•˜๊ธฐ๊ฐ€ ๋์ด ๋‚ฌ๋‹ค.


4ํŽธ์—์„œ๋Š” profile์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ํ™˜๊ฒฝ(dev, prod) ๋ณ„๋กœ liquibase๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

REFERENCE

https://docs.liquibase.com/tools-integrations/maven/commands/maven-update.html

 

Maven update

When successful, the update Maven goal produces the following output: [INFO] Scanning for projects... Downloading from plugins-release: https://artifactory.datical.net:80/artifactory/plugins-release/org/eclipse/m2e/lifecycle-mapping/1.0.0/lifecycle-mapping

docs.liquibase.com

https://docs.liquibase.com/concepts/tracking-tables/databasechangelog-table.html

 

DATABASECHANGELOG table

DATABASECHANGELOG table Liquibase uses the DATABASECHANGELOG table to track which changesets have been run. If the table does not exist in the database, Liquibase creates one automatically. Columns The table tracks each changeset as a row, identified by a

docs.liquibase.com

https://gettingstartedstage.liquibase.com/concepts/changelogs/changeset-checksums.html

 

Changeset Checksums

Changeset Checksums When Liquibase reaches a Changeset in your Changelog during execution, it computes a checksum and stores it in the MD5SUM column of the DATABASECHANGELOG table. This tells Liquibase if the changeset has been modified since it was run.

gettingstartedstage.liquibase.com

https://www.liquibase.com/blog/what-affects-changeset-checksums

 

All About Changeset Checksums

Checksums can help you add metadata to changesets that have already been run without problems and can catch errors early in your pipeline.

www.liquibase.com

๋Œ“๊ธ€