-
[Nest.js] 1. Modules 톺아보기서버/Nest.js 2020. 12. 29. 08:34
@Module 데코레이터
데코레이터를 통해 해당 코드가 모듈임을 명시하고 Nest에게 조직화된 구조를 제공한다. @Module 데코레이터는 하나의 객체를 가지는데 다음과 같은 속성을 지닌다.
- providers : Nest injector에 의해 인스턴스화 되는 provider를 의미한다. 해당 모듈을 통해 공유되는 비즈니스 로직이라고 생각하면 좋다.
- controllers : 비즈니스 로직과 연결시켜주는 라우팅 객체라고 이해하는 것이 좋다.
- imports : 해당 모듈에서 필요한 export된 provider 리스트를 의미한다.
- exports : 다른 모듈에서 사용하기 위해 export하는 provider를 의미한다.
즉 provider를 중심으로 이해하는 것이 좋은데, 해당 모듈에서 어떠한 비즈니스 로직들을 사용할 것인지를 먼저 파악하여 providers를 작성한다. 이후 controllers를 통해 라우팅 항목들을 작성하고, imports와 exports를 통해 provider를 외부로 제공하고, 다른 모듈로부터 provider를 받아오면 된다.
Shared Modules
Nest에서는 모듈들이 singletons 디자인을 따르기 때문에 Shared 모듈가 존재한다. 한 번 인스턴스된 모듈들은 다른 모듈들에서 사용할 때, 똑같은 인스턴스를 공유해서 사용한다.
Module re-exporting
@Module({ imports: [CommonModule], exports: [CommonModule], }) export class CoreModule {}
위 코드같이 임포트와 익스포트를 수행할 수 있다. 이를 're-exporting'이라 한다.
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) {} }
CatsModule에서 생성자를 설정함으로써, 의존성을 준 것을 확인할 수 있다.
Global Modules
@Mdoule() 데코레이터 상단에 @Global() 데코레이터를 추가하면 글로벌하게 사용이 가능하다. import를 할 필요가 없다는 것을 의미한다.
Dynamic Modules
모듈 또한 하나의 객체이기 때문에, return 값을 통해 동적으로 설정하는 것이 가능하다.
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, }; } }
위 코드는 entities와 options를 통해 동적으로 providers를 생성하고 있다. 이처럼 동적 모듈을 사용하는 것이 가능하며, 글로벌하게 사용하고 싶다면, 반환 object에 global 속성을 true로 설정하면 된다.
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 {}
imports하기 위해선 위와 같이 사용하면 된다.