[NestJS] Modules & Controllers & Providers (1)

NestJS의 가장 기본적인 구성요소들을 알아보자

NestJS는 상당히 구조가 잘 잡힌 프레임워크다.

DI(Dependency Injection)을 권장하고 있어서 그런지 스프링과 비슷한 느낌을 준다.

 

처음 프로젝트를 생성하면 나오는 파일들을 다시 한 번 가볍게 살펴보자.

 

- main.ts

  - 프로그램 엔트리 파일

  - NestFactory를 통해 Nest Application 인스턴스를 생성한다

- app.module.ts

  - Nest Application의 root 모듈

  - main.ts에서 인스턴스 생성에 사용한다

- app.controller.ts

  - 최초에 생성해주는 컨트롤러

  - Request를 받아주는 역할

- app.service.ts

  - 최초에 생성해주는 서비스 (Provider로 분류된다)

  - 비즈니스 로직을 컴포넌트화 하여 분리하는 역할

- app.controller.spec.ts

  - 유닛 테스트를 위한 파일. 지금은 신경쓰지 말자.

 

[Module]

클래스에 @Module() 데코레이터를 붙여서 선언한다.

모든 Nest 어플리케이션은 최소 한 개의 root 모듈을 가진다.

 

Root 모듈 하나로도 어플리케이션 구성은 가능하다.

하지만 컴포넌트들을 구조화하기 위해 기능과 역할에 맞춰 모듈화 해주는 것이 좋다.

ex) AuthModule, UserModule, OrderModule, ChatModule, etc.

 

@Module() 데코레이터는 모듈의 속성을 표현하는 한 개의 객체를 인자로 받는다.

@Module({
  imports: [],
  controllers: [],
  providers: [],
  exports: [],
})

- imports

  - 현재 모듈에서 import할 Module들을 포함하는 배열

  - import 할 모듈들은 현재 모듈에서 사용할 Providerexport 해줘야한다

- controllers

  - 이 모듈에서 사용할 Controller들을 포함하는 배열

  - 현재 모듈이 Root 모듈에 import 되면 Nest에 의해 Route Endpoint로서 기능한다

- providers

  - 현재 모듈에 집어넣을 Provider들을 포함하는 배열

  - Provider들은 모듈 안에 캡슐화되므로 현재 모듈 밖에서 사용하려면 export 해줘야한다

- exports

  - 현재 모듈에 지정한 providers 배열의 subset.

  - 다른 모듈에서 import 하여 사용할 Provider들을 포함하는 배열

 

예를 들어 UserModule을 만든다고 생각해보자.

// user.module.ts

@Module({
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
export class UserModule {}

위와 같은 코드가 나올 수 있을 것이다.

- import 할 모듈이 없기 때문에 imports 속성은 넣지 않았다

- UserController, UserService를 모듈에 넣었다

- UserService를 export 하면 다른 모듈에 UserModule을 import 하여 UserService에 접근할 수 있다.

 

이렇게 UserModule을 만들었다면, Root 모듈에 import까지 해주어야 정상적으로 동작한다.

(만약 nest-cli를 이용하여 module의 보일러플레이트를 생성했다면 자동으로 추가되었을 것이다)

// app.module.ts

@Module({
  imports: [UserModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Nest-CLI로 모듈 생성하기

$ nest generate module user

또는

$ nest g mo user

 

[NestJS] Modules & Controllers & Providers (2) 에서 이어집니다.