NestJS Custom decorators

Outclass·2022년 7월 20일
0

NestJS+GraphQL+TypeORM 

목록 보기
9/16

Nest에서는 @이렇게 생긴 문자가 맨 앞에오는 'Decorator'가 아주 많이 사용되는데, HTTP route handlers와 함께 주로 사용된다.

Nest provides a set of useful param decorators that you can use together with the HTTP route handlers. - Nest 공식문서

하지만 제공되는 Decorator외에도, 커스텀하게 직접 Decorator를 만들어서 사용할 수 있다!

데코레이터 만들기

아래 예제는 함수의 Param에 사용되는 Param Decorator를 만드는 예제입니다.

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

export const User = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    const request = ctx.switchToHttp().getRequest();
    return request.user;
  },
);
  • createParamDecorator로 param decorator를 생성한다.
  • context에 접근할 수 있다.
//그냥 쓸 때 
export const AuthUser = createParamDecorator(
  (data: unknown, context: ExecutionContext) => {
    const user = context.switchToHttp().getRequest()['user'];
    return user;
  },
);

//graphQL에서 사용할 때
export const AuthUser = createParamDecorator(
  (data: unknown, context: ExecutionContext) => {
    const getContext = GqlExecutionContext.create(context).getContext();
    const user = getContext['user'];
    return user;
  },
);
  • Guard에서와 동일하게, GqlExecutionContext를 통해 GraphQL context에 접근할 수 있다.

데코레이터 적용하기

@Get()
async findOne(@User() user: UserEntity) {
  console.log(user);
}
  • @User는 request.user를 리턴하고, 해당 값을 user에 담아 사용한다.

매우 좋은 점

위의 User Decorator를 사용하면, REST API를 세팅할 때 클라이언트에서 유저 아이디를 별도의 Param으로 담아 보낼 필요가 없다!

Param Decorator가 아닌 경우

NestJS Metadata 아티클 참조

읽을거리 x 여담

아울러서 NestJS 공식문서에서 추천한 아티클을 읽어보았는데, 데코레이터에 대한 개념을 잡는데 나름 도움이 되었다. 개인적으로는 데코레이터에 대한 설명도 설명이지만, 필자가 서두에 "자바스크립트와 파이썬의 유사성이 시간이 지남에 따라 증가하고 있다"고 이야기 하는 부분이 굉장히 인상깊었다. 이것도 일종의 수렴진화인가?하는 생각도 들고, 프로그래밍 언어의 발전 방향에 있어서 프로그래밍 언어간 차이가 향후에는 오히려 더 희미해질지도 모르겠다는 생각도 든다.

profile
When you stop having big dreams that’s when you’ve died, despite not being buried yet.

0개의 댓글