Skip to content

[INFRA] Flyway 도입으로 DB 마이그레이션 자동화 #169

@ryuwldnjs

Description

@ryuwldnjs

배경

현재 DB 스키마 변경 시 scripts/migration/V{숫자}__설명.sql 파일을 수동으로 직접 실행하는 방식으로 관리 중.

현재 방식의 문제점

  • 개발자가 직접 SQL 파일을 찾아 실행해야 함 → 실수 가능성
  • 어떤 스크립트가 실행됐는지 이력이 DB에 남지 않음
  • 신규 팀원이 로컬 환경 세팅 시 누락 위험
  • 배포 시 SQL 실행과 코드 배포 순서를 수동으로 맞춰야 함

도입 후 달라지는 점

항목 AS-IS TO-BE
스크립트 실행 수동 애플리케이션 시작 시 자동
실행 이력 없음 flyway_schema_history 테이블에 기록
중복 실행 방지 수동 확인 자동 방지
로컬 세팅 SQL 수동 실행 필요 bootRun 한 번으로 완료

애플리케이션 시작 흐름 (도입 후)

애플리케이션 시작
  ↓
Flyway — 미적용 마이그레이션 스크립트 자동 실행 (스키마 동기화)
  ↓
Hibernate validate — 엔티티 ↔ DB 컬럼 일치 검증 (이중 안전장치)
  ↓
기동 완료

구현 내역

기존 마이그레이션 파일 처리 전략

기존 scripts/migration/의 파일들(V3, V42, V43, V44)은 번호가 뒤죽박죽이고 rollback 파일 혼재 등 문제가 있어 이동하지 않고 그대로 유지.

대신 현재 prod 스키마 전체를 V1__init_schema.sql로 새로 작성하는 clean-start 전략 채택.

scripts/migration/   ← 기존 파일 그대로 유지 (Flyway 관리 대상 아님)
src/main/resources/db/migration/
  └── V1__init_schema.sql   ← 현재 prod 스키마 전체 (신규 생성)

V1 포함 테이블 (13개)

tag, problem, problem_tag, member, member_solved_problem,
team, team_member, team_include_tag, team_join,
recommendation, recommendation_problem, member_recommendation, notification

레거시 테이블 4개 제외: member_recommendation_problem, team_problem, team_recommendation, team_recommendation_problem

1. 의존성 추가 (build.gradle)

implementation 'org.flywaydb:flyway-mysql'

2. 환경별 설정

# application.yml (공통)
spring:
  flyway:
    locations: classpath:db/migration

# application-local.yml
spring:
  flyway:
    baseline-on-migrate: true   # 기존 DB는 V1을 baseline으로 건너뜀
    baseline-version: 1
  jpa:
    hibernate:
      ddl-auto: validate        # none → validate (Flyway가 스키마 관리)

# application-prod.yml
spring:
  flyway:
    baseline-on-migrate: true
    baseline-version: 1
  # jpa.hibernate.ddl-auto: validate 는 기존과 동일

# application-test.yml
spring:
  flyway:
    enabled: false              # H2 + create-drop 유지

baseline 전략 설명

기존 local/prod DB에는 이미 스키마가 존재함.
baseline-on-migrate: true + baseline-version: 1 설정 시:

  • Flyway가 flyway_schema_history 테이블을 생성하고 V1을 실행하지 않고 baseline 레코드만 삽입
  • 기존 테이블은 전혀 건드리지 않음
  • V2부터 실제 마이그레이션 적용

수정 파일

  • build.gradleflyway-mysql 의존성 추가
  • src/main/resources/application.yml — flyway 공통 설정 추가
  • src/main/resources/application-local.yml — baseline 설정 추가, ddl-auto: none → validate
  • src/main/resources/application-prod.yml — baseline 설정 추가
  • src/main/resources/application-test.ymlflyway.enabled: false
  • src/main/resources/db/migration/V1__init_schema.sql — 현재 prod 스키마 초기화 파일

주의사항

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions