Flyway는 데이터베이스 버전 관리 도구로, 데이터베이스 스키마의 버전을 관리하고 마이그레이션을 자동으로 수행하여 데이터베이스 구조를 최신 상태로 유지하는 데 도움을 준다. Flyway는 SQL 스크립트 또는 Java 코드로 작성된 마이그레이션을 지원하며, 다양한 데이터베이스 관리 시스템(DBMS)을 지원한다.
- 버전 관리: 데이터베이스 변경 사항을 버전으로 관리하여 이전 상태로 쉽게 되돌릴 수 있다.
- 자동화: 데이터베이스 배포 과정에서 자동으로 마이그레이션을 실행하여 일관된 상태를 유지한다.
- 호환성: 다양한 DBMS를 지원하며, SQL 및 Java 기반의 마이그레이션 스크립트를 사용할 수 있다.
Flyway 파일의 네이밍 규칙
Flyway는 데이터베이스 스키마 마이그레이션을 관리하기 위해 SQL 스크립트 파일을 사용한다. 이러한 파일들은 특정 규칙에 따라 명명되어야 하며, 이를 통해 Flyway는 파일을 올바른 순서로 실행하여 데이터베이스를 업데이트한다.
- 파일 이름 형식:
V<VERSION>__<DESCRIPTION>.sql
V<VERSION>
: 버전 번호를 나타낸다. 버전 번호는 정수로, 예를 들어V1
,V2
,V3
와 같은 형식을 취한다.<DESCRIPTION>
: 마이그레이션의 설명을 나타내는 문자열로, 공백 대신 두 개의 언더스코어(__
)를 사용한다. 예를 들어V1__initial_schema.sql
처럼 작성한다.
- 파일 예시:
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:
728x90
'DevOps' 카테고리의 다른 글
로그 로테이트(Logrotate) (0) | 2024.11.12 |
---|---|
[Git] Merge 전략 (0) | 2024.08.25 |
[Git] Git 워크플로우 비교: GitHub Flow, Gitflow, GitLab Flow (0) | 2024.07.30 |
RabbitMQ, Apache Kafka, AWS SQS 비교 (0) | 2024.01.13 |
Apache Kafka (0) | 2023.12.30 |