-
Notifications
You must be signed in to change notification settings - Fork 2
Closed
Description
배경
현재 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.gradle—flyway-mysql의존성 추가src/main/resources/application.yml— flyway 공통 설정 추가src/main/resources/application-local.yml— baseline 설정 추가,ddl-auto: none → validatesrc/main/resources/application-prod.yml— baseline 설정 추가src/main/resources/application-test.yml—flyway.enabled: falsesrc/main/resources/db/migration/V1__init_schema.sql— 현재 prod 스키마 초기화 파일
주의사항
- Squad 추가([FEATURE] 팀 내 스쿼드(Squad) 기능 도입 #146) 이전에 먼저 머지되어야 함 (Squad PR에서 V2 스크립트 사용)
- 신규 환경 구축 시 V1부터 순서대로 실행되어 스키마 자동 생성
- 기존 DB 스키마 개선 작업은 별도 이슈 flyway: DB 스키마 enum → VARCHAR 표준화 및 제약조건 정리 #170 에서 진행
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels