class Human {
pet = Pet();
}
class Pet {}
Human 클래스 안에서 Pet클래스를 생성헀다. Human 클래스는 Pet 클래스에 종속 관계가 형성된다.
class Human {
pet: string;
constructor(pet: string) {
this.pet = pet;
}
}
const human = new Human("cat");
외부에서 객체를 생성할 떄 생성자로 "cat"을 "주입" 해주었다.
class Human {
pet: Pet;
constructor(pet: Pet) {
this.pet = pet;
}
}
class Pet {}
const human = new Human(new Pet());
Human 객체는 클래스 내부에서 Pet 클래스를 생성하여 종속관계를 형성하고, 클래스 외부에서 생성자를 통해 new Pet()을 주입해주었다.
Nest에서의 DI는 클래스 내부에서 다른 클래스를 인스턴트화를 시키지 않는다.
[cats.service.ts]
import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';
@Injectable()
export class CatsService {
private readonly cats: Cat[] = [];
findAll(): Cat[] {
return this.cats;
}
}
@Injectable() decorator는 클래스를 provider로 IOC 컨테이너에 표시한다.
[cats.controller.ts]
import { Controller, Get } from '@nestjs/common';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';
@Controller('cats')
export class CatsController {
constructor(private catsService: CatsService) {}
@Get()
async findAll(): Promise<Cat[]> {
return this.catsService.findAll();
}
}
Cats.controller.ts와 같이 @Injectable로 표시된 서비스를 IOC 컨테이너에서 자동으로 주입을 해준다. 즉 제어권을 IOC 컨테이너(nest runtime system)에 넘기며, 이를 제어 역전(Inversion of Control)이라고 한다.
처음 nest 프로젝트를 할 때 DI 오류만 20번을 넘게 만나며.. 만날때마다 제대로 이해하지도 못하고 어물쩡 해결하다가 매번 1시간이상 소요했다.. 지금와서는 참 편리한 기능이라 생각하지만 nest를 시작하기에 앞서 꼭 제대로 개념을 알아둬야 한다고 생각한다! 나중에 DI 오류에 대해서도 다룰 예정!!
https://docs.nestjs.com/fundamentals/custom-providers - nest 공식 문서
https://tre2man.tistory.com/324 - 종속성 주입에 대한 블로그