프로바이더(Provider)는 Nest의 핵심 개념 중 하나입니다. 컨트롤러가 요청과 응답을 처리하는 역할을 한다면, 프로바이더는 로직을 따라 업무를 수행하는 역할을 합니다.
프로바이더는 모듈 내에 providers
로 선언된 자바스크립트 클래스입니다. 서비스, 리포지토리, 팩토리, 헬퍼 등과 같은 Nest 클래스 대부분이 프로바이더로 간주됩니다.
프로바이더의 핵심 개념은 디펜던시로 삽입(injected)될 수 있다는 것입니다. 이는 객체가 다른 객체와 다양한 관계를 맺을 수 있으며, 객체 인스턴스의 연결 함수가 Nest 런타임 시스템에 할당될 수 있다는 의미입니다.
이전 글에서 CatsController
를 생성했습니다. 이를 통해 컨트롤러가 HTTP 요청을 처리하고 보다 복잡한 일을 프로바이더에게 할당하는 방법에 대해 알아보도록 하겠습니다.
서비스
서비스는 컨트롤러에서 사용됩니다. 여기서는 간단한 CatsService
를 생성하는 것으로 시작해보겠습니다. 이 서비스는 데이터 저장과 출력을 담당하며, CatsController
에서 사용될 것입니다.
// 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;
}
}
참고로 CLI를 통해 서비스를 만들려면 $ nest g service cats
커맨드를 사용할 수 있습니다.
위에서 생성한 CatsService
는 하나의 프로퍼티와 두 개의 메소드를 갖는 클래스입니다.
새롭게 @Injectable()
데코레이터가 추가되었다는 점에 주목해보시기 바랍니다. 클래스 위에 @Injectable()
데코레이터를 달아줌으로써 이는 모든 Nest 컴포넌트에 주입할 수 있는 프로바이더가 됩니다. 즉, CatsService
가 Nest IoC 컨테이너에 의해 관리될 수 있는 클래스임을 선언하는 것이며 이를 통해 Cat
과 같은 인터페이스에서 이를 사용할 수 있습니다.
// interfaces/cat.interface.ts
export interface Cat {
name: string;
age: number;
breed: string;
}
이제 우리는 정보를 받아올 수 있는 서비스를 만들었습니다.
프로바이더 등록하기
위에서 생성한 서비스와 같은 프로바이더를 컨트롤러에서 사용하려면 이를 모듈에 등록해줘야 합니다.
@Module({
...
providers: [CatService]
}
export class CatsModule {}
컨트롤러에서 사용하기
이제 이를 CatsContoller
내에서 사용해보도록 하겠습니다.
// 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();
}
}
CatService
는 클래스 constructor를 통해 삽입되었습니다. 여기서 private
구문을 사용했는데요. 이를 통해 catService
를 선언하고 동시에 실행할 수 있습니다.
디펜던시 인젝션
디펜던시 인젝션(Dependency Injection)은 Nest의 핵심 디자인 패턴 증 하나입니다. 디펜던시 인젝션에 대한 개념은 앵귤러의 공식 문서를 참고해보시기 바랍니다.
Nest에서는 타입스크립트를 사용하여 무척 간편하게 디펜던시를 관리할 수 있습니다. Nest는 다음과 같이 CatsService
의 인스턴스를 생성하고 반환하여 catsService
를 사용할 수 있습니다. 디펜던시는 컨트롤러의 constructor를 통해 사용할 수 있습니다.
constructor(private catsService: CatsService) {}
참고 자료
'개발 > NestJS' 카테고리의 다른 글
NestJS 기초 (6) 모듈 (0) | 2022.10.04 |
---|---|
NestJS 기초 (4) 데이터베이스 연동 (0) | 2022.10.01 |
NestJS 기초 (3) 컨트롤러 (0) | 2022.09.30 |