- Today
- Total
개발하는 고라니
[Flyway] Database의 이력을 관리해보자. 본문
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
'잡동사니' 카테고리의 다른 글
Mono repo, Multi Module 위에서 DDD(Domain Driven Design) 를 써보자. (0) | 2023.02.11 |
---|---|
첫 서비스 장애, 느낀점 (3) | 2022.01.16 |
취업 준비를 마치며 (8) | 2021.11.02 |
Programmers의 선물 (4) | 2021.10.22 |
국비교육을 마치며 (2) | 2021.07.17 |