반응형
NestJS - 3편 (프로바이더)
프로바이더
2편에서 소개한 컨트롤러가 클라이언트의 요청과 응답을 처리한다면,
제공해야할 데이터의 처리는 프로바이더가 맡는다.
Nest에서 제공하는 프로바이더의 핵심은 의존성을 주입할 수 있다는 점이다. 의존성 주입(Dependency Injection, DI)
쉽게 말하자면 우리가 스프링에서 컨트롤러로 들어온 요청을 서비스에게 보내주었듯 마찬가지로 Nest에서도 컨트롤러에서 서비스로 보내준다.
우선 모듈에 사용할 수 있도록 등록을 해줘야한다.
모듈
@Module({ ... providers: [UsersService] }) export class UsersModule {}
크게 두가지로 나누어 컨트롤러와 서비스를 연결할 수 있다.
상속관계에 있지 않는 생성자 기반 주입 방식
(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로 배우는 백엔드 프로그래밍
반응형
'[NestJS]' 카테고리의 다른 글
[NestJS] - 6편 (DB연결하기 TypeORM 트랜잭션 마이그레이션) (0) | 2022.04.21 |
---|---|
[NestJS] - 5편 (파이프) (0) | 2022.04.20 |
[NestJS] - 4편 (모듈~config파일) (0) | 2022.04.20 |
[NestJS] - 2편 (설치~인터페이스) (0) | 2022.04.18 |
[NestJS] - 1편 (NestJS란?) (0) | 2022.04.18 |