TIL

24/01/01 TIL __ createParamDecorator() 에 대해서.

GABOJOK 2024. 1. 1. 23:58

 

 

 

나는 createParamDecorator() 이 내장 함수를 이용해서 req.user에 유저 정보를 담아 활용했다.

그런데 막상 이함수가 어떤 방식으로 동작하는지 이해를 하지 못했다.

 

이부분에 대해 오늘은 적어보려고 한다. 

 

 

userInfo.decorator.ts파일

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

export const UserInfo = createParamDecorator(
  (data: unknown, ctx: ExecutionContext) => {
    console.log('data', data);
    console.log('ctx', ctx);

    const request = ctx.switchToHttp().getRequest();
    console.log('request.user==>>>', request.user);
    return request.user ? request.user : null;
  },
);

 

 

 

ticket.service.ts 파일

@UseGuards(AuthGuard('jwt'))
@Controller('ticket')
export class TicketController {
  constructor(private readonly ticketService: TicketService) {}

  //티켓 예매하기
  @Post(':id')
  async reservation(
    @UserInfo() user: Customer,
    @Param('id') id: number,
    @Body() reservationDto: ReservationDto,
  ): Promise<Ticket> {
    console.log('test__user', user);
    return await this.ticketService.reservation(user, id, reservationDto);
  }

 

 

나의 경우 이런 형식으로 호출해서 사용하고 있었다. 

 

그런데 문득 의문이 들었다. 

 

@UserInfo()는  createParamDecorator() 함수를 호출한다.

createParamDecorator() 함수는 파라미터를 2개 가지고 있다. (data, ctx)

@UserInfo() 함수를 호출할때 안에 어떤 매개변수도 넣지 않았는데 이 함수가 정상적으로 작동한다...???

게다가  createParamDecorator(data, ctx) 여기서 이 두개의 파라미터는 어디서 정보를 받아서 작동하는 건지 궁금했다.

 

하나씩 테스트를 해보며 정보를 찾아보기 시작했다. 

 

 

 createParamDecorator() 에 대해 찾아보니 NestJS에서 커스텀 데코레이터를 생성하는 함수 라고 했다.

 

일단 콘솔로 ctx와 data를 찍어봤다.

userInfo.decorator.ts파일 안에서 말이다. 

 

그 결과 data는 결과가 undefined 이 나왔고, ctx는 제대로 출력이 되었다. (실행 컨텍스트 로 이해하고 있다. )

 

찾아보니 createParamDecorator() 함수는 nestjs에서 제공하는 함수이기 때문에 매개변수를 전달하지 않아도 함수 실행에 문제가 없으며, ctx인자는 nestjs 내부 에서 가져온다고 한다.  그래서 전달하지 않아도 작동에 이상이 없었던 것!!! 

data에는 때때로 값이 변경되기도 하는데 이런 경우이다. 

 

 

ticket.service.ts 파일

@UseGuards(AuthGuard('jwt'))
@Controller('ticket')
export class TicketController {
  constructor(private readonly ticketService: TicketService) {}

  //티켓 예매하기
  @Post(':id')
  async reservation(
    @UserInfo('name') name: String,
    @Param('id') id: number,
    @Body() reservationDto: ReservationDto,
  ): Promise<Ticket> {
    console.log('test__user', user);
    return await this.ticketService.reservation(user, id, reservationDto);
  }

 

 

 

이렇게 하면 console.log(data)의 결과로 name이 찍힌다. 

 

 

 

 

 

https://medium.com/@hameezrizwan/custom-decorator-in-nestjs-f8cecaad0f7a

 

Custom Decorator in NestJs

While I was working with NestJS, I came across the neat concept of custom decorators, and let me tell you, they’re a game-changer. Think of…

medium.com