kkokkio - 프로젝트/ADR(의사결정문서)

Flyway

파란배개 2025. 6. 11. 12:41

문제 상황

프로젝트를 진행하면서 DB를 변경하게 되면 DB 마이그레이션을 하게 될텐데, 그럴 경우 아래의 방법 둘 중 하나를 사용해야 한다.

DB 마이그레이션 (DB 변경사항 관리) 방법

  1. spring.jap.hibernate.ddl-auto = create // update create로 DB의 변경사항을 관리하는 경우, 데이터를 유지할 수 없다.
  2. 수동으로 schema 변경
  3. 휴먼 에러가 발생할 가능성이 높다.

제안

Flyway

DB 버전을 관리하기도 좋고, 개발 환경의 통일성을 제공해준다는 점이 있다.

또한 새로운 기술을 경험해본다는 점에서 도입할 가치가 있다.

장단점

제안된 기술 도입의 장단점

장점

  • DB 버전을 관리하기 편하다.
  • 아래의 예시처럼 버전 정보, 스크립트 파일 정보, 변경자, 변경 일자, 성공 여부를 담은 metadata table을 생성, 자동으로 관리함
  • 개발 환경의 통일성을 제공한다.

단점

  • 프로젝트 기간과 규모에 비해 오버 엔지니어링이 될 수 있다.
  • 변경 기록 파일과 마이그레이션 스크립트 파일 변경하게 되면 에러가 발생해 주의가 필요하다.

대안

  • 대안1: 수동 관리
  • 데이터를 유지하지 못하거나 휴먼 에러가 발생할 가능성이 높음
  • 대안2: Liquibase
  • flyway 보다 복잡함

최종 채택 및 차후 과제

  • 채택
  • Flyway 관련 설정을 추가하고 운영 환경에서 사용
  • 차후 과제
    1. 의존성 추가
    2. dependencies { // Flyway 를 적용하기 위한 라이브러리 implementation('org.flywaydb:flyway-core:6.4.2') // MySQL 데이터베이스를 위한 Flyway 확장 라이브러리 // implementation 'org.flywaydb:flyway-mysql' }
    3. application.properties (application.yml)에 설정 추가
    4. #data source 설정 / 본인 환경에 맞게 수정해주세요. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:13306/flyway spring.datasource.username=ecsimsw spring.datasource.password=1234 #flyway 설정 spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true spring.flyway.enabled=true spring.jpa.generate-ddl=false #Spring boot 2 이상의 경우 아래 설정 추가 spring.flyway.baselineOnMigrate = true
    5. init 파일 추가 **(resources/db/migration/V1__init.sql) 위치 지켜주셔야 합니다. 제목의 언더바 __ 두개도 작성해야 됩니다. *** 이 파일을 기준으로 flyway가 DB 버전 관리를 하게 되므로, 지우면 절대 안됩니다.DB에 접속해서 SELECT * FROM flyway_schema_history 입력 후 확인하면 이렇게 보입니다. 이렇게 되면 Flyway 설정 완료된겁니다.
    6. # 이전 table를 지우고 drop table if exists sample_entity; # 초기 스케마를 정의 create table sample_entity( id bigint auto_increment, name varchar(255), primary key (id) );
    7. 스키마 구조 변경 사항 파일 추가 (resources/db/migration/V2__add_age.sql) 아래의 코드를 설명드리자면 sample_entity 테이블에 age라는 컬럼을 추가하겠다고 알려주는 것입니다!다시 history를 확인해보면 이렇게 될겁니다.
       
      1. ALTER TABLE sample_entity ADD COLUMN age integer default 0
  • 환경은 gradle, spring boot, MySql 기준

 

영상과 블로그를 기반으로 작성했습니다. 이후 마이그레이션 스크립트 네이밍, 로케이션은 영상 참고해주시길 바랍니다! https://www.youtube.com/watch?v=pxDlj5jA9z4

출처

https://www.youtube.com/watch?v=pxDlj5jA9z4

https://www.blog.ecsimsw.com/entry/Flyway로-DB-Migration

[✅ flyway 도입 Flyway](https://www.notion.so/flyway-1e13550b7b55806d83fedb506eb38f2c?pvs=21) https://ywoosang.tistory.com/18

 

[SpringBoot] 데이터베이스 마이그레이션 툴 Flyway 도입기

들어가며프로젝트에서 데이터베이스 마이그레이션 툴로 Flyway 를 도입하면서 이를 정리한 글이다. 데이터베이스 마이그레이션데이터베이스 마이그레이션이란?데이터베이스 마이그레이션은

ywoosang.tistory.com

 

'kkokkio - 프로젝트 > ADR(의사결정문서)' 카테고리의 다른 글

Spring Batch  (0) 2025.06.11
Airflow  (0) 2025.06.11
Swagger  (0) 2025.06.11
MySQL  (0) 2025.06.11
Spring Security + JWT  (0) 2025.06.11