Skip to main content

Nest JS

2020-12-29#

List#

  • Nest JS Introduce

NestJs#

소개#

Nest (NestJS)는 효율적이고 확장 가능한 Node.js 서버 측 애플리케이션 을 구축하기위한 프레임 워크입니다 . Progressive JavaScript를 사용하고 TypeScript로 빌드되고 완전히 지원 되며 (하지만 여전히 개발자가 순수 JavaScript로 코딩 할 수 있음) OOP (Object Oriented Programming), FP (Functional Programming) 및 FRP (Functional Reactive Programming) 요소를 결합합니다.

내부적으로 Nest는 Express (기본값)와 같은 강력한 HTTP 서버 프레임 워크 를 사용하며 선택적으로 Fastify 를 사용하도록 구성도 가능하다.

Nest는 이러한 공통 Node.js 프레임 워크 (Express / Fastify) 위에 추상화 수준을 제공하지만 API를 개발자에게 직접 제공한다. 이를 통해 개발자는 기본 플랫폼에서 사용할 수있는 수많은 타사 모듈을 자유롭게 사용할 수 있습니다.

2020-01-05#

List#

  • Nest JS Install
  • Nest JS 기본 구조
  • Nest JS Controller 맛보기

NestJs Install#

NestJs Install Docs

Nest CLI#

처음 사용하는 사용자에게 추천방법

npm i -g @nestjs/cli
nest new project-name

Git Clone#

git clone https://github.com/nestjs/typescript-starter.git project
cd project
npm install
npm run start

Npm Install#

npm i --save @nestjs/core @nestjs/common rxjs reflect-metadata

NestJs 구조#

NestJs First Steps Docs

  • src
    • app.controller.ts
    • app.controller.spec.ts
    • app.module.ts
    • app.service.ts
    • main.ts
파일설명
app.controller.ts컨트롤러로 단일 라우터 역할
app.controller.spec.ts컨트롤러의 단위 테스트
app.module.ts어플리케이션의 루트 모듈
app.service.ts서비스로 단일 매서드 역할
main.tsNest 애플리케이션 인스턴스를 생성하기 위해 핵심 기능 NestFactory를 사용하는 애플리케이션의 메인을 담당

Controller#

컨트롤러는 들어오는 요청을 처리 하고 클라이언트에 응답 을 반환

2020-01-12#

List#

  • isnomnia
  • Nest JS Controller Create With Nest CLI
  • Nest JS HTTP Method
  • Nest JS Request Object Use

isnomnia#

isnomnia Core 설치

Nest JS CLI#

직접 파일을 생성하고 import를 선언해도 되지만 Nest CLI 명령어를 사용

nest g co movies

Nest JS Routing

Nest JS Request Object#

DecoratorValue
@Request(), @Req()req
@Response(), @Res()*res
@Next()next
@Session()req.session
@Param(key?: string)req.params / req.params[key]
@Body(key?: string)req.body / req.body[key]
@Query(key?: string)req.query / req.query[key]
@Headers(name?: string)req.headers / req.headers[name]
@Ip()req.ip
@HostParam()req.hosts

Movie Controller#

import {
Body,
Controller,
Delete,
Get,
Param,
Patch,
Post,
Put,
Query,
} from '@nestjs/common';
@Controller('movies')
export class MoviesController {
// Get, Post, Put, Patch, Delete
@Get()
getAll() {
return `Get All Movies`;
}
@Get('search')
search(@Query('year') searchYear: string) {
return `Get Movie After ${searchYear}`;
}
@Get(':id')
getOne(@Param('id') movieId: string) {
return `Get One Movie id: ${movieId}`;
}
@Post()
create(@Body() movieData) {
return movieData;
}
@Put(':id')
modify(@Param('id') movieId: string) {
return `Modify Movie id: ${movieId}`;
}
@Patch(':id')
update(@Param('id') movieId: string) {
return `Update Movie id: ${movieId}`;
}
@Delete(':id')
remove(@Param('id') movieId: string) {
return `Rmove Movie id: ${movieId}`;
}
}

2020-01-19#

List#

  • Nest JS CLI Service
  • Nest JS 기본 구조
  • Nest JS HTTP Exception
  • Nest JS Pipe

Nest JS CLI#

직접 파일을 생성하고 import를 선언해도 되지만 Nest CLI 명령어를 사용

nest g s movies

Nest JS Providers#

Nest Js Providers Docs

C ontroller 에서는 HTTP요청을 처리하고 더 복잡한 작업은 Providers에 위임한다. Controller 와 다른점은 @Injectable() 데코레이터를 사용한다. 여기서 Nest는 일반적으로 Dependency Injection 디자인 패턴을 기반으로 구축한다.

Dependency Injection ?

Nest JS 구조#

Nest JS 구조

Movies Code#

Movies.Controller.ts

Movies.Service.ts

Nest JS Pipe#

ValidationPipe는 클래스 유효성 검사기 패키지와 선언적 검증을 통해 특정 규칙이 정해져 있는 각 모듈, 클래스, DTO 선언된 모든 수신 클라이언트 페이로드에 대한 유효성 검사 규칙을 적용 할 수있는 편리한 방법을 제공한다.

Nest JS Pipe Techniques

  • ValidationPipe
  • ParseIntPipe
  • ParseBoolPipe
  • ParseArrayPipe
  • ParseUUIDPipe
  • DefaultValuePipe

Nest JS Pipe 에서는 내부적으로 class-validator, class-transformer 라이브러리를 사용중이다. 각 속성들에 선언된 타입에대해 유효성 검사를 하기위해 사용해보자

npm i class-validator class-transformer

TS class-validator

TS class-transformer

main.ts

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // Validator 이전에 데코레이터에 없는 Property 는 제한
})
);
await app.listen(3000);
}
bootstrap();

2020-01-26#

List#

  • Nest JS Transform
  • Nest JS Module Import
  • Why Controller, Service
  • Depedency Injection?

Nest JS Transform#

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(
new ValidationPipe({
whitelist: true, // 데코레이터에 없는 속성값은 제외 후 저장
forbidNonWhitelisted: true, // 데코레이터에 없는 속성이 있을경우 Exception
transform: true, // url 인자를 타입에 맞게 자동변환
})
);
await app.listen(3000);
}
bootstrap();

PartialType#

Nest JS PartialType

Nest JS Module Import#

Nest JS Module

Why Controller, Service#

컴포넌트는 화면을 구성하는 뷰(View)를 생성하고 관리하는 것이 주된 역할.

  • 컴포넌트를 작성하다 보면 컴포넌트 내에 컴포넌트의 주 관심사 이외의 부가적인 기능(예를 들어 로깅 기능, 서버 통신 기능 등)이 필요하게 됨.
  • 이때 컴포넌트의 주 관심사 이외의 부가적 기능을 컴포넌트 내에 작성하면 부가적 기능이 변경되었을 때 컴포넌트 또한 변경되어야 하며 재사용이 어려워짐
  • 자신의 관심사에 집중하는 독립성이 보장된 코드의 작성이 어려워지면 코드가 중복되어 재사용성이 낮아지고 복잡도는 높아짐

이러한 경우, 컴포넌트의 관심사와 애플리케이션 전역의 관심사를 분리하는 것이 필요한데 이때 사용하는 것이 서비스이다.

서비스는 어플리케이션 전역의 관심사를 분리하여 구성요소마다 공통 관심사를 작성한다.

  • 애플리케이션 전역의 관심사를 서비스로 분리하여 외부에서 관리할 수 있다면 컴포넌트는 자신의 관심사에 집중할 수 있어 복잡도가 낮아지고 서비스는 재사용이 가능하게 되어 일관된 애플리케이션 코드를 작성할 수 있다.

Nest JS를 구성하면서 구조를 생각해보면..#

Controller#

  • Controller는 요청과 응답만을 처리하는 주 역할로 분리

Service#

  • 핵심 업무 기능 및 부가적인 기능을 각 구성요소마다 분리

Interface#

  • 사용자 측에서 요청할 수 있는 데이터 타입&모델 정의

DTO#

  • 실제 데이터베이스와 연결되는 필드와 타입&모델 정의

Depedency Injection#

// A와 B는 의존 관계이다. A가 B에 의존하고 있다.
class A {
dependency: B;
constructor() {
// 의존성 인스턴스의 생성
this.dependency = new B();
}
foo() {
this.dependency.bar();
}
}
class B {
bar() {
console.log('bar');
}
}
const a = new A();
a.foo();
  • 위 코드의 A는 B에 의존중임
  • A가 B에 의존하는 의존 관계에 있을 때, B의 기능이 변경되면 A는 영향을 받음
  • A가 B의 메소드를 사용한다면 B의 메소드 형식이 변경되었을 때 A도 수정되어야 함
  • A의 constructor에서 B를 직접 생성하고 있기 B의 인스턴스의 생성 방법을 알고 있어야 함
class A {
// 의존성 인스턴스를 직접 생성하지 않고 외부 환경에 요구한다.
constructor(private dependency: B) {}
foo() {
this.dependency.bar();
}
}
class B {
bar() {
console.log('bar');
}
}
/*
A의 외부 환경에서 의존성 인스턴스를 주입한다.
이때 의존성 인스턴스의 생성 방법을 알아야 한다.
*/
const a = new A(new B());
a.foo();
  • 의존성 인스턴스를 사용하는 코드는 인스턴스를 생성하는 방법을 알 필요가 없어짐
  • 의존성이 변경된다 하더라도 인스턴스를 전달하는 외부 환경이 변경된 의존성의 인스턴스를 전달하기만 한다면 코드의 수정없이 변경된 의존성 인스턴스를 사용할 수 있다
  • 이것은 의존 관계에 있는 두 개의 객체가 서로 상호 작용을 하기는 하지만 서로에 대해 잘 알지 못한다는 것을 의미하며 서로에게 주는 영향을 최소화하여 변경에 유연하게 대처할 수 있는 가능성을 확보할 수 있다

의존성 주입은 의존 관계를 전환하기 위해 구성 요소 간의 의존 관계를 코드 내부가 아닌 외부의 설정 등을 통해 정의하는 디자인 패턴 중의 하나로서 구성 요소 간 결합도를 낮추고 재사용성을 높인다

단점#

  • 의존성 주입을 위한 선행작업이 필요함.
  • 코드를 추적하고 읽기가 어려워짐.

참고자료 PoiemaWeb

Nest JS Depedency Injection Pattern#

Nest JS는 의존성 주입을 프레임워크 차원에서 지원한다. 애플리케이션이 직접 인스턴스를 생성하는 것이 아니라 Nest JS 프레임워크에게 의존성 인스턴스를 요구하고 프레임워크가 생성한 인스턴스를 전달받아 사용하게 되는 것