Nest-Provider
Provider란
provider는 Nest에서 가장 기본적인 컨셉입니다. provider의 기본적인 생각은 "의존성으로 주입될 수 있다" 입니다.
갑작스럽게 나온 의존성, 주입이라는 단어는 차차 설명하겠습니다.
provider를 설명하면서 이전에 학습했던 controller
를 만들어 보겠습니다. controller
는 HTTP 요청을 처리하고 provider에게 많은 일을 대리임무수행 시킵니다.
service
cats.service.ts
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
create(cat: Cat) {
this.cats.push(cat);
}
findAll(): Cat[] {
return this.cats;
}
}
위의 CatService
는 provider가 될 수 있는 후보자입니다.CatService
의 특징은 @Injectable()
데코레이터가 있다는 것입니다. @Injectable()
는 Nest가 관리할 수 있게 해주는 데코레이터라고 생각해주면 좋습니다. 쉽게 생각해서 Nest가 CatService
를 가져다가 쓸 수 있도록 해주는 것이죠.
controller
CatService
를 만들었으니 사용해보겠습니다.
Cats.Controller.ts
import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
CatController
의 constructor를 확인해보면 CatService
가 주입되는 것을 볼 수 있습니다.
"주입"보다는 조금 편하게 생각해보죠.constructor(private catsService: CatsService)
를 통해서 catsService
를 선언 하면서 타입으로는 Catservice의 타입을 사용하겠다는 의미로 받아들이면 조금 쉽게 받아들여집니다.
constructor(private catsService: CatsService)
를
export class CatsController {
constructor(private catsService: CatsService) {
this.catsService = catsService
}
...
위와 같이 JS처럼 선언해주지 않아도 됩니다.(TS기능)
의존성주입
의존성주입에 대해서는 사실 간단명료하게 표현하기란 너무 어렵다고 생각합니다.
제가 이해한 의존성 주입은 다음과 같습니다.
햄버거 가게 사장님은 햄버거를 만드는 요리사와 햄버거 레시피가 있습니다.
요리사는 레시피가 있으면 모든 요리를 할 수 있다고 가정해보죠.
햄버거 가게 사장님이 요리사를 채용하면서 불고기버거, 새우버거 레시피를 요리사에게 주어줍니다.
그리고 가게를 운영하면서 불고기버거, 새우버거는 채용한 요리사를 통해 만듭니다.
이 상황에서 햄버거 가게 사장님은 요리사에게 불고기버거, 새우버거의 레시피를 주입했습니다.
요리사는 채용되면서 무슨 버거를 만들지 사장님에 의해 결정이 된 것입니다.
이러한 상황을 의존성 주입이라고 할 수 있겠습니다.
Nest에서 의존성 주입이 이루어지는 방식은 TypeScript의 방법을 이용합니다.
바로 CatController
의 코드와 같이 Type를 지정해주면서 의존성 주입을 해결합니다.
provider 사용
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
})
export class AppModule {}
위와 같이 Module
의 providers에 원하는 Service
를 추가해서 사용하면 됩니다. 동일한 module
안에 있는 Service
를 사용할 떄는 providers
에 등록하여 사용하면 되지만 다른 module
안에 있는 Service
를 사용할 때는 해당 module
에서 export
후 import
해서 사용합니다.
export import 예시
-------------------------------------------------------------
CatModule
import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService],
})
export class CatModule {}
--------------------------------------------------------------
PersonModule
import { Module } from '@nestjs/common';
import { PersonController } from './Person/Person.controller';
import { PersonService } from './Person/Person.service';
@Module({
imports: [CatsService],
controllers: [PersonController],
providers: [PersonService],
})
export class PersonModule {}