가을기 Workspace

NestJS module 본문

개발/nodejs

NestJS module

가을기_ 2021. 5. 9. 20:50

본 포스팅은 사이드프로젝트 스케치데브를 사용하면서 공부한 nestjs를 정리한 글입니다.

스케치데브가 궁금하시다면: https://sketchdev.kr

 

스케치데브 - 개발자 캐치마인드

스케치데브는 개발자들만의 IT용어로 즐기는 스케치퀴즈 연상 캐치마인드 게임입니다. 고득점을 한번 노려보세요!

sketchdev.kr

 

 

Nest는 조립하는 프레임워크다.

앞서 언급한 controller, provider 들로 조립을 해야한다.

조립을 하기 위해 Nest가 한 데 모아서 관리를 해야한다.

 

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

 

 

일일히 App에 등록해야할줄 알았는데

@Module({
  controllers: [CatsController, DogsController],
  providers: [CatsService, DogsService],
})
export class AppModule {}

 

모아서 하는게 가능하다.

// ./cats/**/*
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

// ================================
// ./dogs/**/*
import { Module } from '@nestjs/common';
import { DogsController } from './dogs.controller';
import { DogsService } from './dogs.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}


// ================================
import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';
import { DogsModule } from './cats/dogs.module';

@Module({
  imports: [CatsModule, DogsModule],
})
export class AppModule {}

 

완성하게 될 디렉터리 구조

 

Shared Module

개발자의 시간은 금이다. 모듈도 엄청 많아지면 곤란하다.

이를 위해 모듈을 관리하는 모듈 또한 가능하다.

 

 

 

cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

CatsModule만 import하면 CatsService가 필요할 때 inject 받는 것이 가능하다.

 

 

 

Module re-export

@Module({
  imports: [CommonModule],
  exports: [CommonModule],
})
export class CoreModule {}

이러면 CoreModule을 받음으로써 CommonModule도 같이 받아올 수 있다.

 

 

Dependency Injection

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {
  constructor(private catsService: CatsService) {}
}

Config 목적으로 dependency injection이 가능하다.

Circular Dependency를 막기 위해 모듈끼리 injection은 불가능

 

 

Global Module

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}

helpers, database connections 같은 경우 어디서나 쓸 수 있어야 한다.

모듈을 주입받지 않고도 provider를 쓸 수 있는 방법이 필요하다.

이 경우 해당 모듈에 Global decorator를 주면 된다.

 

 

모든 모듈에 global을 줄수도 있다.

하지만 개발자의 시간은 돈이다.

모든 module을 불러야 할테니 처음 실행시 걸리는 시간이 길어질뿐더러,

모든 모듈에 global을 주면 어디서 무엇을 필요로 하는지가 관리하기 어려워진다.

그러니 좋은 api 디자인이 아니므로 지양하자.

 

 

Dynamic module

import { Module, DynamicModule } from '@nestjs/common';
import { createDatabaseProviders } from './database.providers';
import { Connection } from './connection.provider';

@Module({
  providers: [Connection],
})
export class DatabaseModule {
  static forRoot(entities = [], options?): DynamicModule {
    const providers = createDatabaseProviders(options, entities);
    return {
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }
}

위와같이 module 안에서 코드로 module을 만드는 것도 가능하다

 

forRoot는 promise를 통해 비동기로도 가능하다.

  static forRoot(entities = [], options?): Promise<DynamicModule> {
    const providers = createDatabaseProviders(options, entities);
    return Promise{
      module: DatabaseModule,
      providers: providers,
      exports: providers,
    };
  }

dynamic module을 global로 주고 싶다면 아래처럼 global을 추가하자.

{ 
  global: true,
  module: DatabaseModule,
  providers: providers,
  exports: providers,
}
import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
})
export class AppModule {}

 

Dynamic Module은 위와같이 import 된다.

 

import { Module } from '@nestjs/common';
import { DatabaseModule } from './database/database.module';
import { User } from './users/entities/user.entity';

@Module({
  imports: [DatabaseModule.forRoot([User])],
  exports: [DatabaseModule],
})
export class AppModule {}

Dynamic module re-export도 가능.

 

 

이정도면 웹서비스 만들 수 있을 것 같습니다.

글 읽어주셔서 감사합니다.

'개발 > nodejs' 카테고리의 다른 글

Typescript로 object 초기화  (0) 2021.06.16
NestJS mongodb module  (0) 2021.05.09
NestJS provider  (0) 2021.05.09
NestJS controller  (0) 2021.05.09
NestJS 시작하기  (0) 2021.05.09
Comments