socket 공부를 할겸 작은 프로젝트를 만들고, DB와 각 코드들을 세팅 후 코드를 실행시키는데 키자마자 아래 에러가 나타났다.
[Nest] 16206 - 2023. 12. 14. 오후 4:16:01 ERROR [ExceptionHandler] Cannot read properties of undefined (reading 'name')
TypeError: Cannot read properties of undefined (reading 'name')
at new DataSource (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/src/data-source/DataSource.ts:139:29)
at Injector.instantiateClass (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/injector.js:365:19)
at callback (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/injector.js:65:45)
at Injector.resolveConstructorParams (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/injector.js:144:24)
at Injector.loadInstance (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/injector.js:70:13)
at Injector.loadProvider (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/injector.js:97:9)
at /Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/instance-loader.js:56:13
at async Promise.all (index 5)
at InstanceLoader.createInstancesOfProviders (/Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/instance-loader.js:55:9)
at /Users/kwagtaemin/private_code/kaykaytalk_nestjs/kaykaytalk_rest/node_modules/@nestjs/core/injector/instance-loader.js:40:13
NestJS를 하면서 처음 보는 에러,, 구글링도 해보고 chatGPT에게도 물어봤지만 내가 찾고자 하는 해결 방법을 찾지 못했다.
그래서 찾은 방법은 노가다 하는 방법!
우선 해당 코드를 처음부터 천천히 뜯어보면서 코드를 옮겨보도록 했다. 처음부터 옮기다보니 우선 new DataSource
를 보고 DB문제라고 생각했다.
그래서 MySQL과 연결하는 TypeORM Config를 살펴봤다. 실행시키면서 보니 문제는 없었고, AppModule
에서 TypeORM Config module을 import를 해도 문제가 없었다.
그러고나서 user 도메인을 옮겨보는데 갑자기 에러가 발생했다. 그래서 user 코드를 하나씩 뜯어보기로 했다.
// user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserRepository } from './user.repository';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { DataSource } from 'typeorm';
import { UserService } from './user.service';
@Module({
imports: [TypeOrmModule.forFeature([User])],
controllers: [UserController],
providers: [UserService, UserRepository, DataSource],
})
export class UserModule {}
이게 문제의 코드다.
UserSerivce
와 UserRepository
는 DataSoruce
를 의존성 주입하여 queryRunner
를 사용해서 Transaction을 사용하고 있다.
하지만 의존성 주입을 한다해서 모두 다 DataSorce를 Providers에 넣을 필요가 없다는 것..
왜냐하면 우리는 해당 Entity를 사용하기 위해서 Module 데코레이터 안에서 TypeOrmModule
을 사용하면서 DataSource
도 사용하고 있던것,,
만약 providers에 DataSource
를 정의하게되면 여러 모듈에서 충돌이 일어날 수 있기 때문에 굳이 정의를 하지 않도 된다고한다.
맨날 사용하다 이런 작은 실수로 시간을 날려먹게 됐다 ㅠㅠ 나중에 분명 이런일 이 있을 건데 미리 체험했다 생각하고 좋은 경험을 한 것 깉다.