nestJs의 injectable이란...

양진영·2023년 2월 7일
0

nestJs

목록 보기
3/10

nestjs는 참 많은 기능을 제공해준다. 자체 제공해주는 기능이 많은것은 좋으나 아무래도 어떻게 그 기능이 동작하는지 알지 못한체로 개발하는것은 조금 불안할수 있다. 처음 nestjs를 배울때는 그냥 기능 하나하나 익히느라 그런것들을 신경쓰지 않았었는데 기능이 손에 익기 시작하니 조금씩 궁금해지기 시작했다. 이건 왜 이렇게 되는거지? 저건 왜 저렇게 되는거지? 많은 궁금증이 있었지만 그중 injectable에 대한 궁금증이 조금 많았다. injectable.. 서비스 로직을 만들때 아무생각 없이 사용했던 기능이었는데 조금더 알아보는 시간을 가졌고 생각보다 중요한 역할을 하는 녀석이었던것 같다. 그럼 이제부터 내가 공부하며 알게되었던 내용을 공유 해보도록 하겠다.

injectable에 대한 고찰:

injectable이 하는 역할은 클래스를 만들고 해당 클래스가 주입이 가능한 상태로 만들준다. 이후 주입이 가능해진 클래스는 원하는곳에 사용이 가능한대 조건이 있다면 주입을 해주어야한다. injectable로 주입이 가능한 상태로 만들어 놓은것일 뿐이지 자동으로 주입이 되진않기 때문에 사용하고자 하는 모듈에 존재하는 providers에 등록을 시켜야 한다. providers에 등록된 class는 DI, dependancy injection(의존성 주입)이 되는것이다. => providers에 넣어야 주입(사용이 가능하다)이 된다.

위에서 module내부에서 선언된 providers 안에 class값을 넣어줘야 해당 클래스를 주입하여 사용이 가능하다고 말했었다.

하지만 providers안에 들어가는 내용은 단순하게 injectable된 클래스만 넣으면 알아서 다되는것이 아니라 원본이 있다.

app.module.ts

providers: [
    {
      provide: 'CUSTOM_KEY',
      useValue: '1q2w3e4r',
    },
    {
      provide: AppService,
      useClass: AppService,
    },
    ConfigService,
  ],

=>
ConfigService만 선언해도 nest에서 알아서 provide:ConfigService, useClass:ConfigService 라고 관리해준다.

하지만 원본은 객채안에 provide와 useClass(useValue, useFactory)이다.

꼭 injectable한 class만 사용가능한게 아니라 내가 커스텀할수도 있다.

  • provide자리에는 고유한 키가 들어가야 하지만 injectable로 선언된 class명을 입력하면 그 class명 nest에서 자체를 고유한 키로 잡아준다
  • provide에서 선언한 키를 가지고 실제로 사용할 class를 적어주는곳이 useClass이다.
  • useClass외 useValue(특정 값이 리턴된다.)라던가 useFactory(어떠한 함수가 들어가 return값으로 선언된다)도 있다.
  • 내가 커스텀하여 사용할수도 있다. => CUSTOM_KEY를 주입하면 그값으로 1q2w3e4r 을 사용하수있다.
  • 하지만 class가 아니라면 @Inject('CUSTOM_KEY')를 해줘야 사용이 가능하다.
app.controller.ts
import { Controller, Get, Inject } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(
    private readonly appService: AppService,
    @Inject('CUSTOM_KEY')
    private readonly customKey,
  ) {}

  @Get()
  getHello(): string {
    const customProvider = this.customKey;

    return this.appService.getHello();
  }
}

정리해보자면 injectable은 꼭 service로직을 만드는데에만 사용되는것이 아니라 무엇이든 의존성을 주입하려는 대상에게 사용이 된다. 서비스로 만든 class를 사용했지만 또 커스텀하여 class가 아닌 useFactory 로 선언된 함수의 리턴받거나 useValue처럼 특정 값을 리턴받는등 여러 곳에서 사용될수있으면 injectable을 통해 재사용성, 그리고 모듈간 결합도 느스하게 만들수 있었다.

profile
왜? 라는 질문을 중요시하는 서버 개발자입니다

0개의 댓글