Post

Flyway

Flyway

๐Ÿ“Œ Flyway๋ž€?

Flyway ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜•์ƒ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ถ”์  ๋ฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. Git์ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ€์žฅ ํฐ ์žฅ์ ์€ SQL๋งˆ์ € ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜ํ•œ flyway_schema_history ํ…Œ์ด๋ธ”์—์„œ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ๋ฌธ์ œ ์ถ”์  ๋˜ํ•œ ์‰ฌ์›Œ์ง„๋‹ค. ๋‹ค๋งŒ ์ž‘์„ฑํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์€ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋กค๋ฐฑ์ด ์ œํ•œ์ ์ด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๐Ÿ“Œ ์„ค์ •

๋จผ์ € flyway ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

1
2
3
4
5
6
dependencies {
    implementation 'org.flywaydb:flyway-core'

    // ์‚ฌ์šฉํ•˜๋Š” DB์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ์˜์กด์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ.
    implementation 'org.flywaydb:flyway-mysql'
}

application.yml ์—์„œ flyway ๊ด€๋ จ ์†์„ฑ์„ ์„ค์ •ํ•œ๋‹ค. ์ฃผ์š” ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/my_database?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8
    username: your_username
    password: your_password

  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true

  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: true
    properties:
      hibernate:
        format_sql: true

enabled: flyway ํ™œ์„ฑํ™” ์—ฌ๋ถ€๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ true ์ด๋‹ค.

location: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ classpath:db/migration ์ด๋‹ค.

baseline-on-migrate: ์ด ์˜ต์…˜์„ true ๋กœ ์„ค์ •ํ•˜๋ฉด ์‹คํ–‰ ์‹œ flyway_schema_history ํ…Œ์ด๋ธ”์ด ์—†์œผ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

flyway๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ JPA์˜ ddl-auto ์˜ต์…˜์„ validate ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํ‚ค๋งˆ์™€ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ flyway_schema_history

flyway_schema_history ํ…Œ์ด๋ธ”์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ถ”์  ๋ฐ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์ด๋‹ค. ์ด ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด flyway๊ฐ€ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€๋Š” ๋‚˜์ค‘์— ์‚ดํŽด๋ณด๊ณ , ํ…Œ์ด๋ธ”์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž. ์ฃผ์š” ์ปฌ๋Ÿผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

installed_rank: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์ ์šฉ๋œ ์ˆœ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๊ฐ’์ด๋‹ค.

version: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์˜ ๋ฒ„์ „ ๋ฒˆํ˜ธ์ด๋‹ค. ์ด ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

checksum: ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์˜ ํ•ด์‹œ ๊ฐ’์ด๋‹ค. ์ด ๊ฐ’์„ ํ†ตํ•ด ์ด๋ฏธ ์ ์šฉ๋œ ํŒŒ์ผ์ด ์ดํ›„์— ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค.

๐Ÿ“Œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ

flyway๋Š” ์„ค์ •๋œ ๊ฒฝ๋กœ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์Šค์บ”ํ•œ๋‹ค. ๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ํŒŒ์ผ์ด ์ ์šฉ๋  ๋•Œ๋งˆ๋‹ค flyway_schema_history ํ…Œ์ด๋ธ”์ด ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

image.png

ํŒŒ์ผ๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค. <Prefix><Version>__<Description>.sql

Prefix๊ฐ€ V ๋ผ๋ฉด ํŠน์ • ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ, U ๋ผ๋ฉด ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ, R ์ด๋ผ๋ฉด ๋ฒ„์ „๊ณผ ์ƒ๊ด€์—†์ด ๋งค๋ฒˆ ์‹คํ–‰๋˜๋Š” ํŒŒ์ผ์ž„์„ ์˜๋ฏธํ•œ๋‹ค.

Version์€ V์™€ U์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ˆซ์ž, ์ , ์–ธ๋”๋ฐ” ๋“ฑ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ƒˆ๋กœ ์ž‘์„ฑ๋œ ํŒŒ์ผ์€ ํ•ญ์ƒ ์ด์ „๋ณด๋‹ค ๋†’์€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Description์€ ํ•ด๋‹น ํŒŒ์ผ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

๐Ÿ“Œ ๋™์ž‘ ์›๋ฆฌ

flyway๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋˜๋ฉด ๋จผ์ € flyway_schema_history ํ…Œ์ด๋ธ”์„ ์ฐพ๋Š”๋‹ค. ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ž๋™์œผ๋กœ ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•œ๋‹ค. ์ดํ›„ ์„ค์ •๋œ ๊ฒฝ๋กœ์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ฐพ๋Š”๋‹ค. ํŒŒ์ผ์„ ๋ชจ๋‘ ์ฐพ์œผ๋ฉด flyway_schema_history ํ…Œ์ด๋ธ”์„ ์ฐธ๊ณ ํ•˜์—ฌ ์•„์ง ์ ์šฉ๋˜์ง€ ์•Š์€(์ƒˆ๋กœ์šด ๋ฒ„์ „์˜) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ฐพ์•„ ๋ถ„๋ฅ˜ํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ƒˆ๋กœ์šด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ๋ฒ„์ „ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฉด flyway_schema_history ์— ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋‚ด์—ญ์„ ๊ธฐ๋กํ•œ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํŒŒ์ผ์„ ์ฐพ์€ ํ›„ checksum ์„ ํ†ตํ•ด ํŒŒ์ผ ๋ณ€๊ฒฝ ์—ฌ๋ถ€ ๋˜ํ•œ ํ™•์ธํ•œ๋‹ค. ๋งŒ์•ฝ ์ฒดํฌ์„ฌ ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๐Ÿ“Œ ์ฐธ๊ณ 

https://ywoosang.tistory.com/18

https://velog.io/@suhongkim98/flyway%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8A%A4%ED%82%A4%EB%A7%88-%ED%98%95%EC%83%81%EA%B4%80%EB%A6%AC-%ED%95%98%EA%B8%B0

https://russell-seo.tistory.com/5

https://leeeeeyeon-dev.tistory.com/12

This post is licensed under CC BY 4.0 by the author.