app이 시작되면 app.module.ts로 부터 시작해서 필요한 dependency들의 인스턴스를 생성합니다. 해당 과정을 단계별로 알아보겠습니다.
App이 시작되면
Injectable
데코레이터로 정의된 class들을 Reflect를 활용해 등록합니다.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로 정 의하는 코드를 확인할 수 있습니다.
Nest는 기본적으로 인스턴스를 Singleton으로 정의하기 때문에 같은 토큰의 dependency를 요청하면 이미 정의되어 있는 Singleton 인스턴스를 반환합니다.
'Backend' 카테고리의 다른 글
Dto에서 DB 의존성을 없애보자 (0) | 2023.06.18 |
---|