[Nest.JS] Nest.JS란?

Subin·2021년 11월 14일
0

Nest.JS 소개

  • 효율적이고 확장 가능한 Node.js 서버 사이드 애플리케이션을 구축용 프레임워크이다.
  • Typrscript로 빌드되며, Javascript도 사용 가능하다.
  • 일반적으로 Express 프레임워크를 사용하지만 선택적으로 Fastify도 사용 가능하다.
  • OOP(객체 지향 프로그래밍), FP(함수형 프로그래밍), FRP(함수형 반응형 프로그래밍) 요소를 결합한다.

Nest.JS 설치

  • 초심자는 Nest CLI를 사용하여 프로젝트 생성하는 것을 권장한다.

    Nest CLI
    Nest CLI는 Nest 애플리케이션을 초기화, 개발, 유지 관리하는 인터페이스 도구이다.

$ npm o -g @nests/cli
$ cd '프로젝트를 생성할 디렉토리 경로'
$ nest new project-name

  • 사용할 패키지 매니저 선택하면 새 프로젝트가 설치되고 초기 Nest 파일 및 지원 모듈로 디렉토리가 채워져 프로젝트의 기본 구조가 생성된다.

Nest.JS 디렉토리 구조

├── node_modules
├── src
│   ├── app.controller.spec.ts
│   ├── app.controller.ts
│   ├── app.module.ts
│   ├── app.service.ts
│   └── main.ts
├── test
├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── nest-cli.json
├── package-lock.json
├── package.json
├── README.md
├── tsconfig.build.json
└── tsconfig.json

eslintrc.js

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

prettierrc

  • 주로 코드 형식을 맞추는데 사용한다.
  • 작은 따옴표(')를 사용할지 큰 따옴표(")를 사용할지 등 코드 포멧터 역할을 한다.

nest-cli.json

  • nest 프로젝트을 위해 특정한 설정을 할 수 있는 파일이다.

tsconfig.json

  • 어떻게 타입스크립트를 컨파일 할지 설정하는 파일이다.

src

  • 대부분의 비즈니스 로직이 들어가있는 폴더이다.

Module

  • Nest가 애플리케이션 구조를 구성하는데 사용하는 메타 데이터를 제공하는@Module() 데코레이터를 사용한다.
  • 각 응용 프로그램은 하나 이상의 모듈(루트 모듈: Nest가 빌드하는데 사용하는 시작점)이 있다.
  • 밀접하게 관련된 기능의 집합으로 구성 요소를 구상하는 효과적인 방법이다.
  • 같은 기능에 해당하는 것들은 하나의 모듈 폴더 안에 넣어서 사용한다.
  • 기본적으로 싱글톤이므로 여러 모듈간에 쉽게 공급자의 동일한 인스턴스를 공유할 수 있다.
  • 모든 모듈은 자동으로 공유 모듈이 되며, 생성되면 모든 모듈에서 재사용할 수 있다.

Controller

  • 기본 컨트롤러를 정의하기 위해 @Controller() 데코레이터를 사용한다.
  • 특정 메소드로 특정 url에 접근하면 무슨 로직을 처리할지 연결하는 부분이다.
  • 들어오는 요청(Request)을 처리하고 응답(Response)을 클라이언트에게 반환한다.

user.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('user')
export class UserController {
  @Get() // GET /user 요청에 매핑
  findAllUsers(): string {
    return 'this action returns all users';
  }

  @Post('/add') // POST /user/add 요청에 매핑
  addUser(): string {
    return 'this action adds new user';
  }
}
  • @Get() 데코레이터는 Nest에 HTTP 요청에 대한 특정 엔드포인트에 대한 핸들러를 생성하도록 한다.
  • 핸들러의 라우트 경로는 컨트롤러 선언된 접두사(선택 사항)와 메소드 데코레이터에 지정된 경로를 연결한다.
@Controller('user') // 메소드 데코레이터에 지정된 경로 'user'
export class UserController // 컨트롤러에 선언된 접두사 'user'
  • @Get() 데코레이터에 경로를 추가하지 않았으므로 위 코드는 GET /user 요청에 핸들러에 매핑한다.
  • @Post('/add') 데코레이터를 추가하면 POST /user/add 요청에 대한 라우트 매핑을 생성한다.

Provider

  • 모듈 안에 프로바이더 객체로 정의하고 등록하면 모듈 안에서 사용할 수 있다.
  • 서로 다른 모듈을 import해서 그 안에 필요한 프로바이더 객체를 사용할 수도 있다.
  • Nest의 클래스인 서비스, 리포지토리, 팩토리, 헬퍼 등은 프로바이더이다.
  • Nest에서 프로바이더 객체를 인스턴스화 하고 필요할 때 인스턴스를 주입시킨다.

Service

  • @Injectable() 데코레이터를 사용하는 클래스이다.
  • 서비스 인스턴스는 @Injectable() 데코레이터로 인해 애플리케이션 전체에서 사용될 수 있다.
  • 컨트롤러에서 데이터의 유효성을 체크하거나 데이터베이스에 아이템을 생성하는 등의 로직을 처리한다.

예시 코드

user.controller.ts

import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('user')
export class UserController {
  constructor(private userService: UserService) {} // Dependency Injection
  
  @Get()
  findAllUsers(): string {
    return this.userService.findAllUsers();
  }
}
  • Dependency Injection은 클래스의 Constructor()에서 이루어진다.

user.service.ts

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

@Injectable()
export class UserSercvice {
  findAllUsers(): string {
    return 'this action returns all users';
  }
}

user.module.ts

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';

@Module({
  controllers: [UserController],
  providers: [UserService],
})
export class AppModule {}
  • 프로바이더를 사용하기 위해서 module 파일에 사용하고자 하는 프로바이더를 넣는다.

참고사이트

Nest 공식 사이트
당근마켓 - TypeScript를 활용한 서비스개발
인프런 - 따라하며 배우는 Nest.JS

0개의 댓글