일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- funnel
- 플러터
- 토이프로젝트
- 캐치마인드
- 광고플랫폼
- Redis
- 스케치데브
- submodules
- git pull
- 사이드프로젝트
- 카카오톡
- 개인앱
- 룩백
- 영원회귀
- nodejs
- 블랙서바이벌
- git
- 이터널리턴
- 개발자를_위한 #PPT팁
- Kotlin
- 페이스북광고
- 코딩공부
- nestjs
- 메모장앱
- 부업
- 스케치퀴즈
- 펀널
- 카카오톡공유하기
- 라인광고플랫폼
- 구글검색광고
- Today
- Total
가을기 Workspace
NestJS module 본문
본 포스팅은 사이드프로젝트 스케치데브를 사용하면서 공부한 nestjs를 정리한 글입니다.
스케치데브가 궁금하시다면: https://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 |