NestJS Provider Scope에 대하여

·2022년 7월 1일
3

SKILL

목록 보기
9/16

진짜 정말로 당황스러웠던 질문이다.

Provider를 통하여 IoC DI가 적용이 된다. 라고 답변을 했을 때 나온 꼬리질문

그럼 Provider Scope에 대해서 아시나요?

면접 2일 전, Nest의 아키텍처를 정리하기 위해 작업을 하던 중
선배 개발자분께서 저런게 있으니 알아두면 좋다. 라고 하셨던 것이 생각났다.

근데 저걸 신입 지원자한테 물어볼 줄 몰랐지

3가지 옵션이 존재하는데 공식문서에서 이미지를 따와서 설명을 이어가겠다.

Provider Scope


https://docs.nestjs.com/fundamentals/injection-scopes#provider-scope

일단 Provider가 뭔지에 대해서는 Nest의 아키텍처에 대해 정리해놓은 글이 있으니 아래 링크를 참조하면 된다.

Nest의 아키텍처


스코프는 총 3개가 존재하며, 각각 다른 옵션을 가지고 있다.

1. DEFAULT

애플리케이션이 부트스트랩되면 모든 싱글톤 공급자가 인스턴스화가 되어 애플리케이션 전체에 공유된다.
말 그대로 디폴트라서 아무것도 지정하지 않을 경우 적용되는 옵션이다.

즉 이렇게 사용해야 싱글톤 패턴이 적용이 된다고 할 수 있다.

문서상에서도 별다른 일이 없다면 디폴트로 사용하길 권장하고 있다.

2. REQUEST

이것은 요청이 들어올 때 마다 새로운 인스턴스를 생성하고 처리가 완료된 후 GC를 통해 사라진다.

GC에 대해서 적혀있는 포스트

이게 직접 사용해본 적이 없다보니 어떤 때에 사용을 하는지 모르겠는데
캐시처리를 할 경우에 사용한다고 한다.

3. TRANSIENT

이것은 공유가 되지 않으며, 임시 공급자이기 떄문에 사용자가 새로운 전용 인스턴스를 생성한다.


디폴트말고 도대체 왜 쓰는걸까?

사용해본적이 없으니 알 방법이 없어서 그냥 이곳저곳을 다 찾아봤다.

먼저 확인을 한 것은 Nestjs 한국 독스(비공식)


https://wikidocs.net/150160

예시가 마땅한게 없는 것 같아서 또 찾아보니 나온 오버스택플로우의 질문글

https://stackoverflow.com/questions/53679456/nestjs-how-to-register-transient-and-per-web-request-providers


결국은 싱글톤을 사용하면, 모든 상태(리소스)가 공유가 되는 것이 특징인데
요청에 대하여 특정하는 작업이 필요할 경우 사용이 되는 것으로 확인된다.

언제 필요할까 고민해봤는데 그.... 누가 고의로 엄청난 요청을 발생하고 있을 때라던지
티케팅같은거 짤 때 사용하려나 싶기도 하고

그렇지만 새로운 인스턴스를 발생시키는 것이기에 메모리 부하가 심하니 저렇게 범위를 줄여버리는 것보다
로직을 견고하게 짜는게 맞지 않나 싶기도 하다.

로직으로 해결할 수 없는 문제라면 사용해야겠지만, 나중에 디폴트가 아닌 다른 스코프를 써볼 일이 생긴다면
그때 업데이트를 하던가 추가로 글을 적어야겠다.

참고한 자료

A Deep Dive Into the NestJS Injection Scope
NestJS 한국 비공식 문서
우린 공식문서가 제일 좋아

profile
물류 서비스 Backend Software Developer

0개의 댓글