Flyway - ? (PostgreSQL)

NuJeyΒ·2025λ…„ 7μ›” 7일

🐣 상황

MSA ν™˜κ²½μ—μ„œ μ—¬λŸ¬ DB ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³ , κ³΅μœ ν•˜κ³ , μˆ˜μ •ν•˜κ³ , 버전 관리λ₯Ό ν•˜λ‹€ 보면 이런 상황이 λ°œμƒν•œλ‹€.

  • "이 ν…Œμ΄λΈ” ν•„λ“œ μΆ”κ°€ν•œκ±° DB에 λ°˜μ˜ν–ˆμ–΄?"
  • "μ–΄μ œ λ‘œμ»¬μ—μ„œ 되던거 dev μ„œλ²„μ—μ„  μ™œ 였λ₯˜λ‚˜μ§€?"
  • "운영 DBμ—μ„œ column λΉ μ Έμ„œ μž₯μ•  났어..."

πŸ‘‰ DDL, DML λͺ¨λ‘ μ½”λ“œμ²˜λŸΌ 관리할 μˆ˜λŠ” μ—†μ„κΉŒ?

✨ Flywayλž€?

DB μŠ€ν‚€λ§ˆ 및 초기 데이터λ₯Ό λ²„μ „λ³„λ‘œ κ΄€λ¦¬ν•΄μ£ΌλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬ

Spring Bootμ™€λŠ” 거의 μžλ™ ν†΅ν•©λ˜μ–΄ 있으며, src/main/resources/db/migration 디렉터리 μ•„λž˜ SQL νŒŒμΌμ„ λ„£μœΌλ©΄ μžλ™ μ‹€ν–‰λœλ‹€.

πŸ“¦ μ™œ Flywayλ₯Ό 써야 ν• κΉŒ?

βœ… 1. DB도 "버전 관리"κ°€ ν•„μš”ν•˜λ‹€

  • Git으둜 μ½”λ“œ νžˆμŠ€ν† λ¦¬λ₯Ό κ΄€λ¦¬ν•˜λ“―,
  • DB도 λ²„μ „λ³„λ‘œ 관리해야 ν˜‘μ—…κ³Ό 배포가 μ•ˆμ •μ μ΄λ‹€.

βœ… 2. ν™˜κ²½ κ°„ μŠ€ν‚€λ§ˆ 뢈일치 λ°©μ§€

  • local, dev, staging, prod λ“± ν™˜κ²½μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ μŠ€ν‚€λ§ˆ 싱크가 κΉ¨μ§„λ‹€
  • FlywayλŠ” μ‹€ν–‰λœ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 기둝(flyway_schema_history)을 μ €μž₯ν•΄μ„œ 쀑볡 싀행을 λ°©μ§€ν•˜κ³  λ™μΌν•œ DB μƒνƒœλ₯Ό 보μž₯

βœ… 3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ μžλ™ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

  • Spring Boot 앱이 싀행될 λ•Œ Flywayκ°€ DB μƒνƒœλ₯Ό κ²€μ‚¬ν•˜κ³ , ν•„μš”ν•œ SQL만 μžλ™ μ‹€ν–‰
  • 운영 배포 μ‹œμ—λ„ INSERT, ALTERκ°€ μ½”λ“œ 배포와 ν•¨κ»˜ μžλ™ 처리됨

βœ… 4. SQL 기반이라 λͺ…μ‹œμ μ΄κ³  검증 κ°€λŠ₯

  • JPA ddl-autoλŠ” λ™μ μœΌλ‘œ ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  μˆ˜μ •ν•˜μ§€λ§Œ, λͺ…μ‹œμ μ΄μ§€ μ•ŠμŒ
  • FlywayλŠ” 정적인 SQL둜 DB λ³€κ²½ 내역이 λͺ…ν™•ν•˜κ²Œ λ‚¨μŒ
  • 리뷰 κ°€λŠ₯ / rollback κ°€λŠ₯ / 기둝 κ°€λŠ₯

βœ… 5. 운영 쀑에도 μ•ˆμ •μ μΈ DB ꡬ쑰 μ§„ν™”

  • 운영 DB에 ν…Œμ΄λΈ”μ„ μ‚­μ œν•˜κ±°λ‚˜ μ»¬λŸΌμ„ μˆ˜μ •ν•  λ•Œ
  • Flyway둜 점진적 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ κ°€λŠ₯ν•˜λ‹€

πŸ“„ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 기둝 μ €μž₯ μœ„μΉ˜: flyway_schema_history

FlywayλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜λ©΄, ν•΄λ‹Ή 정보λ₯Ό DB λ‚΄λΆ€ ν…Œμ΄λΈ”μ— 기둝으둜 λ‚¨κΉλ‹ˆλ‹€.

  • flyway_schema_history

이 ν…Œμ΄λΈ”μ€ Flywayκ°€ μ–΄λ–€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μ–Έμ œ μ‹€ν–‰ν–ˆλŠ”μ§€ μΆ”μ ν•˜κΈ° μœ„ν•΄ μžλ™μœΌλ‘œ μƒμ„±λ˜λ©°, μ£Όμš” μ»¬λŸΌμ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

컬럼λͺ…μ„€λͺ…
installed_rankμ‹€ν–‰ μˆœμ„œ
versionλ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 버전 (V1, V2, …)
description__ 뒀에 μžˆλŠ” μ„€λͺ… (create_artist_table λ“±)
scriptμ‹€ν–‰λœ 파일λͺ… (V1__create_artist_table.sql)
installed_onμ‹€ν–‰λœ λ‚ μ§œ/μ‹œκ°„
success성곡 μ—¬λΆ€ (true / false)

βœ… μ˜ˆμ‹œ

SELECT * FROM flyway_schema_history;

πŸ“Œ Flyway λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일λͺ… κ·œμΉ™ (V1__ λͺ…λͺ…법)

FlywayλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 파일 이름을 톡해 버전 관리와 μ‹€ν–‰ μˆœμ„œλ₯Ό μžλ™μœΌλ‘œ νŒλ‹¨ν•©λ‹ˆλ‹€. 파일λͺ…은 λ°˜λ“œμ‹œ μ•„λž˜μ™€ 같은 κ·œμΉ™μ„ 따라야 ν•©λ‹ˆλ‹€

βœ… μ˜ˆμ‹œ

파일λͺ…μ˜λ―Έ
V1__create_artist_table.sql버전 1, μ•„ν‹°μŠ€νŠΈ ν…Œμ΄λΈ” 생성
V2__insert_admin_account.sql버전 2, μ–΄λ“œλ―Ό 계정 μ‚½μž…
V3__add_column_to_album.sql버전 3, 앨범 ν…Œμ΄λΈ”μ— 컬럼 μΆ”κ°€

βœ… κ·œμΉ™ μš”μ•½

  • V β†’ λ°˜λ“œμ‹œ λŒ€λ¬Έμž V둜 μ‹œμž‘
  • {λ²„μ „λ²ˆν˜Έ} β†’ μ •μˆ˜ (1, 2, 3, …) λ˜λŠ” 점(.) 포함 κ°€λŠ₯ (1.1, 2.5)
  • __ β†’ μ–Έλ”μŠ€μ½”μ–΄ 2개 (__)κ°€ κΌ­ ν•„μš”ν•¨
  • {μ„€λͺ…} β†’ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ λ‚΄μš© μš”μ•½ (λ‹¨μ–΄λŠ” _둜 ꡬ뢄)
  • ν™•μž₯자 β†’ .sql둜 λλ‚˜μ•Ό 함

🧠 μ‹€ν–‰ μˆœμ„œ 주의

FlywayλŠ” 파일 이름 κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•΄μ„œ μ‹€ν–‰ν•˜λ―€λ‘œ, λ‹€μŒ μˆœμ„œκ°€ 됨:

V1...
V2
...
V10... βœ…
V11
...

V1.1__..., V2.0__... 같은 μ†Œμˆ˜μ λ„ κ°€λŠ₯ν•˜μ§€λ§Œ, 보톡은 μ •μˆ˜ 버전이 더 λͺ…ν™•ν•˜κ³  ν˜‘μ—…μ— μ’‹μŒ


❗️ 잘λͺ»λœ μ˜ˆμ‹œ (μ‹€ν–‰λ˜μ§€ μ•Šκ±°λ‚˜ 였λ₯˜ λ°œμƒ)

잘λͺ»λœ μ΄λ¦„μ΄μœ 
v1__init.sqlVλŠ” λ°˜λ“œμ‹œ λŒ€λ¬Έμž
V1_init.sqlμ–Έλ”μŠ€μ½”μ–΄κ°€ 1개
V001-create.sql__ μ•„λ‹Œ - μ‚¬μš©
V1__.sqlμ„€λͺ…이 μ—†μŒ

βœ… ꢌμž₯ν•˜λŠ” λͺ…λͺ… κ·œμΉ™

V{λ²„μ „λ²ˆν˜Έ}__{도메인}_{ν–‰μœ„}.sql

예:

  • V1__artist_create_table.sql
  • V2__admin_insert_data.sql
  • V3__album_add_sort_order_column.sql

🧠 JPA ddl-autoμ™€μ˜ 차이점은?

ν•­λͺ©ddl-autoFlyway
μ œμ–΄ λ°©μ‹μžλ™ 생성/μˆ˜μ •SQL 파일둜 λͺ…μ‹œ
운영 ν™˜κ²½ μ ν•©μ„±βŒ μœ„ν—˜βœ… μ•ˆμ „
버전 κ΄€λ¦¬βŒ λΆˆκ°€λŠ₯βœ… 버전별 관리 κ°€λŠ₯
μ‹€ν–‰ μ‹œμ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ λ°”λ‘œ λ°˜μ˜μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰ μ‹œ, 버전 비ꡐ ν›„ ν•„μš”ν•œ SQL만 μ‹€ν–‰

πŸ”§ μ„€μ • μ˜ˆμ‹œ (application.yml)

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: classpath:db/migration
baseline-on-migrate: true β†’ κΈ°μ‘΄ DBκ°€ μžˆμ–΄λ„ 첫 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜λΆ€ν„° ν—ˆμš©

πŸ’‘ κ²°λ‘ 

πŸ“Œ FlywayλŠ” MSA 기반의 μ‹€μ„œλΉ„μŠ€μ—μ„œ DBλ₯Ό μ‹ λ’° κ°€λŠ₯ν•˜κ³  μ•ˆμ „ν•˜κ²Œ μ§„ν™”μ‹œν‚¬ 수 μžˆλŠ” ν•„μˆ˜ 도ꡬ닀.

  • 개발 ν™˜κ²½: local/dev/prod ν™˜κ²½ 차이 제거
  • ν˜‘μ—…: λͺ¨λ“  μŠ€ν‚€λ§ˆ/데이터 λ³€κ²½ 내역이 λͺ…μ‹œμ μœΌλ‘œ 기둝
  • 운영: 배포 μ‹œμ μ— 맞좰 μžλ™ 적용 β†’ μž₯μ•  κ°μ†Œ

"μ½”λ“œλŠ” Git으둜, DBλŠ” Flyway둜"

0개의 λŒ“κΈ€