디버깅 일지

NestJS(Mongoose) - Please make sure that the argument DatabaseConnection at index [0] is available in the MongooseModule context. 오류..

Multitab 2022. 12. 12. 21:01

Nest JS와 MongoDB를 연결하는 Mongoose 모듈을 이용해 최대한 기본 예제의 구조를 따르며 2개의 DB를 연결하고 다중 구조를 저장하는 백앤드 개발을 하고 있는 와중에 다음과 같은 오류가 발생했다

더보기

Nest can't resolve dependencies of the (모델이름)(?). Please make sure that the argument DatabaseConnection at index [0] is available in the MongooseModule context.

Potential solutions:
- If DatabaseConnection is a provider, is it part of the current MongooseModule?
- If DatabaseConnection is exported from a separate @Module, is that module imported within MongooseModule?
  @Module({
    imports: [ /* the Module containing DatabaseConnection */ ]
  })

 

처음 봤을때는 건들지도 않은 DataConnection에 문제가 생겼다길래 Mongoose 모듈에 문제가 생긴건가 했는데 그거는 아니였고 설정 값과 일부 셋팅 문제였다.

 

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
    }),
    MongooseModule.forRoot(process.env.GESTURE_DB_URL,
      {connectionName:'DB명1'}),
    MongooseModule.forRoot(process.env.POSTURE_DB_URL,
      {connectionName:'DB명2'}),
    AModule,
    BModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

NestJS에서 여러개의 데이터 베이스에 접근하려면 위와 같이 선언해야한다. 서로 다른 DB URL을 각각 이름을 매겨서 구분하는것인데 밑에 A 모듈과 B모듈은 Nest JS의 일반적인 구조를 안다면 알겠지만 클라이언트에서 값을 받아오거나 DB의 값을 주는 역할을 한다. 그런데 상식적으로 A모듈과 B모듈의 기능들이 동작하면서 다루어야할 값이 어떤 데이터 베이스에 들어갈지를 지정이 되어야 할텐데 위 코드에서는 서로 다른 2개의 DB Connection이 어디에 지정되어야 할지 알수 없는 상황이 된다. 그래서 결국 위 오류는 DBConnection중 어느 Connection에 지정할지를 몰라서 일어나는 오류로 사료된다.

 

그래서 각각의 모듈에 DBConnection을 지정하려면 어떻게 해야하느냐?

1. (name).module.ts으로 명명된 파일에 MongooseModule.forFeature에 모델과 뒤에 해당하는 DBConnection을 지정해줘야한다.

@Module({
    imports: [
        MongooseModule.forFeature(
            [
                { name: A.name,schema: ASchema},
                {name: B.name,schema: BSchema},
                {name: C.name,schema: CSchema},
                {name: D.name,schema: DSchema},
            ],
            '(데이터베이스 연결명)'
        ),
    ],
    controllers: [~Controller],
    providers: [~Service, ~Repository],
})
export class (이름)Module {}

2. (name).service.ts 혹은 Repositiory pattern이 적용된 경우 (name).repository.ts 파일에 선언된 Mongoose 모델 모듈인  @InjectModel에 (모듈명)Model 변수에도 데이터베이스 연결명을 지정해야한다.

export class ~Repository{
    constructor(
        @InjectModel(A.name,'(데이터베이스 연결명)')
        private AModel: Model<ADocument>,
        @InjectModel(B.name,'(데이터베이스 연결명)')
        private BModel : Model<BDocument>,
        @InjectModel(C.name,'(데이터베이스 연결명)')
        private CModel : Model<CDocument>,
        @InjectModel(D.name,'(데이터베이스 연결명)')
        private DModel : Model<DDocument>
    ){}

나는 2번을 뒤늦게 깨달아서 뒤지게 삽질을 했지만 해당 문제에 마주하고 이 글을 보시는 분들은 시간을 절약하기 바랍니다.