DevOps

[MW] Flyway

kyoulho 2024. 8. 31. 17:50

Flyway는 데이터베이스 버전 관리 도구로, 데이터베이스 스키마의 버전을 관리하고 마이그레이션을 자동으로 수행하여 데이터베이스 구조를 최신 상태로 유지하는 데 도움을 준다. Flyway는 SQL 스크립트 또는 Java 코드로 작성된 마이그레이션을 지원하며, 다양한 데이터베이스 관리 시스템(DBMS)을 지원한다.

  • 버전 관리: 데이터베이스 변경 사항을 버전으로 관리하여 이전 상태로 쉽게 되돌릴 수 있다.
  • 자동화: 데이터베이스 배포 과정에서 자동으로 마이그레이션을 실행하여 일관된 상태를 유지한다.
  • 호환성: 다양한 DBMS를 지원하며, SQL 및 Java 기반의 마이그레이션 스크립트를 사용할 수 있다.

 

Flyway 파일의 네이밍 규칙

Flyway는 데이터베이스 스키마 마이그레이션을 관리하기 위해 SQL 스크립트 파일을 사용한다. 이러한 파일들은 특정 규칙에 따라 명명되어야 하며, 이를 통해 Flyway는 파일을 올바른 순서로 실행하여 데이터베이스를 업데이트한다.

  1. 파일 이름 형식: V<VERSION>__<DESCRIPTION>.sql
    • V<VERSION>: 버전 번호를 나타낸다. 버전 번호는 정수로, 예를 들어 V1, V2, V3와 같은 형식을 취한다.
    • <DESCRIPTION>: 마이그레이션의 설명을 나타내는 문자열로, 공백 대신 두 개의 언더스코어(__)를 사용한다. 예를 들어 V1__initial_schema.sql처럼 작성한다.
  2. 파일 예시:
    • V1__create_users_table.sql: 첫 번째 버전으로, users 테이블을 생성하는 마이그레이션 스크립트.
    • V2__add_email_column_to_users.sql: 두 번째 버전으로, users 테이블에 email 컬럼을 추가하는 마이그레이션 스크립트.

 

예제

이 방법에서는 애플리케이션의 코드와 SQL 마이그레이션 파일이 함께 관리된다. Flyway는 애플리케이션이 시작될 때 또는 애플리케이션의 특정 명령을 실행할 때 데이터베이스 마이그레이션을 수행한다.

npm install node-flywaydb
-- src/sql/V1__create_users_table.sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE
);
-- src/sql/V2__add_age_to_users.sql
ALTER TABLE users ADD age INT;
// src/app.module.ts

import { Module, OnModuleInit } from '@nestjs/common';
import * as Flyway from 'node-flywaydb';

@Module({
  // 다른 모듈들...
})
export class AppModule implements OnModuleInit {
  async onModuleInit() {
    const flyway = new Flyway({
      url: 'jdbc:postgresql://localhost:5432/my_database',
      user: 'my_user',
      password: 'my_password',
      locations: ['filesystem:./src/sql'], // SQL 파일의 경로
    });

    await flyway.migrate(); // 애플리케이션 시작 시 마이그레이션 실행
  }
}

 

Jenkins CI/CD 파이프라인에서 Flyway 사용

Jenkins에서 애플리케이션의 CI/CD 파이프라인에 Flyway 마이그레이션을 통합하는 방법이다. 이 방법은 코드가 배포되기 전에 데이터베이스 마이그레이션을 수행할 수 있게 한다.

Jenkins 파이프라인 설정

Jenkinsfile을 설정하여, 애플리케이션이 빌드되고 배포되기 전에 Flyway를 통해 데이터베이스 마이그레이션을 수행한다.

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }
        stage('Database Migration') {
            steps {
                script {
                    // Flyway를 사용하여 데이터베이스 마이그레이션 수행
                    sh 'npm run migrate' // migrate 명령어를 통해 Flyway 실행
                }
            }
        }
        stage('Deploy') {
            steps {
                // 배포 단계
                sh 'npm run deploy'
            }
        }
    }
}

package.json

{
  "scripts": {
    "migrate": "ts-node -r tsconfig-paths/register src/app.module.ts"
  }
}

 

Docker Compose에서 PostgreSQL 컨테이너와 함께 Flyway 사용

Docker Compose 설정

애플리케이션이 시작되면, 내부적으로 Flyway가 데이터베이스에 연결하여 마이그레이션을 수행한다.

version: '3.8'

services:
  db:
    image: postgres:14
    environment:
      POSTGRES_DB: my_database
      POSTGRES_USER: my_user
      POSTGRES_PASSWORD: my_password
    ports:
      - "5432:5432"
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

 

'DevOps' 카테고리의 다른 글

RabbitMQ, Apache Kafka, AWS SQS 비교  (0) 2024.01.13
Apache Kafka  (0) 2023.12.30