본문 바로가기

NestJS

Provider

 provider는 프로그램이 제공하는 서비스 기능을 구현하고 수행하는 역할을 맡는 것으로, MVC 모델의 Model에 해당하는 부분이다. 비즈니스 로직을 수행하는 service는 provider에 등록되어 사용된다.

 

 

 service를 설명하기 전 먼저 DI(Dependency Injection)IOC(Inversion of Control)에 대해 설명하겠다.

 

 DI(Dependency Injection)란 하나의 객체가 다른 객체의 의존성을 제공하는 기술을 말한다. 코드의 결합도를 느슨하게 만들고, 객체의 생성과 사용을 분리하여 코드의 가독성과 재사용성을 높여 준다.

 

 어떤 객체가 다른 객체에 의존성이 있을 때, 의존하는 객체에 변경이 생기거나 다른 객체를 사용해야 하는 경우가 생긴다면 관련 코드를 전부 바꿔야 한다. 기존 로직에 새로운 내용이 추가되거나 변경될 때 코드 수정이 많은 코드는 확장성이 적은 코드라고 하고, 객체 간의 의존성이 강하기 때문에 결합도가 높은 코드라고 한다.

 

 필요한 객체를 직접 생성하는 것이 아니라 외부에서 객체를 전달받아 주입해 줌으로써 객체 간의 결합도를 줄이고 유연한 코드를 만드는 방식을 의존성 주입(DI: Dependency Injection)이라고 한다. 

 

 

 

 IOC(Inversion of Control)란 객체 간의 의존성을 외부에 위임하고, 객체가 필요로 하는 의존성을 외부에서 주입받아 사용하도록 하는 개념으로, nestJS는 providers 사이의 관계를 해결해 주는 내장된 Inversion of control("IoC") container를 가지고 있다.

 

 

 

 

 Service는 애플리케이션의 비즈니스 로직이나 데이터 조작 등을 처리하는 역할을 한다. 일반적으로 Service는 Provider로 등록되어 의존성 주입(DI)을 받을 수 있다. Provider는 Service 클래스를 제공하여 해당 Service에 대한 인스턴스를 생성하고 관리한다.

 

 

다음은 Service의 예시이다.

 

import { Injectable } from '@nestjs/common';
import { CreateTestDto } from './dto/create-test.dto';
import { UpdateTestDto } from './dto/update-test.dto';

@Injectable()
export class TestService {
  create(createTestDto: CreateTestDto) {
    return 'This action adds a new test';
  }

  findAll() {
    return `This action returns all test`;
  }

  findOne(id: number) {
    return `This action returns a #${id} test`;
  }

  update(id: number, updateTestDto: UpdateTestDto) {
    return `This action updates a #${id} test`;
  }

  remove(id: number) {
    return `This action removes a #${id} test`;
  }
}

 Service 클래스에는 @Injectable() 데코레이터가 붙어 있다. @Injectable() 데코레이터는 해당 클래스가 Providers로 사용될 것임을 nestJS에게 알려줌으로써, nestJS의 IOC 컨테이너에서 관리할 수 있게 해 준다. @Injectable() 데코레이터로 만들어진 클래스는 기본적으로 nestJS 실행 시 싱글톤(Singleton) 객체로 메모리에 존재하게 된다.

 

 

 

Service를 사용하기 위해서는 Controller에서 constructor를 사용해 생성자를 만들고, TestService를 멤버 변수에 할당해서 사용한다. 이를 통해 TestController에 의존성 주입(DI: Dependency Injection)을 할 수 있다.

 

다음은 Controller의 예시이다.

import { Controller } from '@nestjs/common';
import { TestService } from './test.service';

@Controller('test')
export class TestController {
  constructor(private readonly testService: TestService) {}
  /*
   * code....
   *
   *
   *
   *
   *
   *
   * ....code
   * */
}

 

 

 

 Controller에서 Service를 사용하려면 module 파일의 providers에 Service를 추가해야 한다. 다음은 test의 module 파일의 provider에 Service를 등록한 예시이다. 

 

import { Module } from '@nestjs/common';
import { TestService } from './test.service';
import { TestController } from './test.controller';

@Module({
  controllers: [TestController],
  providers: [TestService]
})
export class TestModule {}

 

'NestJS' 카테고리의 다른 글

NestJS에서 openAI API 연동으로 ChatGPT 활용하기  (0) 2023.08.30
Throttler를 사용한 Rate Limiting  (0) 2023.08.24
Controller  (0) 2023.07.20
NestJS의 프로젝트 구조  (0) 2023.07.18
NestJS 소개  (0) 2023.04.15