[Nest.js] TypeORM을 활용한 PostgreSQL 마이그레이션하기

궁금하면 500원·2024년 8월 14일
0

1. 마이그레이션이 필요한 이유

Controlled Changes (제어된 변경)

마이그레이션을 사용하면 데이터베이스 스키마 변경을 제어하고 추적할 수 있습니다.

이를 통해 어떤 변경 사항이 적용되었는지 명확히 알 수 있으며, 실수나 문제 발생 시 쉽게 문제를 추적하고 수정할 수 있습니다.

Reversible (역이 가능한)

마이그레이션은 일반적으로 변경 사항을 되돌릴 수 있는 기능을 제공합니다.

이를 통해 잘못된 변경이 있을 경우 쉽게 롤백하여 이전 상태로 복구할 수 있습니다.

Versioning (버전 관리)

데이터베이스 스키마 변경 사항을 버전으로 관리할 수 있습니다.

이를 통해 다양한 버전의 스키마를 유지하고 필요에 따라 특정 버전으로 되돌릴 수 있습니다.

Consistency (일관성)

마이그레이션은 여러 개발 환경(개발, 스테이징, 프로덕션 등)에서 일관된 스키마를 유지하도록 도와줍니다.

모든 환경에서 동일한 마이그레이션 파일을 적용함으로써 데이터베이스 구조가 일관되게 유지됩니다.

Complex Changes (복잡한 변경)

데이터베이스 구조를 복잡하게 변경해야 할 때, 마이그레이션 도구를 사용하면 복잡한 SQL 문을 안전하게 적용할 수 있습니다.

예를 들어, 테이블 구조를 변경하거나 인덱스를 추가하는 작업을 안전하게 수행할 수 있습니다.

2. 마이그레이션 파일 적용 방법 (PostgreSQL)

TypeORM을 사용하여 PostgreSQL 데이터베이스 마이그레이션을 적용하는 방법을 설명하겠습니다.

TypeORM은 데이터베이스 마이그레이션을 지원하며, 이를 통해 스키마 변경을 쉽게 관리할 수 있습니다.

1. TypeORM 설치 및 설정

먼저 TypeORM과 PostgreSQL 드라이버를 설치합니다.

npm install @nestjs/typeorm typeorm pg

Nest.js 애플리케이션에서 TypeORM을 설정하려면,
app.module.ts 파일에 TypeORM 모듈을 추가합니다.

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { YourEntity } from './your.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'yourusername',
      password: 'yourpassword',
      database: 'yourdatabase',
      entities: [YourEntity],
      synchronize: false, // true로 설정하면 자동으로 동기화됩니다. 마이그레이션 사용 시 false로 설정
    }),
    // 다른 모듈들
  ],
})
export class AppModule {}

2. 마이그레이션 파일 생성

TypeORM CLI를 사용하여 마이그레이션 파일을 생성합니다.

TypeORM CLI를 설치하고 마이그레이션 파일을 생성할 수 있습니다.

npm install typeorm -g

마이그레이션 파일을 생성하려면 다음 명령어를 사용합니다.

typeorm migration:create -n MigrationName

위 명령어는 src/migration 폴더에 MigrationName이라는 이름의 마이그레이션 파일을 생성합니다.

3. 마이그레이션 파일 작성

생성된 마이그레이션 파일을 열어 데이터베이스 변경 사항을 작성합니다.

예를 들어, 테이블을 생성하는 마이그레이션 파일은 다음과 같습니다.

import { MigrationInterface, QueryRunner, Table } from 'typeorm';

export class CreateUserTable1618220978495 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.createTable(
      new Table({
        name: 'user',
        columns: [
          {
            name: 'id',
            type: 'int',
            isPrimary: true,
            isGenerated: true,
            generationStrategy: 'increment',
          },
          {
            name: 'name',
            type: 'varchar',
          },
          {
            name: 'email',
            type: 'varchar',
            isUnique: true,
          },
          {
            name: 'password',
            type: 'varchar',
          },
        ],
      }),
    );
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.dropTable('user');
  }
}

위 파일에서는 up 메서드에서 테이블을 생성하고, down 메서드에서 테이블을 삭제합니다.

4. 마이그레이션 실행

마이그레이션 파일을 작성한 후, 마이그레이션을 실행하여 데이터베이스에 변경 사항을 적용합니다.

typeorm migration:run

이 명령어는 up 메서드의 내용에 따라 데이터베이스에 변경 사항을 적용합니다.

5. 마이그레이션 롤백

마이그레이션을 롤백하려면, 다음 명령어를 사용하여 마지막 마이그레이션을 되돌립니다.

typeorm migration:revert

이 명령어는 down 메서드를 실행하여 데이터베이스 변경 사항을 롤백합니다.

이 과정을 통해 Nest.js 애플리케이션에서 PostgreSQL 데이터베이스의 마이그레이션을
안전하게 관리하고 적용할 수 있습니다.

profile
꾸준히, 의미있는 사이드 프로젝트 경험과 문제해결 과정을 기록하기 위한 공간입니다.

0개의 댓글