flywayDB, 데이터베이스 버전 관리 도구

FlywayDB

FlywayDB 는 데이터베이스 스키마(테이블 설계)의 반영을 자동화하기 위한 도구 입니다. 왜 이런 도구가 필요한지 돌아보고 간단한 예제를 통해 사용방법을 알아보겠습니다.

소개

S/W 개발에서 버전 관리는 이제 당연한 것이 되었습니다. CVS, SVN, Git과 같은 버전관리 도구가 제공하는 변경 기록과 복원/공유 기능은 소프트웨어 개발에 있어서 너무나 유용하기 때문이죠.

우리는 종종 데이터가 애플리케이션보다 오래 간다는 얘기를 합니다. 제가 일하는 은행이라면 너무나 당연한 이야기입니다. 10년에 한 번씩 차세대를 해서 은행 전체 애플리케이션을 새로 만들지만 데이터는 항상 이어갑니다.

변경관리에 있어서 애플리케이션에 비하면 데이터베이스는 크게 관심을 받지 못하고 있습니다. 데이터가 저장되는 테이블의 경우 언제 만들어졌는지, 어떤 컬럼이 언제 추가되었는지 알기는 어렵습니다. 이런 곳에서 flywaydb가 도움이 될 수 있습니다.

flywaydb는 데이터베이스 스키마 관리를 자동화하기 위한 도구입니다. sql 파일로 스키마 버전을 관리할 수 있도록 하는게 flywaydb의 목적입니다. 간단한 예제를 통해 어떻게 동작하는지 알아보겠습니다.

준비하기

Windows 에서

flywayDB는 자동화 도구입니다. 자동화 도구를 매번 수동으로 실행하는 것은 바보같은 짓이겠죠. 소프트웨어 개발의 각 단계를 자동화하는 것은 좋은 생각입니다. 인생에 딱 한번 하는 것이 아니라면 되도록 자동화해 두는게 좋습니다. 망가져도 다시 살려낼 수 있게 됩니다. 또한 배포할 때에도 훨씬 편해집니다. 클라우드가 폭넓게 사용되는 요즘의 환경이라면 더욱 유용하죠.

  1. Scoop 을 설치합니다.
    1. Scoop 은 Mac에서의 Homebrew 같은 역할을 합니다.
    2. Windows PowerShell에서 스크립트를 실행합니다. >iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
    3. 메시지에 jdk를 설치할 것을 권장한다고 하네요. 설치해 줍니다. : scoop install openjdk
    4. Linux에서는 yum/apt/rpm 등 다양한 소프트웨어 패키지 관리 툴이 있었습니다. Mac에서는 homebrew가 그런 편이성을 제공해 주었죠. 윈도에서는 그런게 없었는데 scoop이 그런 역할을 해주는 것 같습니다. 윈도에서 개발하는 사람들에게 어느정도 도움이 되줄 것 같습니다.
  2. Gradle 을 설치합니다.
    1. gradle은
    2. cmd에서 scoop으로 설치합니다. : scoop install gradle
    3. 개발 중인 프로젝트 위치에서 gradle을 시험 실행해 봅니다. : >gradle
    4. 잘 된다고 출력이 나옵니다. 디렉토리를 보면 .gradle 이라는 디렉토리가 생긴 걸 볼수 있습니다. gradle에서 사용하는 특별한 폴더입니다.
  3. Gradle 빌드를 초기화합니다. : >gradle init
  4. 디렉토리에 build.gradle 이라는 파일이 생성되어 있습니다.

DB 연결하기

이번에 아마존의 DW(Data Warehouse) 데이터베이스인 redshift를 사용할 일이 생겼습니다. 그곳에 DB를 만드는 것을 예제로 진행해 보려고 합니다.

  1. 아마존 레드쉬프트(적색편이) DB를 사용할 것이라서 내용에 맞게 build.gradle 파일을 설정해 줍니다.
buildscript {
    repositories {
        mavenCentral()
        maven { url "http://redshift-maven-repository.s3-website-us-east-1.amazonaws.com/release" }
    }

    dependencies {
        classpath 'com.amazon.redshift:redshift-jdbc42:1.2.10.1009'
    }
}

plugins {
    id "org.flywaydb.flyway" version "5.0.3"
}

flyway {
    url = 'jdbc:redshift://dwcluster.xxxxx.ap-northeast-2.redshift.amazonaws.com:5439/dev'
    user = 'admin'
    password = 'abcdefg'
}
  1. >gradle tasks 를 입력하면 사용할 수 있는 명령어들이 출력됩니다.
  2. DB 접속 테스트를 위해 >gradle flywayInfo를 입력합니다. BUILD SUCCESSFUL 이 출력되면 됩니다.
  3. 일단 flywaydb의 기준선(baseline)을 만들어줍니다. >gradle flywaydbBaseline
    1. DB에 접속해 보면 flyway_schema_history 라는 테이블이 생성된 것을 볼 수 있습니다.
    2. 이것은 flywaydb 에서 버전 관리를 하는데 사용하는 테이블 입니다. 언제 어떤 스크립트를 실행했는지, 버전은 어떻게 되는지 알려줍니다.
  4. 첫 번째 테이블을 만들어 봅니다.
    1. flywaydb 가 migration을 위한 파일을 찾는 기본 위치인 src/main/resources/db/migration 디렉토리를 만들어줍니다.
    2. 위 디렉토리에 V2__Create_some_table.sql 파일을 만들어 줍니다. 간단한 테이블 생성 스크립트 입니다.
    CREATE TABLE meta (
        id INT IDENTITY(0,1),
        category VARCHAR(128) NOT NULL,
        name VARCHAR(128) NOT NULL,
        val VARCHAR(256),
        PRIMARY KEY(id),
        UNIQUE (category, name)
    );
    
    1. flywaydb에서 새로운 버전을 적용하는 것을 migration 이라고 합니다. >gradle flywayMigrate
    2. 현재 버전보다 높은 버전의 파일들이 디렉토리에 있으면 그 파일들을 실행해 줍니다.
    3. 3번 이 정상적으로 실행되었으면 테이블이 생성된 것을 볼 수 있습니다. flyway_schema_history 테이블을 확인해보면 버전이 2로 올라간 것도 확인할 수 있습니다.
  5. 테이블을 만들었으니 기초적인 데이터(코드성 데이터 같은)를 넣어봅시다. V2.1 로 해도 될것 같습니다.
    1. V2.1__Add_basic_codes.sql 파일을 만듭니다.
    2. 이런저런 데이터들을 넣어봅시다.
INSERT INTO meta (category, name, val)
    values  ('krx_market_code', 'kospi', 'stockMkt'),
            ('krx_market_code', 'kosdaq', 'kosdaqMkt'),
            ('krx_market_code', 'konex', 'konexMkt');

간략한 예제로 flywaydbㄹ르 알아보았습니다.

정리

flywaydb와 함께하는 데이터베이스 모델링 관리는 이런 식으로 진행됩니다.

  1. 테이블을 설계합니다. 인공지능의 시대라지만 아직은 머리를 써야할 일이 있습니다. 🙂
  2. Vnn__설명.sql 파일에 DDL(Create 등), DML(Insert, Delete 등) 스크립트를 만들어 줍니다.
  3. flywayMigrate 를 실행해 줍니다.
  4. sql 파일을 버전 관리에 추가해줍니다.

필요하면 undo(flywaydb pro에서 지원) 등을 해서 버전을 돌려주기도 합니다.

flywaydb를 사용하면 이런 장점들이 있습니다.

  • 데이터 모델(스키마)의 버전 관리
  • 여러 데이터베이스를 사용할 때 반복 가능

복잡한 데이터 모델을 사용하고 있는 곳에서는 적용하는걸 고려해볼만 한 것 같습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다