Flyway?

Flyway?

·

3 min read

  • (정의) 데이터베이스 마이그레이션 툴 (오픈소스)

    • 마이그레이션 : 한 DB에서 다른 DB로 이동을 의미하나, 여기선DB에서 진행하는 모든 동작을의미.
  • 소스코드의 깃허브와 동일한 작업이라 생각하면 편하다.

    데이터베이스를 이관할 때 사용할 수 있음. 배포 이후에 많이 활용한다.

0. 이거 왜 씀??

  • 나와 같은 주니어(난 주니어 레벨도 안되지만) 취준 개발자 입장에선 일단 서비스를 만드는거 자체에 집중하는 경향이 큰데, flyway는 그 이후를 봐야할 때 빛을 보는 tool 이다.

    프로젝트에서는 local,개발,배포 환경의 DB가 다를 수 있는데, Flyway는 런타임 시 자동으로 실행되기 때문에 실수 여지를 줄여준다.

  • 즉, 쉽게 DB 환경을 다르게 가져갈 수 있어 편리하다.

    • 예를 들어 local,개발환경은 seed를 넣고, 운영환경에서는 안넣을 수 있음
  • 또한 일일이 사람이 버전관리하는 것이 아니기 때문에 휴먼 에러 방지에도 큰 역할을 한다.이처럼, 서비스 개발 이후 DB 파트에서 유지 보수 및 버전 관리가 필요할 때 활용한다.

  • 예시를 같이 보자.

      @Entity
      public class RealComplexableEntity {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String username;
          //        ... 그외 여러가지
      }
    
  • 이처럼 정말 complexable한 엔티티가 이미 배포되어 있는 상태에서, 만약 nickname이라는 필드를 추가해야한다면??

      @Entity
      public class RealComplexableEntity {
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          private String username;
          //        ... 그외 여러가지
          private String nickname;
      }
    
  • 알다시피, 배포 서버DB를 직접 조작하는 건 좋은 방법이 아니다.(일단 귀찮음 + 휴먼 에러 가능성)

  • 이런 상황을 방지하기 위해, 우리는 DB변경사항만 입력하면 자동으로 버전 관리와 업데이트를 지원하는 flyway tool을 활용하는 것이다.

1. Flyway 특징

  • Migrate

    • 데이터베이스 변경을 담당하는 작업이다.

    • sql파일을 다른 DB에 전달하면, 해당 DB에서 sql 실행 및 histroy 테이블을 생성한다.

    • 파일 위치는 resources/db/migration 밑에 작성해야 시스템이 인식할 수 있다.
      시작 시, init 파일 추가 : resources/db/migration/V1__init.sql

    • 마이그레이션 파일 이름 규칙

      • 버전 새로 적용되는 파일은 기존 파일보다 버전이 높아야한다.
        버전이 낮으면 적용이 안된다.

      • 파일 명명 규칙은 다음와 같다. == {숫자}__{설명}. sql
        ex) V1_init.sql -> V1.1_init.sql..

      • 버전 숫자는 단순 숫자의 오름차순으로 구성해도 되지만, 버전이 상세하게 나눠질 경우 관리가 어려울 수 있기 때문에 날짜를 붙이는 경우도 있다.

  • Baseline

    • 비어있지 않은 데이터베이스에서 flyway를 적용하는 방법이다.

    • address라는 테이블을 생성하려면, v1_baseline 만들고, v2_address.sql 만들어서 적용한다.

    • history테이블 생성

  • Info

    • DB 변경이력을 저장하는 방법이다.

    • flyway를 함으로써 만들어진 history 파일에서 중요하게 봐야할 건 2가지가 있다. version & checksum

    • 지금까지 작성된 version을 확인하고,기존 version 보다 높은 버전으로 작성하여 진행해야한다.

    • 기존 버전의 DB 변경이 될 시 checksum의 해시값이 훼손되서 해당 버전을 사용할 수 없도록 설정되어 있다.. 그러므로 무조건 새버전 만들어서 사용해야한다.

  • Repair

    • 실패한 migration파일을 복구하는 작업이다.
  • Validate

    • flyway 적용 시 DB에 적용가능한지 확인하는 작업이다.
  • Undo

    • 되돌리기
  • Clean

    • DB 클리너라고 생각하면 된다.

2. 그러면 어떻게 씀??

  • 의존성 추가

      dependencies {
          implementation('org.flywaydb:flyway-core:6.4.2')
      }
    
  • yml파일 추가

    • url,user는 사용하는 DB서버

      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