Node.JS는 다른 웹 프레임워크와는 다르게, 멀티 스레드 상태 비저장 모델을 따르지 않습니다.
따라서 싱글턴 인스턴스를 사용하는 것은 안정한 방식이고 이는 요청으로 들어오는 모든 정보(DB커넥션 풀, 전역 싱글턴 서비스 등)들을 공유할 수 있습니다.
하지만 GraphQL 애플리케이션의 요청별 캐싱을 한다거나 요청 추적, 멀티테넌시를 지원하기 위해서는 요청 기반으로 생명주기를 제한해야 합니다
멀티 테넌시: 하나의 애플리케이션 인스턴스가 여러 사용자에게 각각 다르게 동작하도록 하는 SW 아키텍처를 말합니다.
Nest.JS에서는 컨트롤러와 프로바이더에 스코프 옵션을 주어 생명주기를 지정하는 방법이 있습니다.
- DEFAULT: 싱글턴 인스턴스가 전체 애플리케이션에 공유됩니다. 애플리케이션이 처음 시스템 구동을 마치면 모든 싱글턴 프로바이더의 인스턴스가 만들어집니다.
- REQUEST: 들어오는 요청마다 별도의 인스턴스가 생성됩니다. 요청을 처리하고 나면 인스턴스는 가비지 컬렉션에 의해 수집됩니다.
- TRANSIENT: '임시'라는 의미로, 이 스코프를 지정한 인스턴스는 공유되지 않습니다. 이 프로바이더를 주입하는 각 컴포넌트는 새로 생성된 전용 인스턴스를 주입받게 됩니다.
Nest.JS에서는 가능한 DEFAULT 스코프를 사용하여 인스턴스 캐시와 초기화가 애플리케이션 시작 중 한 번만 발생하게 하여 메모리, 동작 성능을 향상하는 것을 추천합니다.
Service에 scope 설정하기
import { Injectable, Scope } from '@nestjs/common';
@Injectable({ scope: Scope.REQUEST })
export class AppService {
public getHello(): string {
return 'Hello World!';
}
}
//커스텀 프로바이더를 사용할 시
// {
// provide: 'CACHE_MANAER',
// useClass: CACHE_MANAGER,
// scope: Scope.TRANSIENT
// }
Controller에 scope 설정하기
import { Controller, Get, Scope, UseInterceptors } from '@nestjs/common';
import { AppService } from './app.service';
@Controller({ scope: Scope.REQUEST })
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
'Framework > NestJS' 카테고리의 다른 글
[NestJS] 커스텀 프로바이더 (0) | 2023.05.09 |
---|