Backend

NestJS dependency injection flow

mechaniccoder 2023. 6. 10. 01:27

app이 시작되면 app.module.ts로 부터 시작해서 필요한 dependency들의 인스턴스를 생성합니다. 해당 과정을 단계별로 알아보겠습니다.

  1. App이 시작되면 Injectable 데코레이터로 정의된 class들을 Reflect를 활용해 등록합니다.

  2. App.module.ts부터 시작하여 bottom-up 방식으로 dependencies의 인스턴스를 정의하고 주입합니다. 이때 Injectable로 등록한 class들을 찾을 수 있습니다. TypeScript의 타입을 class에 대한 토큰으로 사용하여 dependency를 정의할때 사용합니다.

    // build된 JavaScript 코드
    MessagesController = __decorate([
        (0, common_1.Controller)('messages'),
        __metadata("design:paramtypes", [messages_service_1.MessagesService])
    ], MessagesController);

    TypeScript를 JavaScript로 트랜스파일링하면 타입 정보가 사라집니다. 따라서 token에 대한 정보를 유지하기 위해 Reflect를 활용하여 해당 타 입에 대한 정보를 유지합니다. 아래 코드를 확인해보면 MessagesController의 dependency인 MessageService에 대한 정보를 metadata로 정 의하는 코드를 확인할 수 있습니다.

  3. Nest는 기본적으로 인스턴스를 Singleton으로 정의하기 때문에 같은 토큰의 dependency를 요청하면 이미 정의되어 있는 Singleton 인스턴스를 반환합니다.