Providers
Providers
๊ณต๊ธ์๋ Nest์ ๊ธฐ๋ณธ ๊ฐ๋
์
๋๋ค. ๋ง์ ๊ธฐ๋ณธ Nest ํด๋์ค๋ ์๋น์ค, ์ ์ฅ์, ํฉํ ๋ฆฌ, ํฌํผ ๋ฑ ๊ณต๊ธ์๋ก ์ทจ๊ธ๋ ์ ์์ต๋๋ค. ๊ณต๊ธ์์ ์ฃผ์ ์์ด๋์ด๋ ์์กด์ฑ์ ์ฃผ์
ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ ์๋ก ๋ค์ํ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ ๊ฐ์ฒด์ "๋ฐฐ์ "๊ธฐ๋ฅ์ Nest ๋ฐํ์ ์์คํ
์ ํฌ๊ฒ ์์ ํ ์ ์์ต๋๋ค. ๊ณต๊ธ์๋ ๋จ์ํ @Injectable()
๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค์
๋๋ค.

์ด์ ์ฅ์์ ์ฐ๋ฆฌ๋ ๊ฐ๋จํ CatsController
๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ปจํธ๋กค๋ฌ๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ๋ ๋ณต์กํ ์์
์ ๊ณต๊ธ์์๊ฒ ์์ํด์ผ ํฉ๋๋ค. ๊ณต๊ธ์๋ ํด๋์ค ์ ์ธ ์์ @Injectable()
๋ฐ์ฝ๋ ์ดํฐ๊ฐ ์๋ ์ผ๋ฐ JavaScript ํด๋์ค์
๋๋ค.
info ํํธ Nest๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ข ์์ฑ์ ๋์์ธํ๊ณ ๊ตฌ์ฑ ํ ์ ์์ผ๋ฏ๋ก SOLID ์์น์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ข์ต๋๋ค.
Services
๊ฐ๋จํ CatsService
๋ฅผ ๋ง๋ค์ด ๋ด
์๋ค. ์ด ์๋น์ค๋ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ฒ์์ ๋ด๋นํ๋ฉฐ CatsController
์์ ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์์ผ๋ฏ๋ก ๊ณต๊ธ์๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฐ๋ผ์ ํด๋์ค๋ฅผ @Injectable()
์ผ๋ก ์ฅ์ํฉ๋๋ค.
@@filename(cats.service)
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;
}
}
@@switch
import { Injectable } from '@nestjs/common';
@Injectable()
export class CatsService {
constructor() {
this.cats = [];
}
create(cat) {
this.cats.push(cat);
}
findAll() {
return this.cats;
}
}
info ํํธ CLI๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ๋ง๋ค๋ ค๋ฉด ๊ฐ๋จํ
$nest g service cats
๋ช ๋ น์ ์คํํ์ญ์์ค.
์ฐ๋ฆฌ์ CatsService
๋ ํ๋์ ์์ฑ๊ณผ ๋ ๊ฐ์ ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ธฐ๋ณธ ํด๋์ค์
๋๋ค. ์ ์ผํ ์๋ก์ด ๊ธฐ๋ฅ์@Injectable()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค. @Injectable()
๋ฐ์ฝ๋ ์ดํฐ๋ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํ์ฌ ์ด ํด๋์ค๊ฐ Nest ๊ณต๊ธ์๋ผ๋ ๊ฒ์ Nest์๊ฒ ์๋ ค์ค๋๋ค. ๊ทธ๊ฑด ๊ทธ๋ ๊ณ , ์ด ์์ ๋ Cat
์ธํฐํ์ด์ค๋ ์ฌ์ฉํ๋๋ฐ, ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ๊ฒ์
๋๋ค:
export interface Cat {
name: string;
age: number;
breed: string;
}
Cat๋ฅผ ๊ฒ์ํ๋ ์๋น์ค ํด๋์ค๊ฐ ์๊ฒผ์ผ๋ CatsController
์์์ ์ฌ์ฉํ์:
@@filename(cats.controller)
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 readonly catsService: CatsService) {}
@Post()
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
@@switch
import { Controller, Get, Post, Body, Bind, Dependencies } from '@nestjs/common';
import { CatsService } from './cats.service';
@Controller('cats')
@Dependencies(CatsService)
export class CatsController {
constructor(catsService) {
this.catsService = catsService;
}
@Post()
@Bind(Body())
async create(createCatDto) {
this.catsService.create(createCatDto);
}
@Get()
async findAll() {
return this.catsService.findAll();
}
}
CatsService
๋ ํด๋์ค ์์ฑ์๋ฅผ ํตํด ์ฃผ์
๋ฉ๋๋ค. private readonly
๊ตฌ๋ฌธ์ ์ฌ์ฉ์ ์ฃผ๋ชฉํ์ญ์์ค. ์ด ์๊ธฐ๋ ์ฐ๋ฆฌ๊ฐ ๋์ผํ ์์น์์ ์ฆ์ catsService
๋ฉค๋ฒ๋ฅผ ์ ์ธํ๊ณ ์ด๊ธฐํ ํ ์์๊ฒ ํ๋ค.
Dependency injection
Nest๋ ์ผ๋ฐ์ ์ผ๋ก ์ข ์ ์ฃผ์ ์ผ๋ก ์๋ ค์ง ๊ฐ๋ ฅํ ๋์์ธ ํจํด์ ์ค์ฌ์ผ๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ๊ณต์ Angular ๋ฌธ์์์ ์ด ๊ฐ๋ ์ ๋ํ ํ๋ฅญํ ๊ธฐ์ฌ๋ฅผ ์ฝ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Nest์ TypeScript ๊ธฐ๋ฅ ๋๋ถ์ ์ข
์์ฑ์ ์ ํ๋ณ๋ก ํด๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ์ข
์์ฑ์ ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์๋ ์์ ์์ Nest๋ CatsService
์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๋ฐํํจ์ผ๋ก์จ (๋๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ฑ๊ธ ํค์ ๊ฒฝ์ฐ ์ด๋ฏธ ๋ค๋ฅธ ๊ณณ์ ์์ฒญ ๋ ๊ฒฝ์ฐ ๊ธฐ์กด ์ธ์คํด์ค๋ฅผ ๋ฐํํ์ฌ) catsService
๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด ์ข
์์ฑ์ ํด๊ฒฐ๋์ด ์ปจํธ๋กค๋ฌ์ ์์ฑ์์๊ฒ ์ ๋ฌ๋๊ฑฐ๋ ํ์๋ ์์ฑ์ ํ ๋น๋ฉ๋๋ค.
constructor(private readonly catsService: CatsService) {}
Scopes
๊ณต๊ธ์๋ ์ผ๋ฐ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ ์๋ช
์ฃผ๊ธฐ์ ๋๊ธฐํ ๋ ์๋ช
( ๋ฒ์
)์ ๊ฐ์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ถํธ ์คํธ๋ฉ ๋ ๋ ๋ชจ๋ ์ข
์์ฑ์ ํด๊ฒฐํด์ผ ํ๋ฏ๋ก ๋ชจ๋ ๊ณต๊ธ์๋ฅผ ์ธ์คํด์คํ ํด์ผ ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋๋ฉด ๊ฐ ๊ณต๊ธ์๊ฐ ์ญ์ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ณต๊ธ์์ ์๋ช
์ ์์ฒญ ๋ฒ์๋ก ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Custom providers
Nest์๋ ๊ณต๊ธ์๊ฐ ๊ด๊ณ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ณธ ์ ๊ณต ์ ์ด ์ญ์ ( "IoC") ์ปจํ
์ด๋๊ฐ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์์์ ์ค๋ช
ํ ์ข
์์ฑ ์ฃผ์
๊ธฐ๋ฅ์ ๊ธฐ์ด๊ฐ ๋์ง๋ง ์ค์ ๋ก ์ง๊ธ๊น์ง ์ค๋ช
ํ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋ ฅํฉ๋๋ค. @Injectable()
๋ฐ์ฝ๋ ์ดํฐ๋ ๋น์ฐ์ ์ผ๊ฐ ์ผ ๋ฟ์ด๋ฉฐ ๊ณต๊ธ์๋ฅผ ์ ์ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ์ค์ ๋ก ์ผ๋ฐ ๊ฐ, ํด๋์ค ๋ฐ ๋น๋๊ธฐ ๋๋ ๋๊ธฐ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๋ง์ ์๊ฐ ์ฌ๊ธฐ์ ์ ๊ณต๋ฉ๋๋ค .
Optional providers
๋๋๋ก, ๋ฐ๋์ ํด๊ฒฐ ๋ ํ์๊ฐ ์๋ ์ข ์์ฑ์ด ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํด๋์ค๋ ๊ตฌ์ฑ ๊ฐ์ฒด์ ์์กดํ ์ ์์ง๋ง ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๊ตฌ์ฑ ๊ณต๊ธ์๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฏ๋ก ์ข ์์ฑ์ด ์ ํ ์ฌํญ์ด๋ฉ๋๋ค.
๊ณต๊ธ์๊ฐ ์ ํ์ ์์ ๋ํ๋ด๋ ค๋ฉด constructor
์๋ช
์ @Optional()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
import { Injectable, Optional, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
constructor(
@Optional() @Inject('HTTP_OPTIONS') private readonly httpClient: T
) {}
}
์์ ์์์ ์ฐ๋ฆฌ๋ ์ปค์คํ
์ ๊ณต์๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ HTTP_OPTIONS
์ปค์คํ
ํ ํฐ์ ํฌํจํ๋ ์ด์ ์
๋๋ค. ์ด์ ์์ ๋ ์์ฑ์์์ ํด๋์ค๋ฅผ ํตํ ์ข
์์ฑ์ ๋ํ๋ด๋ ์์ฑ์ ๊ธฐ๋ฐ ์ฃผ์
์ ๋ณด์ฌ์ค๋๋ค. ์ฌ์ฉ์ ์ง์ ๊ณต๊ธ์ ๋ฐ ๊ด๋ จ ํ ํฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
Property-based injection
์ฐ๋ฆฌ๊ฐ ์ง๊ธ๊น์ง ์ฌ์ฉํ ๊ธฐ์ ์ ์์ฑ์ ๋ฉ์๋๋ฅผ ํตํด ๊ณต๊ธ์๊ฐ ์ฃผ์
๋๋ฏ๋ก constuctor ๊ธฐ๋ฐ ์ฃผ์
์ด๋ผ๊ณ ํฉ๋๋ค. ๋งค์ฐ ํน์ ํ ๊ฒฝ์ฐ์๋ ์์ฑ ๊ธฐ๋ฐ ์ฃผ์
์ด ์ ์ฉ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ต์์ ํด๋์ค๊ฐ ํ๋ ์ด์์ ๊ณต๊ธ์์ ์์กดํ๋ ๊ฒฝ์ฐ ์์ฑ์์ ํ์ ํด๋์ค์์ super()
๋ฅผ ํธ์ถํ์ฌ ๋ชจ๋ ๊ณต๊ธ์๋ฅผ ์ ๋ฌํ๋ ๊ฒ์ ๋งค์ฐ ์ง๋ฃจํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํผํ๊ธฐ ์ํด ์์ฑ ๋ ๋ฒจ์์ @Inject()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class HttpService<T> {
@Inject('HTTP_OPTIONS')
private readonly httpClient: T;
}
warning ๊ฒฝ๊ณ ํด๋์ค๊ฐ ๋ค๋ฅธ ์ ๊ณต์๋ฅผ ํ์ฅํ์ง ์๋ ๊ฒฝ์ฐ ํญ์ ์์ฑ์ ๊ธฐ๋ฐ ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Provider registration
์ด์ ์ฐ๋ฆฌ๋ ๊ณต๊ธ์ (CatsService)๋ฅผ ์ ์ํ๊ณ , ๊ทธ ์๋น์ค์ ์๋น์ (CatsController)๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ์ฃผ์
์ ์ํํ ์ ์๋๋ก Nest์ ์๋น์ค๋ฅผ ๋ฑ๋กํด์ผ ํฉ๋๋ค. ๋ชจ๋ ํ์ผ (app.module.ts
)์ ํธ์งํ๊ณ ์๋น์ค๋ฅผ @Module()
๋ฐ์ฝ๋ ์ดํฐ์ providers
๋ฐฐ์ด์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
@@filename(app.module)
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 {}
Nest๋ ์ด์ CatsController
ํด๋์ค์ ์์กด์ฑ์ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
src
cats
dto
create-cat.dto.ts
interfaces
cat.interface.ts
cats.service.ts
cats.controller.ts
app.module.ts
main.ts
Last updated
Was this helpful?