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;
},
);
//그냥 쓸 때
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;
},
);
@Get()
async findOne(@User() user: UserEntity) {
console.log(user);
}
위의 User Decorator를 사용하면, REST API를 세팅할 때 클라이언트에서 유저 아이디를 별도의 Param으로 담아 보낼 필요가 없다!
아울러서 NestJS 공식문서에서 추천한 아티클을 읽어보았는데, 데코레이터에 대한 개념을 잡는데 나름 도움이 되었다. 개인적으로는 데코레이터에 대한 설명도 설명이지만, 필자가 서두에 "자바스크립트와 파이썬의 유사성이 시간이 지남에 따라 증가하고 있다"고 이야기 하는 부분이 굉장히 인상깊었다. 이것도 일종의 수렴진화인가?하는 생각도 들고, 프로그래밍 언어의 발전 방향에 있어서 프로그래밍 언어간 차이가 향후에는 오히려 더 희미해질지도 모르겠다는 생각도 든다.