타입스크립트 꽝꽝

[TypeScript] MissingDriverError: Wrong driver: "undefined" given. 에러 해결

bimppap 2022. 7. 4. 17:28

 

 

데이터베이스 세팅을 하는데 해당 에러 때문에 2주간 고생을 했었다.

다른 팀원들에게도 도움을 구했었는데 다름 팀원들 컴퓨터에서는 잘 돌아가서 혼란을 많이 줬었다...

 

env 파일을 지정해놨음에도 왜 저렇게 뜨나 해서 디버깅을 돌려보니 env 파일을 왕따시키고 있는 것 마냥 변수를 아예 먹고 있질 못했다. 

 

 

많은 방법을 시도했음에도 불구하고 에러가 해결되지 않아 편법으로 터미널을 이용해 직접 환경 변수를 먹이거나 docker compose 파일에서 env file을 지정해주는 식으로 해결을 했다.

 

그러나 언제까지고 편법으로 승부할 수는 없는 법이다...

 

시도했던 방법들은 아래와 같다. 여기를 많이 참고했다.

 

1) export = config 를 module.exports = config 로 변경

별 차이 없었다.

 

2) export default 사용하기

환경을 3개 이상으로 분리해야 할 땐 사용하기 어렵다.

 

3) config 또는 터미널을 통해 직접 주입

여러 환경을 분리할 땐 사용하기 어렵다.

 

4) docker compose 파일을 통해 env file 지정

코드가 바뀔 때마다 이미지를 새로 만들고 컨테이너를 구성해야해 시간이 오래 걸린다.

 

1은 안 먹혔고, 2와 3은 여러 환경을 적용해야 하는 프로젝트 상 사용할 수 가 없었다. 4가 그나마 먹히긴 했으나(이것도 터미널로 환경을 따로 주입해야 하긴 했지만) 시간이 오래 걸려서 조금만 수정하더라도 오랜 시간을 걸려 확인해야 하니 지치게 만들었다.

 

코드 한 줄 고치고 7분이라니...

 

결국 원인을 찾기 위해 아래 코드 디버깅을 열심히 돌린 결과,,,

import { DatabaseConfigModule } from '@config/database/config.module';
import { AppConfigModule } from '@config/common/config.module';
import { Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [AppConfigModule, DatabaseConfigModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {}

무언가 이상한 걸 발견했다...

AppModule 클래스의 Modules 데코레이터 - imports에선 AppConfigModule(환경 변수를 설정하는 config 파일)를 먼저 import 하도록 순서를 정해놨는데, 디버깅을 돌려보면 DatabaseConfigModule를 먼저 찾고 있었다.

퐝당...

DB config를 먼저 하니까 당연히 디비 관련 환경 변수들이 죄다 undefined로 뜨고 있었던 거다.

분명 순서를 정해놨는데 왜...

 

 

설마?

 

 

...

imports 순서도 중요하지만 import 순서도 중요했던 거였다.

 

생각보다 간단했던 원인에 황당 그 자체였지만...

내 컴퓨터가 이상해서 그렇다는 결론보다는 훨씬 나았다.

어쨋든 해결도 했고!!

 

(+)

docker compose로 돌릴 때는 애플리케이션과 디비가 하나의 도커 네트워크 안에 자동으로 등록되기 때문에 DB 호스트를 디비 컨테이너명으로 해야 하지만, 애플리케이션만 돌릴 때는 DB 호스트를 localhost로 해야 한다.