Nestjs 구조

haaaalin·2023년 5월 14일
0

Nestjs 구조

main.ts

각 모듈을 취합한 Appmodule을 main.ts에서 NestFactory를 통해 Create되고, app이 실행된다.

async function bootstrap() {

  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

app.module.ts

여기에서 각각 선언되었던 module들이 최종적으로 하나로 취합된다.
ControllerModule, DomainModule 등을 import해서 가져온다.

@Module({
  imports: [
      ControllerModule,
      DomainModule,
      InfrastructureModule.forRoot(),
  ],
  controllers: [ApiController],
  providers: [ApiService],
})
export class AppModule {}

필요한 모듈을 import해서 사용한다.

controller.module.ts

필요한 controller들을 관리하는 module
controller는 Module에 등록되어 있어야 한다.
만약 Module에 등록되지 않은 경우, Nest Core는 이 Controller가 Runtime시 등록되지 않아, 정의한 Route 정보들을 찾지 못한다.

@Module({
    imports: [DomainModule],
    controllers: [
        RestaurantController,
        ReviewController
    ],
})
export class ControllerModule {}

domain.module.ts

필요한 service들을 관리하는 module

const services = [
    RestaurantService,
    ReviewService,
];

@Module({
    imports: [

    ],
    providers: [...services],
    exports: [...services],
})
export class DomainModule {}

사실은 기능별로 module을 만드는 게 좀 더 가독성이 있지만, 이렇게 한 번에 묶어서 module로 만든다면, 편리하긴 하다 ..

Provider란

Controller 외에 Service, Repository, Factory, Helper 등의 Dependency(싱글톤)를 Nest Core가 Register 할 수 있도록 등록하는 곳이라고 이해하면 된다.
이런 Dependency로 등록하기 위해서는 @Injectable() 이라는 Decorator로 선언하여 사용해야 한다.

global 모듈

아래처럼 Global() Decorator를 모듈에서 선언해주면, 이 모듈에서 export하고자 하는 모든 의존성은 다른 모듈에서 import를 할 필요 없이 사용 가능하다.

import { Global, Module } from '@nestjs/common';
import { TestService } from './test.service';
@Global()
@Module({
  providers: [TestService],
  exports: [TestService]
})
export class TestModule {}

Middleware

클라이언트 사이드에서 요청한 RequestRouter Handler로 가기 전에 기능을 공통화하여 사용하거나 처리할 수 있다.

참고

profile
한 걸음 한 걸음 쌓아가자😎

0개의 댓글