Nest는 데코레이터 라는 언어 기능을 중심으로 구축되었습니다 . 데코레이터는 일반적으로 사용되는 많은 프로그래밍 언어에서 잘 알려진 개념이지만 JavaScript 세계에서는 여전히 비교적 새로운 개념입니다. 데코레이터의 작동 방식을 더 잘 이해하려면 이 기사를 읽는 것이 좋습니다 . 다음은 간단한 정의입니다.

ES2016 데코레이터는 함수를 반환하고 대상, 이름 및 속성 설명자를 인수로 사용할 수있는 표현식입니다. 함수 또는 클래스 앞에 @문자를 붙이고 데코레이션 하려는 항목의 맨 위에 배치 하여 적용합니다 . 데코레이터는 클래스, 메서드 또는 속성을 정의 할 수 있습니다.

Param 데코레이터

Nest는 HTTP 라우트 핸들러와 함께 사용할 수있는 유용한 매개 변수 데코레이터 세트를 제공 합니다. 아래는 제공된 데코레이터와 그에 대응되는 일반 Express (또는 Fastify) 객체 목록입니다.

Param

추가적으로 자신만의 커스텀 데코레이터 또한 만들 수 있습니다. 왜 이것을 사용할까요?

Node.js 세계에서는 요청 객체에 속성을 넣는 것이 일반적입니다. 그런 다음 아래와 같은 코드처럼 다시 하번 값을 꺼내옵니다.

const user = req.user;

@User 데코레이터를 만들면 읽기 쉽고 깨끗한 코드를 만들 수 있고, 모든 컨트롤러에서 재사용할 수 있습니다.

user.decorator.ts

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);

위와 같은 코드를 작성한 다음, 해당 데코레이터와 요구사항이 맞는 모든 곳에서 간단하게 사용이 가능합니다.

@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}

Passing data

데코레이터의 동작이 일부 조건에 따라 달라지는 경우 data매개 변수를 사용 하여 데코레이터의 팩토리 함수에 인수를 전달할 수 있습니다 . 이에 대한 한 가지 사용 사례는 키별로 요청 객체에서 속성을 추출하는 사용자 지정 데코레이터입니다. 예를 들어 인증 계층이 요청의 유효성을 검사하고 사용자 엔터티를 요청 객체에 연결 한다고 가정 해 보겠습니다 . 인증 된 요청에 대한 사용자 엔티티는 다음과 같습니다.

{
  "id": 101,
  "firstName": "Alan",
  "lastName": "Turing",
  "email": "[email protected]",
  "roles": ["admin"]
}

속성 이름을 키로 사용하고 관련 값이있는 경우 (또는 존재하지 않거나 user객체가 생성 되지 않은 경우나 정의되지 않은 경우) 반환하는 데코레이터를 정의 해 보겠습니다.

user.decorator.tsJs

import { createParamDecorator, ExecutionContext } from '@nestjs/common';

export const User = createParamDecorator(
  (data: string, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    const user = request.user;

    return data ? user && user[data] : user;
  },
);