TypeORM migration

프로덕션 레벨에서 DB의 변경사항이 있을 수 있다. 모델의 변경사항이 생긴다면 데이터베이스와 동기화를 해야한다. Dev 레벨에선 {syncronize: true} 옵션을 추가하여 모델의 변경 사항을 바로 적용한다. 하지만 프로덕션 레벨에선 사용하면 안되는데, 기존의 데이터들을 전부 날릴 수 있기 때문이다.

Migration 기능을 사용하면, 현재 모델과 기존 DB를 비교해 변경된 사항에 대해 SQL 쿼리문을 날려준다. 기존의 데이터를 안전하게 보관하면서도 빠르게 변경사항을 적용할 수 있다. 또, migration 기능을 통해 적용한 내용은 DB에 기록되기 때문에 버전관리 또한 가능하다.

실무에서는 로컬 변경사항에 대해서는 {syncronize: true} 옵션을 사용하고, 내부 테스트용 Dev 버전에선 테스트 데이터들을 보존하기 위해 migration 기능을 사용하고있다.

migration 방법

  1. 프로젝트에 typeorm CLI 설치

    npm install ts-node --save-dev
    npm i -g typeorm
    
  2. package.json파일에 script 작성

    "scripts": {
        ...
        "typeorm": "typeorm-ts-node-esm  -d ${ormConfig.ts PATH}"
    }
    
  3. ormconfig.ts 파일 작성. DB에 접속하기 위한 데이터를 정리해두는 파일이다. 파일 위치는 꼭 저 위치가 아니어도된다.

    // src/ormconfig.ts
    
    import { DataSource } from 'typeorm';
    
    const ormConfig = new DataSource({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: '00-service',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: false,
      migrationsRun: false,
      migrationsTableName: 'migrations',
      migrations: [__dirname + '/**/migrations/*.ts'],
    });
    
    export default ormConfig;
    
  4. **${migration-file-name}**엔 버전관리에 사용될 마이그레이션 명을 입력한다. 앞에 임의의 값이 붙어 중복되는 이름을 작성해도 되지만 최대한 어떤 변경 사항이 있었는지 표현할 수 있는 단어로 작성해 두는 편.

    npm run typeorm migration:generate /src/migrations/${migration-file-name}
    
  5. migration 파일에 작성된 SQL문을 실행. 알아서 가장 최신의 변경사항 파일을 실행시켜준다.

    npm run typeorm migration:run