[Nest.js]01-5. DI (Dependency Injection)

김지엽·2023년 10월 5일
0
post-custom-banner

Dependency Injection

1. 종속성 (Dependency)

class Human {
	pet = Pet();
}

class Pet {}

Human 클래스 안에서 Pet클래스를 생성헀다. Human 클래스는 Pet 클래스에 종속 관계가 형성된다.

2. 주입 (Injection)

class Human {
	pet: string;
    
    constructor(pet: string) {
    	this.pet = pet;
    }
}

const human = new Human("cat");

외부에서 객체를 생성할 떄 생성자로 "cat"을 "주입" 해주었다.

3. 종속성 주입(DI)

class Human {
	pet: Pet;
    
    constructor(pet: Pet) {
    	this.pet = pet;
    }
}

class Pet {}

const human = new Human(new Pet());

Human 객체는 클래스 내부에서 Pet 클래스를 생성하여 종속관계를 형성하고, 클래스 외부에서 생성자를 통해 new Pet()을 주입해주었다.

4. 제어 역전 (IOC)

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 - 종속성 주입에 대한 블로그

profile
욕심 많은 개발자
post-custom-banner

0개의 댓글