(NestJS) NestJS 시작하기

2022. 12. 27. 23:49JavaScript

반응형

이 문서에서는 NestJS의 시작에 대해서 다룹니다.

 

NestJS는 Express와 Fastify 위에서 동작하는 JS진영의 백엔드 프레임워크 입니다.

TypeScript로 빌드되며 JS로도 동작합니다.

 

 

NestJS는 Java 진영의 Spring을 모방해서 만든 프레임워크이기 때문에 스프링의 동작방식과 상당히 유사한 부분이 많습니다.

 

예를들어 DI(Dependecy Injection)라든지, IoC(Inversion of control)와 같은 특성은 스프링에서 사용되는 방식입니다.

또한 Spring의 Application Context처럼 INestApplicartionContext가 존재합니다.

 

 

자세한 NestJS의 동작방식과 구성은 차치하고  함께 공식문서를 보며 NestJS를 시작하는 방식에 대해서 알아보겠습니다

 

공식문서의 주소는 아래와 같습니다.

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

 

🧐시작


NestJS를 시작하려면 먼저 NestJS 설치해야합니다.

 

프로젝트 생성을 원하시는 디렉토리에서 아래 명령어를 입력하면 됩니다.

 

npm i -g @nestjs/cli

 

nodejs가 설치되어 있지 않아 npm 명령이 동작하지 않는 경우

 

mac의 경우 homebrew를 이용해

brew install nodejs

를 입력하시고,

 

 

window인 경우

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

위 링크에서 LTS 버전을 다운 받으시면 됩니다.

 

 

 

nodejs가 정상적으로 설치되었다면 npm을 이용해서 nestjs/cli를 설치해주시면 됩니다.

 

 

 

nestjs/cli가 설치되었다면 이제는 프로젝트를 생성할 차례입니다.

 

 

nest new {project-name}

// nest new to-do-app

 

위 명령어를 통해서 nest프로젝트를 생성할 수 있습니다.

 

 

그러면 패키지 관리를 npm으로 할지, yarn으로 할지, pnpm으로 할지 선택할 수 있습니다.

간편한 패지지 관리를 위해 npm을 선택하고 기다리면

 

 

이렇게 반가운 화면이 뜹니다.

 

그리고 vscode에서 프로젝트를 열면

 

 

이렇게 많은 파일이 생성된 것이 보일 것입니다.

 

이렇게 하면 설치가 끝난 것입니다.

 

 

 

🧐NestJS구조 톺아보기


우리가 주목해서 봐야할 디렉토리는 src 디렉토리입니다.

 

 

src 디렉토리를 열면 이렇게 총 5개의 파일이 생성된 것을 볼 수 있습니다.

 

 

  • app.controller.ts
  • app.controller.spec.ts
  • app.module.ts
  • app.service.ts
  • main.ts

 

그럼 main코드 부터 살펴보죠.

 

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

 

비동기 함수인 bootstrap을 실행시키면서 어플리케이션이 실행되는 것을 알 수 있습니다.

 

bootstrap은 NestFactory.create를 먼저 호출합니다.

 

/**
     * Creates an instance of NestApplication.
     *
     * @param module Entry (root) application module class
     * @param options List of options to initialize NestApplication
     *
     * @returns A promise that, when resolved,
     * contains a reference to the NestApplication instance.
     */
    create<T extends INestApplication = INestApplication>(module: any, options?: NestApplicationOptions): Promise<T>;

create 코드입니다.

 

create는 정적 메서드로 module을 파라미터로 받아서 NestApplication 프로미스 인스턴스를 리턴합니다.

 

그리고 app.listen으로 포트번호를 지정해주면 어플리케이션이 지정된 포트에서 서버를 띄우게 됩니다.

 

 

그럼 Module 클래스를 살펴보죠.

 

 

🧐Component와 비슷한 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 {}

 

Java의 어노테이션이 보일 텐데요,

TS에서는 이것을 '데코레이터'라고 부릅니다.

 

Module 데코레이터는 이 클래스가 Module임을 알려주는 데코레이터로,

내부에 메타데이터를 포함하고 있습니다.

 

  • imports: 임포트할 다른 모듈이 들어가는 list입니다.
  • controllers: Nest injector가 초기화할 controller가 들어가는 list입니다.
  • providers:  Nest injector가 초기화할 providers가 들어가는 list입니다.
  • exports: 이 모듈이 다른 모듈로 제공하는 공급자의 하위집합 list입니다.

 

Spring Boot는 사용하신 분들이라면 @Component와 비슷하다는 느낌을 받으셨을 것입니다.

 

Spring Boot는 Autowiring 즉, Component 어노테이션이 붙어있는 클래스를 자동으로 스캔해서 Applicatoin Context에 등록하지만,

NestJS는 이와 다르게 Module에 명시되어 있는 클래스만를 초기화합니다.

 

 

🧐Controller

Spring Boot는 프로젝트를 시작하면 있는것이라곤 SpringApplication.run을 포함하고 있는 메인 클래스하나 달랑 만들어지지만

NestJS는 비교적 친절합니다.

 

무려 컨트롤러와 서비스를 만들어 주니까요.

 

 

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();
  }
}

 

컨트롤러는 Client의 요청을 받는 역할을 합니다.

 

@Controller데코레이터가 스프링의 @RequestMapping, @RestController 역할을 동시에 해주고 있습니다.

그렇기 때문에 @Controller('/api/v1')와 같은 Path 지정이 가능합니다.

 

 

그리고 생성자를 살펴보면, AppService를 생성자 주입 방식으로 주입하고 있습니다.

다만 자바를 쓰시던 분들은 조금 이상함을 느끼실텐데요,

자바의 경우

 

public class AppController {
    private final AppService appService;
    
    public AppController(AppService appService) {
		this.appService = appService;
    }
}

 

이렇게 주입이 되는데, TS의 경우 그렇지 않습니다.

 

TS 문법상, 파라미터 프로퍼티를 자동으로 인스턴스의 필드로 주입할 수 있습니다.

 

 

 

Documentation - Classes

How classes work in TypeScript

www.typescriptlang.org

 

 

그리고 @Get() 데코레이터는 Get요청을 받는다는 의미입니다.

당연하게도 @Put(), @Post(), @Delete(), @Patch() 등이 존재합니다.

 

 

 

🧐Service

Service에서 살펴볼 것은 @Injectable 데코레이터 입니다.

 

간단하게 @Injectable 데코레이터는 IoC 컨테이너에서 관리되는 클래스임을 알려주는 데코레이터입니다.

 

 

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

@Injectable 데코레이터가 붙어있으면 provider임을 명시하는 것이고, @Module providers에 들어가게 됩니다.

 

이 덕분에 어플리케이션이 실행될 때, DI를 통해 controller에 service를 넣어주게 됩니다.

 

 

 

🧐다음으로


이것으로 NestJS의 구조를 간단하게 살펴봤습니다.

 

다음으로는 함께 ToDo App을 만들면서 NestJS 애플리케이션을 고도화 시켜보아요!

반응형

'JavaScript' 카테고리의 다른 글

(JS) var를 지양해야하는 이유  (0) 2022.07.23