본문 바로가기

Language & Framework/개발잡담

springboot에서 flyway로 DB 형상 관리하기

 

 

데이터베이스 버저닝으로 개발 신뢰성을 향상시키자!!!!!!! 어쩌고 저쩌고

 

우리 팀은 지금까지 DB 스키마를 수동으로 관리해왔다.

 

users 테이블에 name이라는 컬럼이 추가되어야 한다면 어떻게 해야할까?

1. User 엔티티에 name 필드를 추가한다.

2. dev DB에 name 컬럼을 추가한다.

3. stage DB에 name 컬럼을 추가한다.

4. prod DB에 name 컬럼을 추가한다.

 

jesus...

사실 방법이 있다는 걸 몰라서 지금까지 이렇게 해온 건 아니고.. 다들 본인에게 직접적으로 할당된 업무들을 처리하는 것도 너무너무너무너무너무너무너무 바쁘다보니 신경 쓸 겨를이 없었다.

이렇게 해오면서도 (다행히도) 아직까지 별 문제가 없기도 했고.

 

그렇다. 당연히 핑계다.

이거 적용하는데 얼마나 걸린다고.. 하루 공부 포기하면 진작에 적용할 수 있었는데 안했다.

그렇게 미루고 미루다 입사한지 10개월이 된 시점에 내가 시간내서 총대 메고 적용했다.

 

flyway의 특징은 아래와 같다.

 

 

 

 

1. 순수 SQL 스크립트만 작성해주면 됨.

2. 문제 있으면 어플리케이션 실행 시점에 실패함. (제일 중요함)

3. k8s같은 환경에서 병렬 마이그레이션해도 안전함. (확인해보니 대단한 기술이 있는 건 아니고 그냥 락임)

 

 

(출처 : https://documentation.red-gate.com/flyway/quickstart-how-flyway-works)

 

동작도 굉장히 심플하다.

flyway_schema_history에 최종 버전 기록이 남아있고, 이후 새로운 버전의 스크립트가 추가되었으면 순차적으로 따라가면서 해당 스크립트들을 실행한다.

 

참 쉽다.

바로 적용해보자.

참고로 나는 이미 기존 데이터가 있는 상태에서 flyway를 적용했다.

empty schema에 적용하는 경우라면 docs 들어가서 읽으셈.

 

 

 

적용 환경

- Laungauge : Kotlin, Java 17

- Framework : SpringBoot 3.0.1

- Database : PostgreSql 13

 

1. build.gradle에 flyway 의존성을 추가해준다.

 

// flyway
implementation "org.flywaydb:flyway-core"

 

 

2. application.yml에 설정 작성.

 

spring:
    flyway: enabled: true # flyway 사용 여부
   baseline-on-migrate: true # 초기화되지 않은 데이터베이스에 마이그레이션을 적용할 때, 초기 버전으로 마이그레이션 파일을 적용할지 여부
    locations: classpath:db/migration # 마이그레이션 파일이 저장될 위치
    baseline-version: 1 # 초기화되지 않은 데이터베이스에 마이그레이션을 적용할 버전
    fail-on-missing-locations: true # 스크립트 파일을 저장하는 위치를 찾지 못할 때 에러를 발생시킬지 여부

 

3. 다 작성했으면 resource/db/migration에 V1__baseline_migration.sql 파일을 만들고 기존 DB의 DDL문을 그대로 복사해서 붙여넣는다.

 

4. 로컬에서 이상 없이 잘 동작하는지 확인한다. (제일 중요)

 

5. 예제 테이블을 만들어본다.

네이밍 규칙은 아래 이미지를 참고한다.

 

1. prefix : V 고정이다.

2. version : 정수로 판단한다. 

예) 00020보다 200이 더 최신 버전이다.

     20201201보다 20201210이 더 최신 버전이다.

3. separator : __ 작대기 두 개 고정이다.

4. description : 설명을 작성하자. DB에 저장되는 항목이다.

5. suffix : .sql 고정이다.

 

나는 충돌 가능성이 제일 적다고 생각되는 yyyyMMddHHmm 패턴을 사용했다.

 

// V202402061603__example_create_test_table.sql
create table test_table(test_joa varchar(255));

 

6. Dev DB의 사본을 생성한다. (중요)

7. Dev 서버에서 실행해본다.

8. 잘 동작하면 팀원들에게 자랑한다.

 

바쁘다고 핑계대지 말고 할 수 있는 건 빨리 빨리 하자~