NestJS TypeORM Migration DB 생성 및 첫 Migration진행 -2

 이번에는 TypeORM에서 migration을 셋팅하고 이후 글에서는 동작을 하도록 하겠습니다.


이전글 : NestJS TypeORM Migration 셋팅하기 -1


진행을 위해서는 NestJS가 설치 되어 있어야 합니다. 아래 링크를 참고해 주시기 바랍니다.

링크 : nest js - install & Create Project from Linux or Ubuntu


해당 글에서는 Postgres을 사용합니다. 다만 진행의 편리성을 위해 Docker Container를 이용하여 사용합니다. 아래 링크를 참고해 주시기 바랍니다.

링크 : Docker-Compose yaml파일을 이용하여 PostgreSQL를 Local로 구축하기


1. users 모듈을 nest cli로 생성합니다.


$ nest g res users




2. user.entity.ts파일에 들어가서 Table Column을 설정합니다.


// src/users/entities/user.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity('users')
export class User {
@PrimaryGeneratedColumn('increment')
id: number;

@Column({ unique: true })
email: string;
}


3. users.module.ts에서 typeorm을 imports 합니다.

// src/users/users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}


4. 이제 nest 서버를 실행합니다.

$ npm run start:dev



하지만 DB에는 users테이블이 생성이 안된것을 알수 있다. 이런 이유로 migration을 진행해야 한다.


물론 간단한 방법으로 dataSourceOption안에 'synchronize : true'를 넣으면 쉽게 해결된다. 다만 Production에서 TypeOrm이 synchronize를 하는 경우 일부 혹은 모든 데이터가 변질 되거나 사라질수 있다. 이런 이유로 production에서는 synchronize를 false로 두고 migration을 진행한다.


5. 첫 Migration

- migration파일을 생성합니다.

$ npm run migration:generate -- [migration 경로]


migration 경로 : migration파일이 생성될 경로입니다. 처음에 db폴더안에 생성하면 됩니다. 기존 파일과 구분짓기 위해서 migration폴더를 생성해서 그 안에 저장하도록 하겠습니다. (ex : db/migrations/[migration 이름]



이제 migrations 폴더에 가면 새로운 ts파일이 생성된 것을 알수 있습니다.

// db/migrations/1681507851345-FirstMigration.ts
import { MigrationInterface, QueryRunner } from 'typeorm';

export class FirstMigration1681507851345 implements MigrationInterface {
name = 'FirstMigration1681507851345'; // migration Table에서 입력되는 Record name 값

public async up(queryRunner: QueryRunner): Promise<void> {
// migration:run을 진행시 수행되는 쿼리문
await queryRunner.query(
`CREATE TABLE "users" ("id" SERIAL NOT NULL, "email" character varying NOT NULL, CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3" UNIQUE ("email"), CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY ("id"))`,
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
// migration:revert을 진행시 수행되는 쿼리문
await queryRunner.query(`DROP TABLE "users"`);
}
}


이제 migration:run을 진행해 보겠습니다.

$ npm run migration:run




위 사진처럼 정상적으로 migration을 진행했다면 DB에도 Table이 생성된 것을 알수 있습니다.


만약 방금 migration을 번복하고 싶다면 migration:revert을 진행합니다.

$ npm run migration:revert


다음 글에서는 Table을 수정, 삭제에 대해서 알아보도록 하겠습니다.


다음글 : 





























댓글

이 블로그의 인기 게시물

Lesson 12_1 프로퍼티 노드(Property Node)

DAQ로 전압 측정하기-2

Lesson 12_2 참조를 이용한 프로퍼티노드(Property Node)