Search

#020 #Providers & 의존성 주입

 의존성 주입을 하는 이유??

의존성 주입 (Dependency Injection, DI)은 객체 지향 프로그래밍에서 객체의 생성과 객체 간의 의존성을 외부에서 주입하는 패턴이다. 이를 통해 클래스 간의 결합도를 낮추고, 코드의 재사용성을 높이며, 테스트와 유지 보수를 용이하게 한다.
NestJS에서는 의존성 주입 패턴을 핵심 개념으로 채택하여 모듈, 컨트롤러, 서비스 간의 의존성을 관리한다.

 Provider

Provider는 Nest의 기본 개념이다. 서비스, 리포지토리, 팩토리 도우미 등 기본 Nest 클래스의 대부분은 공급자로 취급될 수 있다. 공급자의 주요 아이디어는 의존성을 주입할 수 있다는 것이다. 즉, 개체는 서로 다양한 관계를 만들 수 있으며 객체의 인스턴스를 ‘연결’하는 기능은 대부분 Nest 런타임 시스템에 위임 될 수 있다.

 개념 시각화

→ 컨트롤러는 service의 의존성을 주입 받아서 사용한다. → 이를 위해서 service는 @injectable 데코리이터를 사용해야된다. → controller에서는 생성자에 service를 주입할 수 있게 된다. → module은 이러한 연결성을 관리하고, 이 연결상태를 메모리에 띄우게 하는 컨테이너 역할을 한다.

 app.service

import { Injectable } from '@nestjs/common'; @Injectable() export class AppService { getHello(): string { // 여기서 비즈니스 로직이 실행이 됨. return 'Hello World!'; } }
JavaScript
복사
service는 injectable 데코레이터를 달아서 해당 클래스가 의존성 주입이 가능한 객체라고 명시를 한다.

 app.controller

import { Body, Controller, Get, Logger, Param, Req } from '@nestjs/common'; import { AppService } from './app.service'; import { Request } from 'express'; @Controller('cats') export class AppController { constructor(private readonly appService: AppService) {} // localhost:8000/cats/hello @Get('hello/:id') getHello( @Req() req: Request, @Body() body: any, @Param() params: any, ): string { new Logger().log(params); return this.appService.getHello(); } }
JavaScript
복사
→ 생성자에 injectable 데코레이터를 가진 appService를 주입할 수 있다. → 생성자에 주입하면 service와 controller의 의존성 주입관계는 완성이 되었다. → 하지만 의존성 주입관계라고 해서 사용할 수 있는 것은 아니다, 사용할 수 있으려면 메모리에 떠있어야 되고, 그러기 위해서 이 관계를 메모리에 띄워주는 Module이 필요하다.

 app.module

import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; @Module({ imports: [], controllers: [AppController], providers: [AppService], }) export class AppModule {}
JavaScript
복사
@Module 데코레이터를 가진 객체는 해당 컨트롤러와 공급자 (service)를 연결해주는 역할을 하고 해당 객체를 메모리에 띄워주는 컨테이너 역할을 한다.