대부분의 기본 Nest 클래스(services, repositories, factories, helpers, and so on)는 provider로 다루어짐
주요 idea는 의존성을 주입하는것
많은 객체들은 다른 객체와 관계를 맺으며, 객체의 인스턴스 연결은 대부분 Nest 런타임에 이루어짐
//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;
}
}
데이터 저장 및 검색을 담당하고 CatsController에서 사용하도록 설계되었으므로 provider로 정의하였음
nest g service cats
위 명령어로 서비스 생성 가능
CatsService는 하나의 프로퍼티와 두개의 메소드로 구현된 기본 클래스이지만 @injectable() 데코레이터가 있다는 점이 새로움
@injectable()는 CatService가 Nest IoC컨테이너에서 관리할 수 있는 클래스라는 것을 선언하는 메타데이터를 attach함
//interfaces/cat.interface.ts
export interface Cat {
name: string;
age: number;
breed: string;
}
//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();
}
}
위 컨트롤러를 실행하기 위해서는 dto와 post요청할 폼이 필요하다.
dto와 post폼은 간단하게 만들어 보았다
해당 경로에 맞게 작서성하여 post폼을 보내고 get요청을 보내면 작성한 데이터를 확인할 수 음
//create-cat.dto.ts
import { Entity } from 'typeorm';
@Entity()
export class CreateCatDto{
name: string;
age: number;
breed: string;
}
<!-- post폼-->
<body><pre style="word-wrap: break-word; white-space: pre-wrap;">[]</pre>
<div>
<form action="/cats" method="post">
<p>이름 : <input type="text" name="name"></p>
<p>나이 : <input type="number" name="name"></p>
<p>breed : <input type="text" name="name"></p>
<input type="submit" value="정보 넘기기">
</div>
</body>
Scopes
프로바이더의 스코프는 애플리케이션의 생명주기와 동기화됨
어플리케이션의 시작되면(bootstrapped) 모든 의존성은 해결되고 모든 프로바이더는 인스턴스와 됨
애플리케이션이 종료되면 프로바이더들도 종료됨
프로바이더들의 생명주기를 지정하는 방법은 다음을 참고
https://docs.nestjs.com/fundamentals/injection-scopes
옵셔널 프로바이더
커스텀프로바이더
프로퍼티 기반 인젝션
프로바이더 등록
위 4개의 내용은 머리에 정확히 정립이 되지않아 다음에 추가할것!
https://docs.nestjs.com/providers