프로바이더는 Nest의 기본 개념이다. 대부분의 기본 Nest 클래스는 서비스, 리포지토리, 팩토리, 헬퍼 등 프로바이더로 취급될 수 있다. 프로바이더의 주요 아이디어는 종속성으로 주입될 수 있다는 것이다. 즉, 객체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 연결하는 기능 대부분은 Nest 런타임 시스템에 위임될 수 있다.
[이미지1]
위와 같이 컨트롤러가 필요로 하는 컴포넌트들이 기능 별로 존재할 때, 컨트롤러가 해당 컴포넌트를 필요할 때 주입시켜주는 것을 주입
이라고 한다.
여기서 각 요소들은 프로바이더가 되는 것이다.
우리는 이전에 service를 controller에 주입시켰다. 즉, service는 큰 의미로 provider인 것이다.
서비스는 sw 개발내의 공통 개념이다. 즉 Nest, js에서만 사용되는 개념이 아니다.
데이터의 유효성을 체크하거나 데이터베이스 아이템을 생성하는 등의 작업을 처리한다.
@Injectable 데코레이터로 감싸져서 모듈에 제공되며, 이 서비스 인스턴스는 어플리케이션 전체서 사용될 수 있다.
즉, A 컨트롤러에서 해당 서비스를 사용한다해서 B 컨트롤러에서 사용 못하는 것이 아니라, B도 해당 서비스를 사용할 수 있고, 다른 컨트롤러 모두 사용할 수 있다.
프로바이더는 종속성으로 주입되어야 한다.
서비스는 프로바이더이기 때문에 종속서으로 주입되어야 하고, 우리는 이전에 DI(의존성)
으로 서비스를 주입했던 것이다.
@Controller('boards')
export class BoardsController {
constructor(private boardService : BoardsService){}
}
바로 이렇게 말이다.
그런데, 여기서 끝나는 것이 아니다.
provider를 의존성으로 Nest 프레임워크가 다루기 위해서는 Nest가 해당 의존성을 다룰 수 있도록 등록해주어야 한다.
즉, 우리가 만든 서비스를 Nestjs 프레임워크가 다룰 수 있도록 프레임워크에 알려주어야 한다는 것이다.
그래서 우리는 app.module.ts
로 가보도록 하자
import { Module } from '@nestjs/common';
import { BoardsModule } from './boards/boards.module';
import { BoardsService } from './boards/boards.service';
@Module({
imports: [BoardsModule],
providers: [BoardsService]
})
export class AppModule {}
다음과 같이 코드를 변경해주면 된다.
@Module 데코레이터에 provider로 우리가 만든 서비스가 추가된 것을 확인할 수 있다.
이로써 이게 Nestjs는 해당 서비스를 다룰 수 있게되고, 컨트롤러가 필요로 할 때 주입할 수 있게 되는 것이다.