개발/library, framework

[NEST | Prisma] 의도치 않은 DB 연결

prpn97 2023. 11. 5. 18:25

Nest에서 서버를 열 때 DB Connection Pool을 필요할 때 확인하기 위해서 간단하게 로그를 찍어놨는데, 코드를 수정하면서 언젠가부터 의도치 않게 여러 번 DB연결을 하고 있음을 파악했다. 

 

다음은 DB에 접근하는 코드다. 

@Injectable()
export class PrismaService
  extends PrismaClient
  implements OnModuleInit, OnModuleDestroy
{
  constructor(private readonly configService: ConfigService) {
    super({
      datasources: {
        db: {
          url: configService.get('DATABASE_URL'),
        },
      },
    });
  }

  async onModuleInit() {
    console.log('DB CONNECTED!!!!!');
    await this.$connect();
  }

  async onModuleDestroy() {
    console.log('DB DISCONNECTED!!!!!');
    await this.$disconnect();
  }
}

 

onModuleInit, Destroy에서는 각각 모듈을 실행, 소멸할 때 호출되는데, 접근을 확인하기 위해서 여기에 로그를 찍었고, 언젠가부터 자연스럽게 2번이 찍히고 있었나보다. 어떤 상황에서 모듈이 2번 실행되고 있을까? 

 

당연히 모듈이 2번 실행된다는건 모듈을 2번 호출했기 때문이다. 

그래서 새로 주입한 모듈을 확인했는데, 다음과 같이 확인되었다. 

@Module({
  imports: [PrismaModule, AuthModule],
  controllers: [PromotionController],
  providers: [PromotionService, PrismaService],
})
export class PromotionModule {}

 

여기에 답이 있다. 

 

 

2번 호출된 이유는, PrismaModule 안에서 PrismaService를 providers 로 공유하고 있는데 그와 별도로 PromotionModule이라는 모듈에서 PrismaService를 공유하고 있기 때문에 PrismaService의 메서드가 2번 호출된 것이다. 

 

providers에서 PrismaService를 지워줬더니 간단하게 해결되었다. 

 

 

결론

일반적으로 해당 모듈에서 생성된 서비스는 해당 모듈 내에서만 사용하고, 루트에서 모듈을 통해 주입하도록 해야 하는데 이를 정확하게 인지하고 있어야 한다. 이번 기회를 통해 Nest의 구조에 대해 정확히 파악해가고 있는 것 같다.

728x90