이전 프레임워크 포스팅에서 NestJS를 설명할 때 특징으로 모듈러구조를 가진다고 했다.
❓모듈러구조란?
모듈러 구조는 큰 규모의 소프트웨어를 작은 조각으로 분할하여 개발 및 유지보수를 용이하게 하는 소프트웨어 디자인 패턴이다. 소프트웨어 시스템은 일반적으로 모듈로 구성되며, 각 모듈은 고유한 기능을 수행한다.
모듈러구조를 가진 NestJS에서 모듈의 기능은 정말 중요하다. NestJS의 프로젝트는 여러개의 모듈들이 모여 만들어진다.
기본적으로 루트 모듈이 반드시 하나가 있어야 하고, 거기에 우리에게 필요한 모듈을 하나씩 추가해 나가면서 코드를 완성한다. 추가한 모듈들은 루트모듈에 Import시켜서 사용할 수 있다.
예시로 가져온 코드이다. 아래와 같이 UsersModule을 만들어서 루트모듈(@Module())에 import시켜야 UserModule을 사용할 수 있다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersMudule } from './users/users.module'; // 유저모듈을 끌고와서
@Module({
imports: [UsersModule], // 루트모듈에 Import시킨다.
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
각 모듈들은 컨트롤러(Controller)와 프로바이더(Provider)로 구성된다.
위에 있던 예시코드의 루트모듈을 보면 루트모듈(Module())의 안에 controllers와 providers가 위치해 있는 것을 볼 수 있다. 컨트롤러는 AppController로 프로바이더는 AppService로 지정한 것을 확인할 수 있다.
AppController를 따라가서 보면 클래스 AppController는 이미 AppService와 계층구조를 가지고, appService 클래스를 사용할 수 있게 설정이 되어 있고, 클라이언트에 Get요청을 받아서 this.appService에 있는 getHello()함수를 사용하는 것을 확인할 수 있다.
//app.controller.ts 파일
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는 getHello함수를 호출해 'Hello World!'라는 문자열을 리턴한다.
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
클라이언트가 Get 요청(request)
Get 요청을 받은 컨트롤러가 프로바이더에 this.appService.getHello()호출
프로바이더는 컨트롤러에서 호출한 함수의 동작을 완료해서 'Hello World!'문자열을 반환
문자열을 받은 컨트롤러는 클라이언트에 'Hello World!'문자열을 response해줌
그렇다면 서비스를 동작시키기 위해서는 당연히 모듈과, 컨트롤러, 서비스를 만들어서 구동시켜야한다.
직접 코드를 짜서 작성할 수도 있지만, 일일히 하나씩 import하고 작성하는 불편함을 NestJs는 명령어를 통한 생성으로 간단하게 처리할 수 있다.
일반적으로 원하는 모듈이나 컨트롤러 서비스 등의 기본 코드를 작성하게 될때 위의 제네레이터를 사용하게 된다.
nest g mo
nest g co
nest g s
위와 같이 g는 제네레이트의 약자이소, mo는 모듈, co는 컨트롤러, s는 서비스를 나타낸다.
처음 공식문서를 보고 작성할 때에는 "nest generate module users"와 같이 모두 적게되었는데, npm의 install을 npm i로 쓰듯이 축약어를 알게되고 나서 좀 더 간편하게 "nest g mo users"로 쉽게 작성할 수 있다.