NestJS 프레임워크 사용을 위한 기본 개념에 대해 간략하게 정리해 보고자 한다.
본 포스팅에서는 Providers 와 의존성 주입(Dependency Injection)에 대해 알아보도록 하겠다.
< 목차 >
- 의존성 주입
- Providers
1. 의존성 주입 (Dependency Injection)
// app.controller.ts 파일
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
AppController 클래스 내부의 constructor( ) 함수를 살펴보면 AppService가 매개변수로 전달된 것을 확인할 수 있는데 이러한 패턴을 의존성 주입(Dependency Injection) 패턴이라고 한다.
의존성 주입? (Dependency Injection)
의존성 주입의 기본적인 의미는 외부에서 서비스를 주입(제공)하는 것이다.
다시 말해, 클래스 간 의존성을 클래스 외부에서 주입하는 것으로
객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입 받아 사용하는 것이라고 볼 수 있다.
외부에서 생성자를 통해 AppService를 넣어줌으로써 의존성 주입을 실현하기 위해서는 의존성 주입의 대상을 지정해 줘야만 한다. NestJS에서는 @Injectable( ) 데코레이터를 통해 의존성 주입의 대상임을 알려줄 수 있다. 다음과 같이 @Injectable( ) 데코레이터가 붙을 경우 provider에 의한 주입 대상이 된다는 것을 의미한다.
// app.service.ts 파일
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
2. Providers
의존성 주입을 염두해 두고 provider, AppController, AppService 간의 관계에 대해 다시 생각해 보도록 하자.
AppController를 "소비자"라고 생각한다면, AppService를 "제품"으로 볼 수 있다. 소비자인 AppController는 provider를 통해 제품을 공급 받을 수 있고 공급 받은 제품인 AppService를 AppController 내에서 사용할 수 있게 된다. AppService는 app.module.ts 파일 안에서 다음과 같이 provider로 등록할 수 있다.
// app.module.ts 파일
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
즉, AppController는 app.module.ts 파일 안에서 AppModule의 provider로 등록된 AppService를 인스턴스로 주입 받아서 사용하게 되는 것이다.
Provider에 대해 간략히 정리해 보면 다음과 같다.
- provider의 주요 아이디어는 종속성을 주입할 수 있다는 것이다.
- controller가 소비자라면 service는 제품, provider는 공급자(제품 생산자) 이다.
- AppModule에서 provider를 등록해줘야만 의존성 주입이 가능해진다.
- controller(소비자)는 provider(공급자)가 제공해준 service(제품)를 주입 받아서 사용하게 된다.
Reference)
본 포스팅은 NestJS 공식문서를 참고하여 작성되었습니다.
'Node > NestJS' 카테고리의 다른 글
NestJS - Pipes & Interceptors (0) | 2023.03.26 |
---|---|
NestJS - Exception filter 설정 (0) | 2023.03.16 |
NestJS - LoggerMiddleware 설정 (0) | 2023.03.13 |
NestJS - 캡슐화(Encapsulation) & Modules (0) | 2023.03.10 |
NestJS - 기본 구조 & Controllers (0) | 2023.03.09 |