개요
NestJS에서 프로바이더는 서비스나 레포지토리와 같은 클래스의 인스턴스를 애클리케이션에 주입하는 기본 단위이다.
Provider Scope는 이 프로바이더의 생명주기와 범위를 결정하는데 사용되고 각 범위는 프로바이더가 어떻게 인스턴스화되고 사용되는지를 구분한다.
프로바이더 스코프 종류
1. Singleton Scope (기본값)
•
설명 : SCOPE.DEFAULT 또는 별도로 설정하지 않았을 때 적용되는 기본 범위이다.
•
동작 방식 : 프로바이더가 한 번만 생성되며 애플리케이션 전역에서 하나의 인스턴스를 공유하여 사용한다.
•
특징
◦
앱이 시작될 때 인스턴스가 생성되며 앱이 종료될 때까지 유지된다.
◦
모든 요청과 모듈에서 같은 인스턴스를 사용하므로 메모리 효율이 높고 상태가 유지된다.
◦
싱글톤은 대부분 서비스 및 레포지토리에 적합하다.
•
예시
@Injectable({ scope : Scope.DEFAULT }) // 기본값이 싱글톤 스코프
export class ExampleService() {}
TypeScript
복사
2. Transient Scope (일시적 범위)
•
설명 : Scope.TRANSIENT 로 설정된 범위
•
동작 방식 : 이 프로바이더가 주입될 때 마다 새로운 인스턴스가 생성된다.
•
특징
◦
각 요청이나 의존성 주입마다 새로운 인스턴스를 생성하여 개별 요청 간 독립된 상태를 유지한다.
◦
주입받는 컴포넌트마다 고유한 인스턴스가 필요할 경우 적합하다.
◦
독립적이면서 개별적으로 상태를 유지해야 하는 서비스 (예: 특정 작업의 로깅이나 일시적인 작업)에 유용하다.
•
예시
@Injectable({ scope : Scope.TRANSIENT })
export class TransientService() {}
// TransientService는 주입받을 때마다 새로운 인스턴스를 가지게 된다.
TypeScript
복사
CustomLoggerService처럼 각 서비스마다 로깅서비스를 각각 고유의 인스턴스로 가지고 있고 어떤 서비스에서 로그가 찍히는지 구분지어 할 수 있다.
3. Request Scope (요청 범위)
•
설명 : Scope.REQUEST로 설정된 범위
•
동작 방식 : HTTP 요청당 하나의 인스턴스가 생성되어, 요청이 끝날 때까지 해당 인스턴스가 유지된다.
•
특징
◦
각 HTTP 요청에서 별도의 인스턴스를 사용하므로, 한 요청 내에서 의존성 주입을 통해 공유된다.
◦
HTTP 요청마다 독립적인 상태를 유지해야 할 때 적합하다. 예) 트랜잭션과 같이 하나의 요청 동안 독립된 상태를 유지해야 하는 경우
◦
Request Scope는 서버의 부하에 따라 성능에 영향을 줄 수 있으므로 사용하는데 충분한 고려가 필요하다.
•
예시
@Injectable({ scope : Scope.REQUEST })
export class RequestScopedService() {}
// RequsetScopedService는 HTTP 요청 당 하나씩 생성되며 HTTP 요청이 끝나면 소멸된다.
TypeScript
복사