[ 9/6 삽질 기록 ] 험난한 typeORM 사용기
🌈 프로그래밍/삽질

[ 9/6 삽질 기록 ] 험난한 typeORM 사용기

반응형

 

config를 인식하지 못하는 문제

  • 우선, typeorm을 간단히 소개하자면 현재 내가 사용하는 DB 툴(mysql)에서 스키마를 만들고, 진행하는 프로젝트로 연결을 하기 위해서 사용하기 위한 툴이다. (그 반대 작업도 가능하게 해 줌!)

 

  • 나는 mysql을 사용하였고, typeorm-model-generator를 사용해서 내가 사용할 DB의 스키마들을 nest에서 작성한 뒤, 그 테이블(스키마)들을 mysql로 옮겨주는 작업을 시도했다.

 

  • 이 작업에서 typeorm과 연결하기 위해 필요한 ormconfig.ts라는 파일을 다음과 같이 만들어주었는데 
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import * as dotenv from 'dotenv';
import { ChannelChats } from './src/entities/ChannelChats';
import { ChannelMembers } from './src/entities/ChannelMembers';
import { Channels } from './src/entities/Channels';
import { DMs } from './src/entities/DMs';
import { Mentions } from './src/entities/Mentions';
import { Users } from './src/entities/Users';
import { WorkspaceMembers } from './src/entities/WorkspaceMembers';
import { Workspaces } from './src/entities/Workspaces';

dotenv.config();
const config: TypeOrmModuleOptions = {
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_DATABASE,
  entities: [
    ChannelChats,
    ChannelMembers,
    Channels,
    DMs,
    Mentions,
    Users,
    WorkspaceMembers,
    Workspaces,
  ],
  migrations: [__dirname + '/src/migrations/*.ts'],
  cli: { migrationsDir: 'src/migrations' },
  autoLoadEntities: true,
  charset: 'utf8mb4',
  synchronize: false,
  logging: true,
  keepConnectionAlive: true,
};

export = config;

 

  • 이 파일은 어떤 옵션들을 넣어서 어떻게 DB를 생성할지 그리고.(dot) env와 함께 DB명, DB 비밀번호 등등의 속성을 끌어다가 사용할 수 있도록 하는 일종의 typeorm의 환경 설정 파일이다.

 

  • 이 파일을 만들어주고, app.modules.ts 에서 다음과 같이 forRoot() 속성 안에 ormconfig.ts 파일을 연결(import)을 해주었다.

 

import * as ormconfig from './ormconfig';

 

app.modules.ts에서의 모습

 

  • 그런데 이 녀석이 인식이 안되어서 config를 찾을 수 없다는 오류를 내뱉었다...

 

  • 이때 당시에 뭘 어떻게 해야 할지를 몰라서 임시방편으로다가 ormconfig 파일을 사용하지 않고,
    이런 식으로 대체를 했더니 어찌어찌 해결이 되긴 해서 테이블이 쭉 만들어졌었다!

app.modules.ts 파일 내에서 forRoot 안의 내부 구현을 직접 한 모습

 

npm run start:dev 서버 실행 후, 테이블이 만들어 지는 모습 1

 

npm run start:dev 서버 실행 후, 테이블이 만들어 지는 모습 2

 

 

  • 하지만... 만들어진 테이블 안에 임시 데이터를 넣기 위해서 seeding을 사용하려는데
    마찬가지로 config가 없다는 오류를 내뱉었다 ㅠ

npm run seed:run

 

stack overflow 구글링 결과?!

https://stackoverflow.com/questions/52187328/how-to-specify-ormconfig-ts-for-typeorm

 

how to specify ormconfig.ts for typeorm?

I have created a sample typeorm project using the typeorm cli which has ormconfig.json by default: { "type": "postgres", "host": "localhost", "port": 5432, "username": "postgres", "

stackoverflow.com

 

  • 폭풍 구글링으로 찾아낸 원인?
    • 그러니까 위의 stackoverflow를 읽어보면, typeorm은 ormconfig.json 파일을 읽고, ormconfig.ts 파일은
      읽지 못하는? 그런 게 있다고 한다.

 

그래서 ts 파일을 제대로 읽게 하려면 package.json의 script 부분을 수정을 해주어야 한다고 한다!

  • 나 같은 경우는 아래와 같이 typeorm 명령어를 추가해 주었고..
    (package스크립트 추가 사진 첨부)

package.json 파일에서 script 추가

 

  • 어떻게든 ormconfig.ts를 인식시켜야 한다는 것에 초점을 두었다.

 

  • 그러고 나서 dotenv 파일도 프로젝트 전역에서 접근하여 읽을 수 있도록 바꿔주었다! (thanks to 무루뭉!)

  • // 변경 전
    import dotenv from 'dotenv';
    
    // 변경 후
    import * as dotenv from 'dotenv';

 

  • 변경 후 , npm run seed:run 명령어 실행! 그러니 오류가 바뀐 것을 알 수 있었다!!!!

드디어.. ormconfig.ts 파일이 제대로 읽히고 있다는 것을 알게 되었다!
그래서 이전에 임시방편(ormconfig.ts를 이용하지 않는 방법)으로 만들었던 테이블들을 drop 시키고,
다시 한번 제대로 확인해보기 위해서 synchronize : true로 설정한 뒤, 서버를 실행시키니

 

 

ormconfig.ts 적용 후, sleact DB 생성 모습

 

적용이 되어 정상적으로 만든 테이블들이 mysql로 생성되는 모습이다!

그리고 위에서 본 Channels라는 모듈이 없다는 에러는 아래와 같이 경로를 수정해서 해결!

 

Channels 경로 문제 해결 전

 

Channels 경로 문제 해결 후

 

명령어를 통해서 테이블에 임시 데이터 생성!
> npm run seed:run

 

config 인식 문제 해결 후 또 다른 문제..?

 

정상적으로 새로운 워크스페이스가 생성되어 mysql에 저장된 모습

 

typeorm-seeding 결과

 

  • 근데.. 난 분명"일반"이라는 채널을 만들었는데 깨져있는 모습이다..?

또 해결해야 할 게 늘었구나..ㅎㅎ

아무튼 이번 포스팅에서는 거진 2일이 걸려서 해결한 문제였다..

그래도 해결하여 mysql에 생성된 테이블과, 칼럼 데이터를 보니 편-안 했다!

 

 

 

[ typeorm-model-generator 공식 문서 참조 ]
https://www.npmjs.com/package/typeorm-model-generator

 

typeorm-model-generator

Generates models for TypeORM from existing databases.

www.npmjs.com

 

반응형