혹시 DB 버전관리 사용 하시나요? 한번 Flyway 사용해보세요~!

Ilyoung Hwang·2025년 1월 17일
0

신입시절부터 현재까지 여러 회사를 다니면서 스키마를 설계하고 개발 및 운영환경에 반영할 때, 참 다양 한 방법을 많이 사용했었다.

주로 사용했던 방법은 Database Tool 에 접속해서 설계했던 해당 스키마를 메뉴얼 또는 실제 쿼리(DDL) 로 생성하는 방법으로 했었다.

이 방법엔 단점이 있는데, 각 환경별로 소스 코드 배포전에 스키마를 DB에 미리 반영해줘야하는 문제점이 있는데 자칫 human error 를 맞닥뜨릴 확율이 높다. 이뿐만 아니라 형상관리가 안되므로 팀 단위 개발환경에서는 팀원중에 누가 무엇을 언제 DB에 반영했는지 확인하기가 힘들었다.

지금의 회사를 다니면서 Flyway 라는 DB 마이그레이션툴을 사용해볼 수 있었는데 위 단점을 보완해줄 수 있는 아주 좋은 오픈소스였다.


Flyway 란 무엇인가?

Flyway 는 git 형상관리와 동일하게 DB를 형상관리할 수 있도록 도와주는 버전관리 도구이다. 즉, 스키마, 컬럼, 인덱스생성 부터 수정, 삭제 까지 모든 기록을 SQL 파일로 보존하여 추적할 수 있다.

또한, 항상 배포전 수동으로 스키마를 반영해줘야했던 부분을 CI/CD 파이프라인에 통합, 자동화하여 human error 를 줄여줄 수 있고, 팀원간 DB 상태의 일관성을 보장할 수 있게 된다.

아래는 Spring 환경에서 마이그레이션을 적용하는 방법을 나타낸다.

1. gradle 설정

	implementation 'org.flywaydb:flyway-mysql'

2. application propertie 설정

아래는 각 설정 속성을 설명한다.

# enabled: 마이그레이션 실행 활성화
# locations: SQL 파일 경로
# baseline-on-migrate: flyway 적용 시점의 이전 모든 스키마 내역을 무시. 버전 1부터 시작한다는 뜻이다.
# baseline-version: 기준 시점의 버전번호를 설정 (기본적으로 1부터 시작)

spring:
  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true
    baseline-version: 1

2. migration file 작성

SQL 파일 작성 format 은 아래와 같다. 보통 description 부분엔 스키마명을 입력해준다.

버전은 1부터 시작하여 증가시킨다.

V[version]__[description].sql

위 format 에 맞게 작성하게 된다면 아래와 같다.

--파일명--
V1__fruit.sql

##중요## 
쿼리 작성할 때 꼭 IF NOT EXISTS 절을 넣어줘야한다. 
개발 또는 운영 DB에 이미 반영했는데 까먹고 해당 쿼리를 배포하면 큰일 나기 때문에

--DDL 스키마 생성할 때--
CREATE TABLE IF NOT EXISTS fruit (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    color VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

--DDL 속성 추가할 때--
ALTER TABLE fruit
ADD COLUMN IF NOT EXISTS size int(11);

3. 프로젝트 실행

마지막으로 프로젝트를 실행하게되면

DB에 flyway_schema_history 라는 테이블이 생성되고 아래의 이미지와 같은 내용이 저장된다.

저자는 SQL 파일을 V1__init.sql 로 작성했고, script 내용엔 아무것도 작성하지 않았다.

이제 앞으로 스키마, 컬럼, 인덱스를 생성, 추가, 삭제할 때 2번 부터 시작하면된다.

4. 경험 Tip

테이블에 인덱스나, 컬럼을 추가할때 고려할 부분이 하나 있다.

만약 저장된 데이터가 천만건이상이라고 했을경우, 위 방법으로 변경된 스키마를 자동화로 반영하기엔 위험부담이 따를 수 있으니, 시스템 점검시간이나 트래픽이 적은 새벽시간에 직접 수동으로 미리 반영해준 다음 절차 대로 배포해줘야한다.


refer: https://documentation.red-gate.com/fd/getting-started-with-flyway-184127223.html

0개의 댓글