본문 바로가기

project

Final Project 3주차 (typeorm-seeding)

3주차에 들어서면서 어느정도 기능의 규모가 커지다 보니 연관성있는 데이터들이 많이 생기게 되어 개발단계에서 api들의 기능이 잘 작동하는지 테스트해볼때마다 그  api와 연관된 데이터들을 미리 넣어 줘야 확인을 할 수 있어 번거로움이 느껴졌다.

그래서 예전에 보기만하고 직접 적용해보지는 않았던 seed라는 개념을 이번 프로젝트에 적용해 보기로 했다.

 

먼저, 아래와 같은 패키지를 설치해준다.

npm install typeorm-seeding

 

그리고 ormconfig.js(또는 ormconfig.json)파일에 다음과 같은 코드를 추가해준다.

 

module.exports = {
  ...
  seeds: ['src/database/seeds/**/*.seed.ts'],  // seed파일들을 생성할 경로
  factories: ['src/database/factories/**/*.factory.ts'],
}

 

그 후에 seed파일을 작성해준다. 원하는 데이터만큼 여러 파일을 작성하면 된다.

src/database/seeds/coupon.seed.ts

 

import { Factory, Seeder } from "typeorm-seeding";
import { Connection } from "typeorm";
import { Coupon } from "../entity/Coupon";

export default class CreateUsers implements Seeder {
  public async run(factory: Factory, connection: Connection): Promise<any> {
    const couponData = [
      {
        couponName: "first coupon",
        couponCode: "@first",
        description: "this is first coupon",
        period: 7,
        discount: "10%"
      },
      {
        couponName: "second coupon",
        couponCode: "@second",
        description: "this is second coupon",
        period: 7,
        discount: "20%"
      },
      {
        couponName: "third coupon",
        couponCode: "@third",
        description: "this is third coupon",
        period: 7,
        discount: "30%"
      }
    ];
    await connection.getRepository(Coupon).save(couponData);
  }
}

 

다음으로 package.json의 script에 다음과 같이 추가해준다.

 

"scripts": {
    "seed": "ts-node ./node_modules/typeorm-seeding/dist/cli.js seed"
    ...
  }

 

모두 작성이 끝나면, 터미널에 npm run seed 명령어를 통해 설정되어있는 db에 seed에 작성한 데이터들을 한번에 넣을 수 있다.

 

여기까지는 공식문서에서도 확인할 수 있는 기본 튜토리얼이였다.

하지만 이것을 내가 진행하고 있는 프로젝트에 적용시켰을때 문제가 발생했다.

 

✖ Database connection failed! Check your typeORM config file.
{ MissingDriverError: Wrong driver: "undefined" given. Supported drivers are: 
"cordova", "expo", "mariadb", "mongodb", "mssql", "mysql", "oracle", "postgres", "sqlite", "sqljs", "react-native".

 

이런 오류가 발생하는 이유를 추측해본 결과는 다음과 같다.

내 프로젝트에서는 scripts명령어마다 NODE_ENV로 노드 실행환경을 따로 설정해 놓았고, 그 환경에 따라 연결되는 db가 다르게 되도록 ormconfig를 작성해놓았다. 코드를 보면 이런 모양이다.

 

module.exports = [
  {
    name: "development",
    type: process.env.DB_TYPE,
    ...
  },
  {
    name: "test",
    type: process.env.DB_TYPE,
    ...
  },
  {
    name: "production",
    type: process.env.DB_TYPE,
    ...
  }
];

 

아마도 typeorm-seeding 패키지에서 ormconfig파일을 로드해올 때, 하나의 객체형태가 아닌 배열형태로 이루어져 있어서 제대로 읽어오지 못하는것으로 추측되었다.

이런부분에 따로 옵션으로 줄 수 있는것이 있는지 구글링해봤지만, 특별히 나오는 자료들이 없어서 나는 직접 typeorm-seeding 패키지 파일을 파해쳐보기로 했다.

완전히 다 흐름을 파악하진 못했지만 어느정도 대충 짚어가며 흐름을 따라가다가 다음과같은 부분을 발견하게 되었다.

 

node_modules/typeorm-seeding/dist/cli.js 

 

...
const connection = yield typeorm.createConnection(options);
...

 

연결될 db에 대한 설정들을 입력해줄 수 있는 createConnection이였다.

이곳에서 저 options를 console에 찍어본 결과 ormconfig.js 파일에서 exports한 데이터 그대로가 찍혀있는것을 발견하고,

내가 필요한 development환경에서의 db와 연결이 되도록 다음과 같이 변경해주었다.

 

...
const connection = yield typeorm.createConnection(options[0]);
...

 

이렇게 수정한 후 npm run seed 명령을 실행하니 seed가 정상작동하였다.

이렇게 node_modules안의 파일을 직접수정하는것이 좋은 방법은 아닐거라는 생각은 들지만, 어차피 일단은 내가 개발환경에서만 사용할 목적으로 작성한 seed이기 때문에 크게 상관은 없을것 같아 이대로 적용해보았다. 하지만 이런방법 이외에도 분명 다른방법이 있을것 같아 추후에 좀 더 알아보아야 겠다.