DDL 작성 자동화를 위해 Flyway 적용하기

alsdl0629·2024년 3월 3일
0

기술 적용

목록 보기
4/6
post-thumbnail

이번 글에서는 DB Migration 도구인 Flyway에 대해 정리해 보려고 합니다.

Flyway란?

Flyway는 데이터베이스를 변경하고, 변경 이력을 관리해주는 DB Migration 도구입니다.

소스 코드를 관리하는 Git처럼 Flyway는 변경 이력을 버전으로 관리하고,
변경 이력 history도 확인할 수 있습니다.


Flyway 도입 배경

간단한 코드로 예시를 들어 설명하겠습니다.

// Before
@Entity
class User(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0,
    
    val name: String,
)
// After
@Entity
class User(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long = 0,

    val name: String,

    val profileImage: String
)

요구사항이 변경되어 User 엔티티에 profileImage를 추가해야되는 상황입니다.
위 예시처럼 프로젝트를 진행하다보면 DB 관련 변경이 자주 일어납니다.

참고로 개발, 운영 환경에서의 hibernate ddl-auto는 개발자의 실수를 막기 위해 validate로 설정했습니다.

spring:
  jpa:
    hibernate:
      ddl-auto: validate

그렇기 때문에 요구사항이 변경될 때마다 매번 개발, 운영 서버에 테이블 변경 DDL을 작성해야 하는 번거로움이 존재했고, 개발자가 충분히 실수할 수 있는 상황이였습니다.
요구사항이 추가되어 테이블을 추가할 때도 마찬가지입니다.

그래서 이와 같은 번거로움을 해결해주는 도구를 찾다가
자바 진영 DB 관리 도구인 Flyway, Liquibase를 알게되었습니다.

둘 중에서 문서화가 잘 되어있고, 관련 자료가 많은 Flyway를 선택했습니다.

한 줄 요약: 번거롭고 실수를 유발하는 DB 변경 관리를 자동화해 주는 Flyway 적용


Flyway 적용

프로젝트에서는 Spring Boot, Gradle, MySQL을 사용했고,
프로젝트 진행 중(데이터 존재)에 적용했습니다.

설정

// MySQL 8 버전이상, MariaDB 사용
implementation("org.flywaydb:flyway-mysql:10.8.1")

// else
implementation("org.flywaydb:flyway-core:10.8.1")
spring:
  flyway:
    enabled: true # Flyway 활성화
    baseline-on-migrate: true # Flyway가 제공하는 변경 이력 테이블 자동 생성
    baseline-version: 0 # 초기 버전 설정

설정 후 Spring Boot를 실행해보면 Flyway가 제공하는 변경 이력 테이블 자동 생성된 것을 확인할 수 있습니다.


Migration 파일 작성 방법

이제 Flyway가 제공하는 규칙으로 DB 변경 사항을 파일로 작성하면 DB에 자동으로
적용 될 것입니다.
파일은 src/main/resources/db/migration 경로에 생성해야 합니다.(수정 가능)

파일명은 (Prefix)(Version)__(Description).sql 형식으로 작성하면 됩니다.
그리고 버전을 명시할 때는 이전 버전보다 항상 높아야 하며, 마이그레이션 파일을 수정하거나 지우면 안됩니다.

  • ex) V1 -> V2 ✅ / V2 -> V1 ❌
// V1__add_user_profile_image.sql
alter table user add column profile_image varchar(255) not null;
// V2__add_user_age.sql
alter table user add age int not null;

결과


느낀점

Flyway를 직접 사용해 보면서 편하다는 생각이 가장 먼저 들었습니다.

매번 개발, 운영 환경에 접속해 각각 DDL을 작성하는게 불편했는데, 마이그레이션 파일 하나로 두 서버에 DDL이 자동으로 작성되니까 시간이 절약되고, 생산성이 크게 향상되었습니다.

실무에서 DBA를 맡으신 분이 계신다면 불필요한 기술이겠지만, 토이 프로젝트와 같이 서버, DB를 모두 백엔드가 관리한다면 Flyway를 도입해도 괜찮을 것 같습니다!


참고 자료 🙇🙇🙇

https://documentation.red-gate.com/flyway
https://github.com/devcsb/flyway?tab=readme-ov-file
https://velog.io/@banjjoknim/DB-Migration-Tool#naming-strategy-%EC%84%A4%EC%A0%95

profile
인풋보다 아웃풋

0개의 댓글