NestJS에는 여러가지 데코레이터가 존재한다. @Body(), @Param()등 특정 요청에 대한 값에 대해 접근할 수 있다.
위와 같은 데코레이터들을 커스텀하여 사용할 수 있다.
Custom Decorator
Custom Decorator를 사용하면 request 또는 response에 대해 custom 하여 내가 원하는데로 만들어 줌으로써 재사용이 가능하고 요구사항이 맞는 곳이면 어디에서나 간단하게 사용가능 하다.
예를들어 request.user를 받아오는 데코레이터를 만들어보자.
// src/common/decorator/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;
},
);
이렇게 request.user를 받아오는 Custom decorator를 만들어주면
@Get()
async findOne(@Req() req) {
return req.user
}
이렇게 request를 직접 받아서 사용하던 코드를
@Get()
async findOne(@User() user: UserEntity) {
return user;
}
이렇게 사용할 수 있게 된다. 또한 request를 받아서 사용할 때 type 추론을 하지 못하는 것에 반해 Custom decorator를 사용함으로써 type 추론까지 가능해진다.