본문 바로가기
Nest.js

Nest.js 기본 구조 분석하기

by 홍code 2022. 11. 26.

구조 분석

dist

Nest.js는 주로 Typescript를 기반으로 작성된다. src폴더의 Typescript파일들을 Javascript파일로 컴파일한 결과물이 dist 폴더에 존재한다. 프로젝트를 실행하게 되면, 자동으로 dist 폴더가 생기며, 컴파일한 파일들이 그곳으로 저장되고, dist폴더를 읽게 됩니다.

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

  • nest 프로젝트 root 경로를 설정하는 json 파일이다.

tsconfig.json

  • 어떻게 타입 스크립트를 컴파일할지 설정한다.

tsconfig.build.json

tsconfig.json의 연장선상 파일이며, build를 할 때 필요한 설정들이다.

eslintrc.js

  • 개발자들이 특정한 규칙을 가지고 코드를 깔끔하게 짤 수 있게 도와주는 라이브러리이다. 타입 스크립트를 쓰는 가이드라인을 제시해주거나 문법에 오류가 나면 알려준다.

prettierrc

  • 주로 코드 형식을 맞추는데 사용한다. 어떤 따옴표를 사용할지, Indent값을 어떻게 줄지 와 같은 코드 포맷터 역할을 한다.

package.json

  • 앱이 참조하는 패키지와 앱의 설명들을 명시한다.

src 폴더 분석

main.ts

  • Nest.js의 애플리케이션이 시작되는 파일이다.
/// 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();

NestFactory를 통해 응용프로그램 인스턴스를 생성한다.

NestFactory를 확인해보면 root module을 전달받아 NestFactory는 응용프로그램을 시작하는데 필요한 클래스를 인스턴스화 하고 종속성을 주입을 통해 연결한다고 설명되어 있다.

app.module.ts

  • 애플리케이션의 루트 모듈이다. 추후, 많은 폴더들과 모듈들을 만들게 되는데, 각 모듈들을 이 파일에 import하게 된다.
  • @Module() 데코레이터를 선언해서 사용할 수 있으며, 같은 기능에 해당하는 것들은 하나의 모듈 폴더 안에 넣어서 사용한다.
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

  • @Controller 데코레이터로 선언해 지정할 수 있으며, Module 파일에 controllers 항목에 추가함으로써 Nest.js는 내부적으로 Controller라는 걸 인식해 사용할 수 있다.
  • 컨트롤러는 주로 요청과 응답을 처리해주는 역할을 한다.
  • Controller에 경로 설정은 @Controller("/경로") 첫 번째 인자 값으로 설정할 수 있다.
  • Controller에는 @Get, @Post 등과 같은 RESTFul API에서 사용하는 메서드가 있다.
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}// 의존성 주입

  @Get() // 요청 Get /
  getHello(): string {
    return this.appService.getHello(); // 응답
  }
}

app.service.ts

  • app.service.ts 파일은 Service 역할을 한다.
  • @Service 데코레이터로 선언해 지정할 수 있으며, Module 파일에 providers 항목에 추가함으로써 Nest.js는 내부적으로 Service라는 걸 인식해 사용할 수 있다.
  • Service는 비즈니스 로직을 담당합니다.  우리가 실제 개발하는 로직들은 Service 로직에서 처리한다. **@Injectable()**을 통해 아래 AppService에 작성된 함수들은 의존성 주입(DI)의 대상이 되도록 지정해 준다.
import { Injectable } from '@nestjs/common';

@Injectable() // 의존성 주입의 대상이 됨.
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

app.controller.spec.ts

  • 컨트롤러에 대한 단위 테스트입니다.주로 Jest를 이용하여 단위 테스트를 실행한다.

test

  • app.controller.spec.ts 에선 단위 테스트를 했다면, test폴더 내에선 end-to-end 테스트를 하게 된다.
  • Nest에선 Supertest 라이브러리를 사용하며, HTTP 요청을 쉽게 시물레이션 할 수 있다.

'Nest.js' 카테고리의 다른 글

Nest.js 프로젝트 생성  (0) 2022.11.24

댓글