dev/nestjs

프로바이더

wlrn566 2023. 2. 8. 23:57


nestjs 에서 컨트롤러는 클라이언트의 요청을 받고 응답을 처리하는 역할을 하고, 보다 복잡한 작업을 프로바이더가 로직을 구성하여 처리하는 역할을 한다.

서비스, 레포지토리, 팩토리, 헬퍼 등 클래스 대부분이 프로바이더로 간주되고 모듈 내에 providers로 선언이 된 클래스이며 dependency로 주입할 수 있다.
dependency 주입의 의미는 다른 객체와 다양한 관계를 가질 수 있고, 객체의 인스턴스를 연결하는 기능은 Nest 런타임 시스템에 위임할 수 있다.

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  getHelloUser(name: string): string {
    return `hello ${name}~`;
  }
}


@Injectable() 데코레이터를 사용하여 Nest IoC 컨테이너에서 관리할 수 있는 클래스임을 선언한다.

IoC (Inversion of Control) 제어의 역전

제어의 역전은 제어의 흐름이 뒤바뀌는 것이다. 프로그래머가 객체를 생성, 연결, 실행을 하는 것을 프로그램상으로 위임하여 프로그램이 제어를 하는 것이다.

DI (Dependency Injection) 의존성 주입

의존성 주입은 제어의 역전의 기술 중 하나이다.
제어의 역전은 프레임워크가 '내가 제어를 할게' 라면 의존성 주입은 '이 클래스를..' 뜻으로 해석하면 된다.


class User{
  private String name;
  private int age;
  
  User(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

public class UserName {
  public static void main(String[] args) {
    User user = new User("soi", 29);
    ...
  }
}



IoC와 DI를 통해 이런식으로 쓰일 클래스를 Nest에서는 타입만 지정해주면 사용할 수 있다.
의존성 주입을 사용하기 위해 타입을 꼭 지정해줘야 한다. NodeJs 환경에서 자바스크립트는 타입을 명시 할 수 없기에 타입스크립트를 사용하게 된다.

@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}
 }


모듈에서 providers 안에 클래스를 설정하면 Nest IoC 컨테이너에서 관리가 되고 서비스에 접근할 수 있다.

@Module({
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}