[NestJS] - 3. 모듈 구조 - Module/Service/Controller
이제 첫 프로젝트를 생성하고, Hello World를 보여지는 과정을 알아보면서 프로젝트의 대부분의 동작을 구성하는 Module 구조와 작동 방식에 대해 알아보자.
▶ main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
이전 장에서 main.ts가 앱의 진입점이라고 했다. 최초에 AppModule을 생성하는데, 이 때 생성된 모듈인 AppModule이, Root Module, 즉 모든 모듈들을 관리하는 대왕 모듈이라고 생각하면 된다.
NestJS는 module, cotroller, service로 구성된 모듈 구조체가 한 단위이며, 해당 모듈 구조체들이 모여서 Application을 구성한다.
Module에서는 해당 모듈의 컨트롤러와 서비스를 묶어서 관리해주며 사용되어야 하는 다른 모듈이나 모듈 밖의 인스턴스를 가져와 사용할 수 있도록 해준다.
Controller에는 API의 요청과 응답을 처리해준다.
Service에서는 API에서 사용할 비즈니스 로직들을 제공한다.
▶ app.module.ts
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이라는 데코레이터를 통해 모듈임을 선언하며, Nest는 해당 데코레이터를 통해 모듈임을 알아채고, 싱글톤 패턴으로 인스턴스를 생성한다. Nest의 싱글톤 패턴에 대해서는 다음 포스팅에서 다룰 예정이다.
Controllers
Controllers에는 모듈에서 사용할 컨트롤러를 포함하여 사용하며, 컨트롤러는 여느 웹 프레임워크와 마찬가지로 HTTP 요청 라우터의 엔드포인트로 등록이 된다.
Providers
Providers에는 모듈에 필요한 Provider들을 포함하여 사용한다. 해당 Provider들은 모듈에 캡슐화되어 사용되며, 다른 모듈에서 사용하고 싶을 때에는 export하여 사용한다.
Provider은 데이터 처리를 담당하는 컴포넌트로서 담당 역할에 따라서 아래의 명칭을 사용한다.
- Service : 비즈니스 로직 처리
- Pipe : 클라이언트 요청 데이터의 사전 처리
- Guards : 인증
- Exception Filter : 예외처리
- Middleware : 요청과 응답 사이클 도중의 처리
Imports
현재 모듈에서 사용되어야 하는 다른 모듈들을 Import하는 곳이다.
Import한 모듈들의 Providers들을 사용하고 싶으면 exports 처리를 해주어야 한다.
Exports
보일러 플레이트에는 없지만 다른 모듈이 나를 Import 했을 때 사용 가능하도록 제공해줄 Provider들을 작성한다.
▶ 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();
}
}
모듈에 등록된 컨트롤러이다. @Controller라는 데코레이터를 통해 컨트롤러임을 선언한다.
살펴보면 우선 생성자 부분에서 모듈에서 Providers로 공급한 AppService를 가져와 사용할 수 있도록 하게 했다.
Get()은 getHello()의 데코레이터로 붙어있는데 GET 요청의 / 엔드포인트로 사용됨을 의미한다.
getHello()에서는 Providers로 제공된 appService의 getHello()를 통해 데이터를 처리받아 클라이언트에게 응답한다.
▶ app.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
모듈에 등록된 서비스이다. @Injectable 데코레이터를 사용하여 Provider임을 선언한다.
내부에는 사용될 비즈니스 로직을 작성했다. 내용을 보면 Hello World!를 반환한다.
따라서 Hello World가 보여졌던 이유는 루트 모듈에서 등록된 컨트롤러의 엔드포인트가 라우터에 NestJS에 의해 등록되었고, 컨트롤러는 Provider로 주입된 AppService에 의해 받은 Hello World를 응답으로 내보냈던 것이다.
다음 장에서는 여러개의 모듈을 만들어보고, NestJS의 핵심 개념인 DI / IoC에 대해서 살펴보려고 한다.
해당 강의를 들으면서 학습한 내용을 바탕으로 저만의 프로젝트를 만드는 과정을 기록하여 남기는 것을 목표로 하고 있습니다.
주관적인 생각이 들어가 있을 수 있으므로 혹시 틀린 내용이 있다면 피드백 부탁드립니다.
'Backend > Node.js (NestJS)' 카테고리의 다른 글
[NestJS] - 5. 모듈 의존성 주입, 다른 모듈의 서비스를 사용해보자 (0) | 2023.02.09 |
---|---|
[NestJS] - 4. DI / IoC (의존성 주입/제어의 역전) (0) | 2023.02.09 |
[NestJS] - 2. NestJS 프로젝트 생성 (0) | 2023.02.08 |
[NestJS] - 1. NestJS 소개 (0) | 2023.02.08 |
[GraphQL] Apollo Server로 GraphQL API 서버 만들기 (2) (0) | 2023.01.21 |