[Nest.JS] Provider Scope

곽태민·2023년 5월 27일
0

NestJS

목록 보기
8/8

개요


nest.js 공부를 하다가 Provider Scope에 대한 개념을 보게 되었다. @Injectable() 이렇게 써서 Module에서 Provider에 주입만 시켜봤지 Provider Scope는 처음 들어보는 개념이었다.

그래서 Provider Scope에 대해서 정리를 해보려고한다. (면접 준비 차원...)

Provider란?


우선 먼저 Provider에 대해서 개념을 정리를 하려고한다. Provider는 Nest에서 기본 개념이다. 대부분 Nest Class는 services, repositories, factories, helpersProvider로 취급될 수 있다.

Provider는 단순히 종속성 주입을 할 때 사용을한다. 즉, 객체는 서로 다양한 관계를 만들 수 있고, 객체 인스턴스를 연결하는 기능을 대부분 Nest 런타임에 위임될 수 있다.

예시 코드

// src/app.service.ts
import { Injectable } from `@nestjs/common';

@Injectable()
export class AppService {
	sayHello(): string {
		return 'Hello Nest!!';
	}
}
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
	constructor(private readonly appService: AppService) {}
  
  	@Get()
  	sayHello(): string {
    	return this.appService.sayHello();
    }
}

여기서 궁금한 점은 AppController에서 AppService를 변수 타입으로 지정만 해줬는데 어떻게 AppService의 method를 사용할 수 있을지 궁금해진다.

위에서 설명했지만 Provider의 주요 아이디어는 dependenciesInject할 수 있다.

Nest에서는 Typescript를 사용하여 관리가 쉬워진다. 변수 타입을 AppService로 지정해주면 Nest Injector가 appService 변수를 AppService의 인스턴스로 인스턴스화를 한다.

Provider Scope


Provider는 일반적으로 어플리케이션 수명 주기동기화된 수명 범위를 갖는다. 어플리케이션이 Bootstrap이 되면 모든 종속성을 해결하기 위해 모든 Provider를 인스턴스화 해야한다.

어플리케이션이 종료되면 각 Provider는 소멸된다.

그러나 Provider 수명을 요청 Request-Scoped로 만드는 방법이 있다. 그 방법으로는 총 3가지가 있고, 각각 다른 옵션을 가지고 있다.

1. DEFAULT

어플리케이션이 Bootstrap되면 모든 싱글톤 Provider가 인스턴스화 돼서 어플리케이션 전체에 공유가 된다. 말 그대로 DEFAULT라 아무것도 지정하지 않을 경우 적용되는 옵션이다.

즉, 이렇게 사용해서 싱글톤 패턴이 적용된다고 볼 수 있다.

2. REQUEST

요청이 들어올 때 마다 새로운 인스턴스를 생성하고 처리가 완료되면 가비지 컬렉션을 통해 사라진다.

TRANSIENT

이 옵션은 공유가 되지 않고, 임시 Provider를 주입하는 각 사용자는 새로운 전용 인스턴스를 받는다.

Nest 공식 문서에서는 싱글톤 범위를 사용하는 것을 권장한다. 그 이유는 Node.js가 Single Thread 기반이며, 사용자와 요청 사잉에 Provider를 공유한다는 것은 어플리케이션 시작 중에 인스턴스를 캐시할 수 있고 초기화가 한 번만 발생한다.

profile
Node.js 백엔드 개발자입니다!

0개의 댓글