본문 바로가기
개발/프로젝트-식당 웨이팅 앱 FOOD LINE

230615 실전프로젝트15 [Nest.js] 데이터베이스 migration, TypeORM

by 코딩하는짱구 2023. 6. 15.
반응형

✅오늘학습 Keyword

2023.06.14 - [프로젝트] - 230613 실전프로젝트12 [GPS 기반 데이터 조회 속도개선!★]

 

230613 실전프로젝트12 [GPS 기반 데이터 조회 속도개선!★]

✅오늘학습 Keyword 거리계산 함수를 이용하여 user의 위치를 기반으로 식당 목록을 조회, 출력해주는 과정에서 시간이 너무 오래 걸렸다. 나와 우리 팀은 GeoRedis, ElasticSearch, PostGis 세 가지의 방법

veritas-crystal.tistory.com

Nest.js에 migration 환경 세팅하기!

 

✅오늘 겪은 문제

GPS 기반 데이터 조회 속도 개선을 하는 과정중에 PostGis 적용 단계에서 column이 자꾸 삭제되는 에러가 있었다. 이유는 nest.js에서 migration이 아닌 pgAdmin에서 자체적으로 column을 만든게 문제가 아닐까 생각했다. 기존 nest.js에 migration 환경을 세팅하기로했다. 

  • TypeORM설치,  typeorm CLI 실행을 위한 ts-node를 -g로 설치: npm i --save @nestjs/typeorm, npm i --save typeorm, npm i -g ts-node
  • package.json에 코드를 추가하여 typeorm cli사용할 수 있게 한다
  • migration을 생성, 해당 entity도 일치하게 수정
  • migration을 실행하기 위한 DataSource 인스턴스 설정 - typeOrm.config.ts
  • migration을 실행

 

**package.json에 추가한 코드

   "typeorm": "ts-node ./node_modules/typeorm/cli",
    "typeorm:run-migrations": "npm run typeorm migration:run -- -d ./typeOrm.config.ts",
    "typeorm:generate-migration": "npm run typeorm -- -d ./typeOrm.config.ts migration:generate ./migrations/$npm_config_name",
    "typeorm:create-migration": "npm run typeorm -- migration:create ./migrations/$npm_config_name",
    "typeorm:revert-migration": "npm run typeorm -- -d ./typeOrm.config.ts migration:revert"

**migration file 생성

npx typeorm migration:create ./src/migrations/addColumn

위 명령어를 실행하면 루트 디렉토리의 typeOrm.config.ts파일을 찾아서 migrations 배열에 들어있는 migration들을 실행하게된다.

 

**DataSource 인스턴스 생성

// typeOrm.config.ts

import { Stores } from './src/stores/stores.entity';
import { ConfigService } from '@nestjs/config';
import { config } from 'dotenv';
import { DataSource } from 'typeorm';
import { AddColumn1686766534159 } from './src/migrations/1686766534159-addColumn';
import { Waitings } from './src/waitings/waitings.entity';
import { Reviews } from './src/reviews/reviews.entity';
import { Tables } from './src/tables/tables.entity';
import { Users } from './src/auth/users.entity';

config();

const configService = new ConfigService();

export const dataSource = new DataSource({
  type: 'postgres',
  host: configService.get('POSTGRES_HOST'),
  port: 5432,
  username: configService.get('POSTGRES_USERNAME'),
  password: configService.get('POSTGRES_PASSWORD'),
  database: 'temp',
  entities: [Stores, Waitings, Reviews, Tables, Users],
  migrations: [AddColumn1686766534159],
  // migrationsTableName: 'custom_migration_table',
});

dataSource
  .initialize()
  .then(() => {
    console.log('Data Source has been initialized!');
  })
  .catch((error) => {
    console.error('Error during Data Source initialization', error);
  });
# up으로 작성된 변화를 적용시킴
$> npm run typeorm migration:run

# down에 작성된 버전으로 되돌림
$> npm run typeorm migration:revert

 

**DataSource란?

데이터베이스와의 상호작용을 위한 설정을 담고 있는 개체. 

TypeORM의 DataSource는 RDBMS에 따라 초기 데이터베이스 연결, 연결 풀을 설정한다. 

일반적으로 DataSource 인스턴스의 initialize메서드는 애플리케이션 부팅시 호출하고, 데이터베이스 작업을 완전히 마친 후에는 destroy메서드를 호출하여 종료한다. 실제로 웹사이트의 백엔드 서버를 구축하는 경우 백엔드 서버는 항상 실행되므로 DataSource를 파괴하지 않는다.

 

위와 같이 migration을 통해 데이터베이스의 스키마를 변경하고 다시 데이터를 주입하니 컬럼이 자동으로 삭제되는 현상이 사라졌다. 

컬럼이 사라지는 현상이 없어져서 데이터가 끊기지않고 잘 들어가는 모습

 

✅오늘 알게된 점 및 추후 학습 계획

 

1. migration의 의미?

데이터베이스에서 사용하는 migration의 의미는 새로운 테이블을 추가하거나, 속성의 이름을 변경하는 등의 스키마를 변경하는 작업을 의미한다. 이런 migration을 typeorm을 통해 쉽고 안전하게 진행하는 것

 

 

2. 협업을 효율적으로 하는것이 정말 중요한 것 같다. 혼자서 골머리 앓았다면 문제 파악과 해결에 더 많은 시간이 걸렸을텐데 협동하며 공부하니 해결이 빨리 될 뿐더러 더 많은 방법들도 알 수 있어서 정말 좋은 것 같다.

 

**REFERENCES

반응형