[NestJS] Controller, Provider, Module 이란?

NestJS에서 사용하는 Controller, Provider, Module에 대한 간략한 내용을 정리하였습니다.

Controllers

컨트롤러는 들어오는 요청을 처리하고 클라이언트에 응답을 반환하는 역할을 합니다. express의 라우터 같은 역할을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}

@Get()
getHello(): string {
return this.appService.getHello();
}

@Get('/hello')
sayHello(): string {
return 'Hello everyone';
}
}
  • @Controller(): express의 app.use('/', router) 에서 '/'와 같은 역할을 합니다. @Controller('req') 이렇게 인자로 string을 넘겨주면 express에서 app.use('/req', router) 처럼 코드를 작성한 것과 같습니다.
  • @Get(): Route 핸들러(메서드) 데코레이터입니다. HTTP GET 요청을 지정된 경로로 라우팅 합니다. @Get('hello') 이렇게 인자로 string을 넘겨주면 express 에서 router.get('/hello', sayHello) 처럼 코드를 작성한 것과 같습니다.

Providers

Provider는 Nest의 기본 개념입니다. 대부분의 기본 Nest Class 인 services, repositories, factories, helpers 등은 provider로 취급될 수 있습니다. provider는 단순히 @Injectable() 데코레이터가 달린 클래스입니다.

1
2
3
4
5
6
7
8
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}

provider 의 주요 아이디어는 의존성을 주입할 수 있다는 것입니다. 즉, 개체가 서로 다양한 관계를 만들 수 있으며 개체 인스턴스를 "연결"하는 기능은 대부분 Nest 런타임 시스템에 위임할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}

@Get()
getHello(): string {
return this.appService.getHello();
}
}

위의 AppController 생성자에 변수의 타입을 AppService 로 지정해 줌으로써 Nest Injector 가 appService 변수를 AppService의 인스턴스로 만들어줍니다(인스턴스화한다).

Modules

NestJS 에는 모듈이 있습니다. @Module() 데코레이터로 모듈을 만들 수 있습니다.
Nest 어플리케이션을 만들면 최소 하나의 모듈, 루트 모듈(AppModule)이 있습니다.
이 루트 모듈은 Nest가 Module 및 Provider 관계와 의존성을 해결하는 데 사용하는 내부 데이터 구조를 구축하는 시작점입니다. 모듈을 만들면 루트 모듈과 연결되어야 합니다.

1
2
3
4
5
6
7
8
9
10
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

@Module() 데코레이터는 하나의 객체를 인자로 가지며, 객체가 가질 수 있는 프로퍼티는 다음과 같습니다.

  • providers: Nest injector에 의해 인스턴스화되고, 인스턴스들은 모듈 안에서 최소한으로 공유됩니다.
  • controllers: 해당 모듈에서 정의된, 인스턴스화되어야 하는 Controller의 집합입니다.
  • imports: 임포트 된 모듈들의 리스트입니다. 이 리스트의 모듈들은 데코레이터에 사용 중인 모듈에서 필요한 providers를 export 하고 있어야 합니다.
  • exports: providers의 하위 집합으로, 데코레이터를 사용 중인 모듈이 제공받은 Provider의 일부를 내보낼 수 있습니다. 이는 다른 모듈에서 import 할 때 사용됩니다.

파일 생성

Module 생성

1
nest g mo module-name

Controller 생성

1
nest g co controller-name

Service 생성

1
nest g s service-name

Provider 생성

1
nest g pr provider-name

참고

Share