반응형
05-02 12:14
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[Flyway] Database의 이력을 관리해보자. 본문

잡동사니

[Flyway] Database의 이력을 관리해보자.

조용한고라니 2023. 2. 27. 19:36
반응형

specification]

MySql - 8.0.28

gradle - 7.4

flyway - 8.0.0

서론

개발을 하다보면, Database에 생성해놓은 테이블의 컬럼명이 수정된다던지, 컬럼의 타입이 변경되거나, 컬럼이 추가/삭제되는 일이 빈번하진 않지만 일어난다.

하지만 시간이 지나고, 우리가 이런 수정이 언제? 왜 생겼지?는 왠만해서 알 수 없다.

 

우리의 코드 또한 이러한 이유를 포함하여 VCS(Version Control System, ex.git) 을 사용하는 것이 아닌가.

Database의 변경이력을 파일로써 관리해보도록 하자.

본론

본 글에서는 Flyway라는 '오픈소스 데이터 마이그레이션' 툴을 사용한다.

 

사용하는 방법은 여러가지가 있지만. build.gradle.kts에 작성해서 사용해보자!

우선 필요한 플러그인과 의존성은 다음과 같다.

plugins {
    id("org.flywaydb.flyway") version "8.0.0"
}

dependencies {
    compileOnly("mysql:mysql-connector-java")
}

이제 database라는 모듈을 만들고(멀티모듈 생성글 참조), 다음과 같은 디렉토리 구조를 만들어준다.

src
  - main
    - resources
      - db
        - migration

 

다음은, [migration] 디렉토리에 내가 작성하고 싶은 SQL 파일을 작성한다.

단, 다음과 같은 규칙이 존재한다.

예) V1__init.sql

 

나는 아래와 같은 쿼리를 작성했다.

# V1__add_table_user.sql
CREATE TABLE `user`
(
    `id`         bigint       NOT NULL AUTO_INCREMENT comment 'user ID',
    `role_id`    bigint       NOT NULL comment 'role ID',
    `email`      varchar(255) NOT NULL comment 'email',
    `password`   varchar(255) NOT NULL comment '비밀번호',
    `name`       varchar(255) NOT NULL comment '유저 이름',

    `created_at` timestamp    NOT NULL comment '생성일',
    `updated_at` timestamp    NOT NULL comment '수정일',
    `created_by` varchar(255) NOT NULL comment '생성주체',
    `updated_by` varchar(255) NOT NULL comment '수정주체',
    `is_deleted` bit(1)       NOT NULL DEFAULT b'0' comment '삭제여부',
    PRIMARY KEY (`id`),
    KEY          `user_idx_01` (`updated_at`),
    KEY          `user_idx_02` (`created_at`),
    KEY          `user_idx_03` (`role_id`)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;

 

SQL 파일까지 작성했다면, Database에 적용해줄 차례이다. 

gradle 파일에 접근하고자 하는 DB 정보를 기입해준다.

plugins {
    id("org.flywaydb.flyway") version "8.0.0"
}

flyway {
    url = "jdbc:mysql://localhost:3306/mono_repo?allowPublicKeyRetrieval=true&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Seoul"
    user = "root"
    password = "1234567890"
}

dependencies {
    compileOnly("mysql:mysql-connector-java")
}

결론

command로 flyway를 실행할 수도 있지만, intelliJ를 이용해 가시적으로 사용해보자.

나는 여기서

  • flywayClean
  • flywayMigrate

만 사용한다.

clean은 DB를 모두 비우는 것이고, 

Migrate는 내가 작성한 SQL 파일을 모두 적용하는 명령이다.

 

# Code

 

[add-flyway] by poby-kr · Pull Request #5 · rhacnddl/monorepo

[add-flyway]

github.com

 

반응형
Comments