본문 바로가기

[NestJS]

[NestJS] - 3편 (프로바이더)

반응형

NestJS - 3편 (프로바이더)

프로바이더

2편에서 소개한 컨트롤러가 클라이언트의 요청과 응답을 처리한다면,
제공해야할 데이터의 처리는 프로바이더가 맡는다.
Nest에서 제공하는 프로바이더의 핵심은 의존성을 주입할 수 있다는 점이다. 의존성 주입(Dependency Injection, DI)

쉽게 말하자면 우리가 스프링에서 컨트롤러로 들어온 요청을 서비스에게 보내주었듯 마찬가지로 Nest에서도 컨트롤러에서 서비스로 보내준다.

  1. 우선 모듈에 사용할 수 있도록 등록을 해줘야한다.
    모듈

    @Module({
        ...
    providers: [UsersService]
    })
    export class UsersModule {}
  2. 크게 두가지로 나누어 컨트롤러와 서비스를 연결할 수 있다.

    • 상속관계에 있지 않는 생성자 기반 주입 방식
      (controller & service로 바로 연결 느낌)
      컨트롤러

      @Controller('users')
      export class UsersController {
      constructor(private readonly usersService: UsersService) {}
          ...
      
          @Delete(':id')
          remove(@Param('id') id: string) {
          return this.usersService.remove(+id);
          }
      }

      서비스

      import { Injectable } from '@nestjs/common';
      
      @Injectable()
      export class UsersService {
          ...
      
          remove(id: number) {
              return `This action removes a #${id} user`;
          }
      }
    • 상속관계에 있는 속성 기반 주입 방식 (super 또는 @Inject 이용)
      컨트롤러에서 서비스B가 호출됨
      베이스 서비스 (@Injectable() 이 없다. BaseService 클래스를 직접 참조하지 않기 때문.)

      export class BaseService {
          constructor(private readonly serviceA: ServiceA) {}
      
          getHello(): string {
              return 'Hello World BASE!';
          }
      
          doSomeFuncFromA(): string {
              return this.serviceA.getHello();
          }
      }

      서비스A

      import { Injectable } from '@nestjs/common';
      
          @Injectable()
          export class ServiceA {
          getHello(): string {
              return 'Hello World A!';
          }
      }
      • Super() 이용시
        서비스B(컨트롤러에서 호출되는 서비스)

         ```
         @Injectable()
         export class ServiceB extends BaseService {
             constructor(private readonly _serviceA: ServiceA) {
                 super(_serviceA);
             }
        
             getHello(): string {
                 return this.doSomeFuncFromA();
             }
         }
         ```
      • @Inject 이용시
        (베이스 서비스에 서비스A Inject)

        export class BaseService {
            @Inject(ServiceA) private readonly serviceA: ServiceA;
                ...
        
                doSomeFuncFromA(): string {
                return this.serviceA.getHello();
            }
        }

참조 : NestJS로 배우는 백엔드 프로그래밍

반응형