개발이 취미인 사람

[Nest.js] Nest.js 기본 구조 분석하기 본문

백앤드(Back-End)/Nest.js

[Nest.js] Nest.js 기본 구조 분석하기

RyanSin 2021. 11. 6. 23:53
반응형

- 개요

안녕하세요. 이번 시간에는 지난 시간에 만들어 놓은 Nest.js 기본 구조에 대해 분석해보는 시간을 가져보겠습니다.

 

프로젝트를 만들어 보지 않으신 분들은 아래 링크를 통해 프로젝트를 만들어 보시는 걸 추천드리겠습니다.

[Nest.js] Nest.js 개념 및 프로젝트 생성

 

[Nest.js] Nest.js 개념 및 프로젝트 생성

- 개요 안녕하세요. 이번 시간에는 Nest.js 개념 및 프로젝트를 생성해 보는 시간을 가져보겠습니다. - Nest.js 개념 Nest.js 프레임워크가 무엇일까요? 저는 처음에 Next.js(React 프레임워크)로 착각했습

any-ting.tistory.com

 

- 구조 분석

프로젝트를 생성하면 기본적인 구조는 아래와 같습니다. (제일 중요한 몇 가지 폴더를 살펴보겠습니다)

dist : 서버를 실행하면 dist폴더 아래 컴파일 파일이 생성이 됩니다.(TypeScript -> JavaScript)

src : 프로젝트 core 폴더 (실제 작업은 src 하위에서 진행한다.)

src
├── app.controller.spec.ts //단위 테스트 파일
├── app.controller.ts //Controller
├── app.module.ts //Module
├── app.service.ts // Service
└── main.ts

nest-cli.json : 프로젝트 Root 경로를 설정하는 파일

tsconfig.build.json : 컴파일 시 ignore 설정을 하는 파일

tsconfig.json : TypeScript 환경설정을 담당하는 파일

 

 

우리가 개발할 때 손이 가장 많이 가는 src 폴더에 대해 알아보겠습니다.

- src 폴더 분석

main.ts

Nest.js 프로젝트는 main.ts 파일을 통해 서버가 실행됩니다. (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 파일은 수정할 부분이 없다. 핵심적인 부분은 await NestFactory.create(AppModule);이다.

 

NestFactory를 확인해보면 아래와 같은 주석으로 자세하게 설명이 되어있다.

NestFactory를 사용하여 응용 프로그램 인스턴스를 만듭니다.

### 항목 모듈 지정

모듈 매개 변수를 통해 애플리케이션에 필요한 *root module* 을 전달합니다.
일반적으로 애플리케이션 모듈(ApplicationModule)이라고 부른다.
Nest는 이 모듈을 시작으로 종속성 그래프를 조립하고 종속성 주입 프로세스를 시작하고 응용 프로그램을 시작하는 데 필요한 클래스를 인스턴스 화합니다.

NestFactory를 사용해서 응용 프로그램 인스턴스를 만든다고 설명하고 있다.

 

그리고 root module을 전달받아 NestFactory는 응용프로그램을 시작하는데 필요한 클래스를 인스턴스화 하고 종속성을 주입을 통해 연결한다는 걸 알 수 있습니다.

 

말이 참 어렵죠...ㅋㅋ 쉽게 말하면 아래와 같습니다.

root module은  AppModule이며, 해당 AppModule은 애플리케이션 전체에 모듈을 통합한 모듈이다.
NestFactory는 AppModule을 통해 애플리케이션 전체에 모듈을 조립하고 필요한 클래스를 생성해서 서버를 실행한다.

 

- app.module.ts

app.module.ts 파일은 프로젝트에 최상위 모듈입니다.

 

@Module() 데로레이터를 선언해서 사용할 수 있으며, 같은 기능에 해당하는 것들은 하나의 모듈 폴더 안에 넣어서 사용합니다.

Ex) UserController, UserService, UserEntify 와 같은 기능이 UserModule안에 넣어서 사용합니다.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

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

 

- app.controller.ts

app.controller.ts 파일은 Controller 역할을 합니다.

@Controller 데로레이터로 선언해 지정할 수 있으며, Module 파일에 controllers 항목에 추가함으로써 Nest.js는 내부적으로 Controller라는 걸 인식해 사용할 수 있습니다.

 

@Controller는 클라이언트에서 들어오는 "요청"과 "응답"을 반환하는 역할을 합니다.

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에 경로 설정은 @Controller("/경로") 첫 번째 인자 값으로 설정할 수 있습니다.

 

Handler

@Controller에는 @Get, @Post 등과 같은 RESTFul API에서 사용하는 메서드가 있습니다.

 

- app.service.ts

app.service.ts 파일은 Service 역할을 합니다.

@Service 데로레이터로 선언해 지정할 수 있으며, Module 파일에 providers 항목에 추가함으로써 Nest.js는 내부적으로 Service라는 걸 인식해 사용할 수 있습니다.

 

@Service는 비즈니스 로직을 담당합니다.  우리가 실제 개발하는 로직들은 Service 로직에서 처리합니다.

import { Injectable } from '@nestjs/common';

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

Service는 @Injectable 데코레이터를 선언해서 Nest.js는 이것을 다른 곳에서 이 서비스를 사용할 수 있게 만들어줍니다.

 

- app.controller.sepc.ts

app.controller.sepc.ts 파일은 Nest.js에서 해당 Controller를 테스트할 때 사용합니다.

 

자세한 사용 방법은 다음에 자세히 작성하도록 하겠습니다.