각 모듈을 취합한 Appmodule
을 main.ts에서 NestFactory
를 통해 Create되고, app이 실행된다.
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
여기에서 각각 선언되었던 module들이 최종적으로 하나로 취합된다.
ControllerModule, DomainModule 등을 import해서 가져온다.
@Module({
imports: [
ControllerModule,
DomainModule,
InfrastructureModule.forRoot(),
],
controllers: [ApiController],
providers: [ApiService],
})
export class AppModule {}
필요한 모듈을 import해서 사용한다.
필요한 controller
들을 관리하는 module
controller는 Module
에 등록되어 있어야 한다.
만약 Module에 등록되지 않은 경우, Nest Core는 이 Controller가 Runtime시 등록되지 않아, 정의한 Route
정보들을 찾지 못한다.
@Module({
imports: [DomainModule],
controllers: [
RestaurantController,
ReviewController
],
})
export class ControllerModule {}
필요한 service들을 관리하는 module
const services = [
RestaurantService,
ReviewService,
];
@Module({
imports: [
],
providers: [...services],
exports: [...services],
})
export class DomainModule {}
사실은 기능별로 module을 만드는 게 좀 더 가독성이 있지만, 이렇게 한 번에 묶어서 module로 만든다면, 편리하긴 하다 ..
Controller
외에 Service, Repository, Factory, Helper 등의 Dependency(싱글톤)
를 Nest Core가 Register 할 수 있도록 등록하는 곳이라고 이해하면 된다.
이런 Dependency로 등록하기 위해서는 @Injectable()
이라는 Decorator로 선언하여 사용해야 한다.
아래처럼 Global()
Decorator를 모듈에서 선언해주면, 이 모듈에서 export하고자 하는 모든 의존성은 다른 모듈에서 import를 할 필요 없이 사용 가능하다.
import { Global, Module } from '@nestjs/common';
import { TestService } from './test.service';
@Global()
@Module({
providers: [TestService],
exports: [TestService]
})
export class TestModule {}
클라이언트 사이드에서 요청한 Request
가 Router Handler
로 가기 전에 기능을 공통화하여 사용하거나 처리할 수 있다.
참고