ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Nest.js 개요 및 객체 지향 디자인 패턴 1(DI, Provider)
    FrameWork/Nest.js 2022. 6. 19. 16:17

    JavaScript와 TypeScript의 코드를 검사해주는 역할이다. 즉 eslintrc.js는 검사 기준이 되는 규칙을 적어 놓은 것이다.

    package.json에 들어 가서 확인해보면,  Nest.js에 맞게 elint 추가 pulin도 모두 추가가 되어 있다.

     

     

    NestJS구조&Controller 패턴

    전체적으로 Nest.js는 module 단위로 이동을 한다. 각각 controller나 service가 하나의 class이고, 그 class가 레고 처럼 결합을 해서 하나의 module안에 속하게 된다. 그리고 그러한 module들이 여러개가 있고, 이것들이 하나의 module로 합쳐져서 main.ts에서 실행이 되는 구조이다.

     

     

    Providers & 의존성 주입(DI)

    nest.js 같은 경우 AppController 내부에서 생성자로 AppServce type의 appSeviece를 초기화 한 다음 바로 Appconroller의 멤버 변수 처럼 사용 되고 있다.

     

    @Controller('cats')
    export class AppController {
      constructor(private readonly appService: AppService) {
      this.appService = appService
      }
    
      @Get()
      getHello(): string {
        return this.appService.getHello();
      }
    }

    보통은 인자로 받아도 그 뒤에  생성자 안에서 위의 코드와 같이 초기화 해주는 것이 일반적인데, 그런 것도 없이 바로 사용을 한다.

    위 와 같은 유형을 의존성 주입 패턴(DI)이라고 한다. 

     

    AppController를 소비자라고 가정하고, AppService를 제품이라고 가정한다.

    AppController  - consumer(소비자)

    AppService - product (제품)

     

    위와 같이 소비자와 제품이 있다면 제품을 생산하는 provider도 존재할 것이다. AppController는 소비자이고, 이 소비자는 어떤 provider에 의해서 appService:AppService라는 제품을 받아서 사용하고 있다.

     

     

    Nest.js는 모든 것이 module화 되어 있다. 

    Providers(제공자)

    Nest.js Provider은 핵심은 골자는 다수의 기본 Nest class들이  services - provider, repositories, factories,helper 와 같은 것으로 다뤄 지는 것 이다.  중심이 되는 개념은 provider가 의존성 주입이 될 수 있다는 것인데, 즉 object 는 서로 다양한 관계를 가지며 생성될 수 있다.   object의 인스턴스 변수들을 "연결"하는 것은 대부분 runtime system에 이루어 지도록 맡겨진다.

     

     

    app.controller.ts 에서 제품으로서 appService:AppService를 사용하려면 app.module.ts의 @Module에당 제품을 제공할 provider가 누구인지 명시를 해주어야 한다.

     

    @Injectable()

    Provider로 취급이 되는 것들은 class 정의 위에 의존성 주입이 가능 하다는 의미의 @Injectable 데코레이터가 붙어 있다.

     

    정리

    @Injedctable() 데코레이터로 의존성 주입이 가능하다고 구분해준 class의 경우는 @Modlue({})의 providers 속성에 등록해주면 controller의 생성자에서 service 인스턴스 변수를 인자로 받는 것 만으로도 해당 class에서 멤버 변수로 사용이 가능하다. 

     

    [출처 - https://www.inflearn.com/course/%ED%83%84%ED%83%84%ED%95%9C-%EB%B0%B1%EC%97%94%EB%93%9C-%EB%84%A4%EC%8A%A4%ED%8A%B8/dashboard]

    댓글

Designed by Tistory.