Nest의 기본 클래스는 Service, Repository, Factory, Helper 등 프로바이더로 취급될 수 있다. 프로바이더의 중요한 속성은 종속성으로 주입 한다는 것이다. 다시 말해서 객체는 서로 다양한 관계를 만들 수 있고, 객체의 인스턴스를 "연결"하는 기능은 대부분 Nest런타임 시스템에 위임될 수 있다.
컨트롤러는 HTTP요청을 처리하고 더 복잡한 작업을 프로바이더에게 위임해야한다.
Nest는 종속성 주입으로 알려진 강력한 디자인 패턴을 기반으로 구축되었다. Nestdㅔ서는 TypeScript 기능 덕분에 종속성이 유형별로 해결되어서 쉽게 관리가 가능하다.
프로바이더는 일반적으로 애플리케이션 수명주기와 동기화된 수명("범위(scope)")를 갖는다. 애플리케이션이 부트스트랩되면 모든 종속성을 해결해야해서 모든 프로바이더를 인스턴스화해야한다. 마찬가지로 애플리케이션이 종료되면 각 프로바이더가 삭제된다.
Nest에서 프로바이더간 관계를 해결하는 내장된 제어반전(IoC) 컨테이너가 있다. 이 기능은 종속성 주입기능의 기본이지만, 훨씬 강력하다.
프로바이더를 정의하는 여러가지 방법이 있는데, 일반 값, 클래스 및 비동기 또는 동기 팩토리를 사용할 수 있다.
경우에 따라서 반드시 해결하지 않아도 되는 종속성이 있을 수 있다. 예를 들면, 클래스는 구성 객체에 종속될 수 있지만 전달되는 것이 없으면 기본값을 사용해야한다. 이 경우에는 구성 프로바이더가 없어도 오류가 발생하지 않아서 종속성이 선택사항이 된다.
@Optional()
데코레이터는 프로바이더가 선택사항임을 나타낼 때 사용한다.
프로바이더는 생성자 메서드를 통해서 주입되기 때문에 지금까지 사용한 기술을 생성자 기반 주입이라고 한다. 하지만 특수한 경우에 속성 기반 주입이 유용할 수 있다.
기존 인스턴스를 가져오거나 프로바이더를 동적으로 인스턴화 하려면 모듈 참조를 사용할 수 있다.
bootstrap()
함수 내에서 프로바이더를 가져오려면(예: 컨트롤러가 없는 독립형 애플리케이션 또는 부트스트랩중에 구성서비스를 활용하려면) 독립형 애플리케이션을 참조하면 된다.