포괄적인 의미의 migration을 os를 변경하거나 데이터베이스의 종류를 바꾸는 것을 의미한다.
데이터베이스에서 사용하는 migration의 의미는 새로운 테이블을 추가하거나, 속성의 이름을 변경하는 등의 스키마를 변경하는 작업을 의미한다.
이런 데이터베이스의 버전 관리를 위한 migration을 TypeORM을 통해 쉽고 안전하게 진행할 수 있다.
📁 참고 문서 : Nestjs로 배우는 백엔드 프로그래밍
📁 TypeOrm 공식 문서
TypeORM을 사용하기 위해서 TypeORM을 설치해준다.
TypeORM migration을 적용하기 위해서는 typeorm CLI를 사용해야하므로, typeorm CLI 실행을 위한 ts-node를 global로 설치해준다.
# Nest.js에서 TypeORM을 연동시켜주기 위해 사용하는 모듈
$> npm install --save @nestjs/typeorm
# typeorm module
$> npm install --save typeorm
# typeorm CLI 실행을 위해 global로 설치
$> npm i -g ts-node
설치가 완료되었다면 package.json 파일에 아래와 같은 코드를 추가하여 프로젝트에서 typeorm CLI를 사용할 수 있도록 한다.
package.json 👇
"scripts": {
...
"typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js"
}
다음으로는 migration을 적용할 테이블을 typeorm에게 알려주기 위해 typeorm.config.js에 적용할 테이블에 대한 정보를 작성해준다.
typeorm.confing.js 👇
{
...
"synchronize": false, // true로 설정할 경우 서버가 구동될 때마다 테이블이 자동으로 생성됨
"migrations": ["dist/migrations/*{.ts,.js}"], // migration 수행할 파일
"cli": {
"migrationsDir": "src/migrations" // migration 파일을 생성할 디렉토리
},
"migrationsTableName": "migrations" // migration 내용이 기록될 테이블명(default = migration)
}
TypeORM에서의 migration 및 version 관리는 migration 파일을 이용해서 한다.
migration:create
와 migration:generate
명령어를 통해 migration 파일을 생성할 수 있다.
# migration 내용이 비어있는 새로운 migration 파일 추가
$> npm run typeorm migration:create
$> npm run typeorm migration:create -- -n "message" # message 추가하여 기록
# 변경된 소스코드를 감지해 migration 파일을 자동 생성
$> npm rum typeorm migration:generate
$> npm rum typeorm migartion:generate -- -n "message"
명령어를 실행하면 typeorm.config.js 에서 migrationsDir에 설정한 디렉토리 하위에 migration 파일이 생성된다.
생성된 migration 파일 👇
import { MigrationInterface, QueryRunner } from "typeorm";
export class CreateUserTable1640441100470 implements MigrationInterface {
name = 'CreateUserTable1640441100470'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE User (id varchar(255) NOT NULL, name varchar(30) NOT NULL, email varchar(60) NOT NULL, password varchar(30) NOT NULL, signupVerifyToken varchar(60) NOT NULL, PRIMARY KEY (id)) ENGINE=InnoDB`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP TABLE \`User\``);
}
}
생성된 migration 파일에서 변화된 데이터베이스의 변화를 확인할 수 있다.
up 부분에는 데이터베이스의 변화 내용이 down 부분에는 원래의 데이터베이스 모습이 작성된다.
만약 migration:create
를 이용하여 migration 파일을 생성하였다면 두 함수 모두 비어있을 것이므로 up부분에 변화시킬 내용, down 부분에 현재의 데이터베이스 모습을 작성해주면 된다.
migration 파일을 생성한다고 데이터베이스에 변화가 적용되는 것은 아니기 때문에 명령어를 통해 migration을 진행해주어야한다.
# up으로 작성된 변화를 적용시킴
$> npm run typeorm migration:run
# down에 작성된 버전으로 되돌림
$> npm run typeorm migration:revert