기본적으로 모듈은 eagerly 로드되므로 애플리케이션이 로드되는 즉시 즉시 필요한지 여부에 관계없이 모든 모듈도 로드됩니다. 이는 대부분의 애플리케이션에는 괜찮지만, 시작 대기 시간(“cold start”)이 중요한 서버리스 환경에서 실행되는 앱/워커에는 병목 현상이 될 수 있습니다.
지연 로딩은 특정 서버리스 함수 호출에 필요한 모듈만 로드하여 부트스트랩 시간을 줄이는 데 도움이 될 수 있습니다. 또한 서버리스 함수가 “워밍업”되면 다른 모듈을 비동기적으로 로드하여 후속 호출에 대한 부트스트랩 시간을 더욱 단축할 수도 있습니다(지연된 모듈 등록).
🖋️
HINT
Angular 프레임워크에 익숙하다면 lazy-loading modules이라는 용어를 본 적이 있을 것입니다. 이 기술은 Nest에서 기능적으로 다르므로 유사한 명명 규칙을 공유하는 완전히 다른 기능으로 생각하세요.
⚠️
WARNING
라이프사이클 훅 메서드는 지연 로드된 모듈과 서비스에서는 호출되지 않는다는 점에 유의하세요.
Lazy loading controllers, gateways, and resolvers#
Nest의 컨트롤러(또는 GraphQL 애플리케이션의 리졸버)는 routes/paths/topics (queries/mutations)의 집합을 나타내므로 LazyModuleLoader 클래스를 사용하여 지연 로드할 수 없습니다.
🚨
WARNING
지연 로드된 모듈 내에 등록된 Controllers, resolvers 및 gateways는 예상대로 작동하지 않습니다. 마찬가지로 미들웨어 함수(MiddlewareConsumer 인터페이스 구현)는 온디맨드 방식으로 등록할 수 없습니다.
예를 들어, 내부에 Fastify 드라이버를 사용하여 REST API(HTTP 애플리케이션)를 구축한다고 가정해 보겠습니다(@nestjs/platform-fastify 패키지 사용). Fastify는 애플리케이션이 준비되거나 메시지를 성공적으로 수신한 후에는 경로를 등록할 수 없습니다. 즉, 모듈의 컨트롤러에 등록된 경로 매핑을 분석하더라도 런타임에 등록할 방법이 없기 때문에 지연 로드된 모든 경로에 액세스할 수 없습니다.
마찬가지로, @nestjs/microservices 패키지의 일부로 제공되는 일부 전송 전략(Kafka, gRPC 또는 RabbitMQ 포함)은 연결이 설정되기 전에 특정 topics/channels을 subscribe/listen해야 합니다. 애플리케이션이 메시지 수신을 시작하면 프레임워크는 새 토픽을 subscribe/listen할 수 없게 됩니다.
마지막으로, 코드 우선 접근 방식이 활성화된 @nestjs/graphql 패키지는 메타데이터를 기반으로 GraphQL 스키마를 즉석에서 자동으로 생성합니다. 즉, 모든 클래스를 미리 로드해야 합니다. 그렇지 않으면 적절하고 유효한 스키마를 생성할 수 없습니다.
가장 일반적으로, 작업자/크론 작업/람다 및 서버리스 함수/웹훅이 입력 인수(경로 경로/날짜/쿼리 매개변수 등)에 따라 다른 서비스(다른 로직)를 트리거해야 하는 상황에서 지연 로드된 모듈을 볼 수 있습니다. 반면에 지연 로딩 모듈은 시작 시간이 다소 무관한 모놀리식 애플리케이션에는 그다지 의미가 없을 수 있습니다.Í